package cn.iocoder.yudao.module.mes.service.wm.returnvendor;
|
|
import cn.iocoder.yudao.module.bpm.api.task.BpmProcessInstanceApi;
|
import cn.iocoder.yudao.module.mes.dal.dataobject.wm.returnvendor.MesWmReturnVendorDO;
|
import cn.iocoder.yudao.module.mes.dal.dataobject.wm.returnvendor.MesWmReturnVendorLineDO;
|
import cn.iocoder.yudao.module.mes.dal.dataobject.wm.returnvendor.MesWmReturnVendorDetailDO;
|
import cn.iocoder.yudao.module.mes.dal.mysql.wm.returnvendor.MesWmReturnVendorMapper;
|
import cn.iocoder.yudao.module.system.api.storage.StorageAttachmentApi;
|
import org.junit.jupiter.api.BeforeEach;
|
import org.junit.jupiter.api.Test;
|
import org.junit.jupiter.api.extension.ExtendWith;
|
import org.mockito.Mock;
|
import org.mockito.junit.jupiter.MockitoExtension;
|
import org.springframework.test.util.ReflectionTestUtils;
|
|
import java.util.List;
|
import java.math.BigDecimal;
|
|
import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertServiceException;
|
import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.*;
|
import static org.mockito.Mockito.*;
|
|
@ExtendWith(MockitoExtension.class)
|
class MesWmReturnVendorApprovalTest {
|
|
private final MesWmReturnVendorServiceImpl service = new MesWmReturnVendorServiceImpl();
|
@Mock private MesWmReturnVendorMapper mapper;
|
@Mock private MesWmReturnVendorLineService lineService;
|
@Mock private MesWmReturnVendorDetailService detailService;
|
@Mock private StorageAttachmentApi attachmentApi;
|
@Mock private BpmProcessInstanceApi processInstanceApi;
|
|
@BeforeEach
|
void setUp() {
|
ReflectionTestUtils.setField(service, "returnVendorMapper", mapper);
|
ReflectionTestUtils.setField(service, "returnVendorLineService", lineService);
|
ReflectionTestUtils.setField(service, "returnVendorDetailService", detailService);
|
ReflectionTestUtils.setField(service, "storageAttachmentApi", attachmentApi);
|
ReflectionTestUtils.setField(service, "processInstanceApi", processInstanceApi);
|
}
|
|
@Test
|
void ordinarySubmitStillRequiresAttachment() {
|
when(mapper.selectById(8L)).thenReturn(order(0, null, null));
|
when(lineService.getReturnVendorLineListByReturnId(8L)).thenReturn(List.of(new MesWmReturnVendorLineDO()));
|
assertServiceException(() -> service.submitReturnVendor(8L), WM_RETURN_VENDOR_ATTACHMENT_REQUIRED, "TEST-8");
|
verify(mapper, never()).updateById(any(MesWmReturnVendorDO.class));
|
}
|
|
@Test
|
void arbitraryProcessKeyIsRejected() {
|
assertServiceException(() -> service.submitReturnVendorApproval(8L, "other_process"),
|
WM_RETURN_VENDOR_APPROVAL_PROCESS_INVALID, "purchase_return_vendor_approve");
|
verifyNoInteractions(mapper);
|
}
|
|
@Test
|
void legacyBypassCannotStockOrFinish() {
|
when(mapper.selectById(8L)).thenReturn(order(2, null, null), order(3, null, null));
|
assertServiceException(() -> service.stockReturnVendor(8L), WM_RETURN_VENDOR_APPROVAL_REQUIRED, "TEST-8");
|
assertServiceException(() -> service.finishReturnVendor(8L), WM_RETURN_VENDOR_APPROVAL_REQUIRED, "TEST-8");
|
verify(mapper, never()).updateById(any(MesWmReturnVendorDO.class));
|
}
|
|
@Test
|
void approvedProcessCanStock() {
|
when(mapper.selectById(9L)).thenReturn(order(2, "purchase_return_vendor_approve", "process-1"));
|
service.stockReturnVendor(9L);
|
verify(mapper).updateById(argThat((MesWmReturnVendorDO value) -> value.getStatus() == 3));
|
}
|
|
@Test
|
void runningApprovalIsCanceledBeforeOrder() {
|
when(mapper.selectById(8L)).thenReturn(order(1, "purchase_return_vendor_approve", "process-1"));
|
service.cancelReturnVendor(8L);
|
var sequence = inOrder(processInstanceApi, mapper);
|
sequence.verify(processInstanceApi).cancelProcessInstanceByStartUser(null, "process-1", "供应商退货单取消");
|
sequence.verify(mapper).updateById(argThat((MesWmReturnVendorDO value) -> value.getStatus() == 5));
|
}
|
|
@Test
|
void failedProcessCancelKeepsOrderRunning() {
|
when(mapper.selectById(8L)).thenReturn(order(1, "purchase_return_vendor_approve", "process-1"));
|
doThrow(new IllegalStateException("cancel rejected")).when(processInstanceApi)
|
.cancelProcessInstanceByStartUser(null, "process-1", "供应商退货单取消");
|
org.junit.jupiter.api.Assertions.assertThrows(IllegalStateException.class, () -> service.cancelReturnVendor(8L));
|
verify(mapper, never()).updateById(any(MesWmReturnVendorDO.class));
|
}
|
|
@Test
|
void mismatchedPickedQuantityCannotSubmitOrStock() {
|
when(mapper.selectById(8L)).thenReturn(order(0, null, null),
|
order(2, "purchase_return_vendor_approve", "process-1"));
|
when(lineService.getReturnVendorLineListByReturnId(8L)).thenReturn(List.of(
|
new MesWmReturnVendorLineDO().setId(10L).setQuantity(BigDecimal.valueOf(3))));
|
when(detailService.getReturnVendorDetailListByReturnId(8L)).thenReturn(List.of(
|
new MesWmReturnVendorDetailDO().setQuantity(BigDecimal.valueOf(2))));
|
when(detailService.getReturnVendorDetailListByLineId(10L)).thenReturn(List.of(
|
new MesWmReturnVendorDetailDO().setQuantity(BigDecimal.valueOf(2))));
|
assertServiceException(() -> service.submitReturnVendor(8L), WM_RETURN_VENDOR_DETAIL_QUANTITY_MISMATCH);
|
assertServiceException(() -> service.stockReturnVendor(8L), WM_RETURN_VENDOR_DETAIL_QUANTITY_MISMATCH);
|
verify(mapper, never()).updateById(any(MesWmReturnVendorDO.class));
|
}
|
|
private MesWmReturnVendorDO order(int status, String key, String instanceId) {
|
return new MesWmReturnVendorDO().setId(8L).setCode("TEST-8").setStatus(status)
|
.setProcessDefinitionKey(key).setProcessInstanceId(instanceId);
|
}
|
}
|