gaoluyang
3 天以前 8c65f898ed6e5b0c7a94c792c4562f6ec831dccd
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
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);
    }
}