package cn.iocoder.yudao.module.mes.service.wm.productsales;
|
|
import cn.iocoder.yudao.framework.common.exception.ServiceException;
|
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
|
import cn.iocoder.yudao.module.erp.api.sale.ErpSaleOrderApi;
|
import cn.iocoder.yudao.module.erp.api.sale.dto.ErpSaleOrderItemRespDTO;
|
import cn.iocoder.yudao.module.mes.dal.dataobject.wm.batch.MesWmBatchDO;
|
import cn.iocoder.yudao.module.mes.dal.dataobject.wm.productsales.MesWmProductSalesLineDO;
|
import cn.iocoder.yudao.module.mes.service.wm.batch.MesWmBatchService;
|
import org.junit.jupiter.api.Test;
|
import org.junit.jupiter.api.extension.ExtendWith;
|
import org.mockito.InjectMocks;
|
import org.mockito.Mock;
|
import org.mockito.junit.jupiter.MockitoExtension;
|
|
import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.WM_PRODUCT_SALES_REEL_MISMATCH;
|
import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.WM_PRODUCT_SALES_REEL_SOURCE_MISSING;
|
import static org.junit.jupiter.api.Assertions.*;
|
import static org.mockito.Mockito.*;
|
|
@ExtendWith(MockitoExtension.class)
|
class MesWmSalesReelGuardTest {
|
@InjectMocks private MesWmSalesReelGuard guard;
|
@Mock private ErpSaleOrderApi saleOrderApi;
|
@Mock private MesWmBatchService batchService;
|
|
@Test
|
void acceptsOnlyMatchingTracedInventory() {
|
var line = new MesWmProductSalesLineDO().setSaleOrderItemId(10L);
|
var item = new ErpSaleOrderItemRespDTO();
|
item.setReelNo("PAN-1");
|
when(saleOrderApi.getSaleOrderItem(10L)).thenReturn(CommonResult.success(item));
|
when(batchService.getBatch(20L)).thenReturn(new MesWmBatchDO().setReelNo("PAN-1"));
|
when(batchService.getBatch(21L)).thenReturn(new MesWmBatchDO().setReelNo("PAN-2"));
|
|
assertDoesNotThrow(() -> guard.validate(line, 20L));
|
ServiceException wrong = assertThrows(ServiceException.class, () -> guard.validate(line, 21L));
|
assertEquals(WM_PRODUCT_SALES_REEL_MISMATCH.getCode(), wrong.getCode());
|
assertThrows(ServiceException.class, () -> guard.validate(line, null));
|
}
|
|
@Test
|
void preservesLegacyWithoutSalesItem() {
|
assertDoesNotThrow(() -> guard.validate(new MesWmProductSalesLineDO(), null));
|
verifyNoInteractions(saleOrderApi, batchService);
|
}
|
|
@Test
|
void rejectsMissingReferencedSalesItem() {
|
when(saleOrderApi.getSaleOrderItem(10L)).thenReturn(CommonResult.success(null));
|
ServiceException ex = assertThrows(ServiceException.class,
|
() -> guard.validate(new MesWmProductSalesLineDO().setSaleOrderItemId(10L), 20L));
|
assertEquals(WM_PRODUCT_SALES_REEL_SOURCE_MISSING.getCode(), ex.getCode());
|
verifyNoInteractions(batchService);
|
}
|
}
|