云
4 天以前 f02d0df2f1dfc7a8b775cf50d45375e57628a5ef
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
package cn.iocoder.yudao.module.mes.service.qc.ncr;
 
import cn.iocoder.yudao.framework.common.exception.ServiceException;
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import cn.iocoder.yudao.module.mdm.api.item.MdmItemApi;
import cn.iocoder.yudao.module.mes.controller.admin.qc.ncr.vo.MesQcNcrDisposeReqVO;
import cn.iocoder.yudao.module.mes.controller.admin.qc.ncr.vo.MesQcNcrSaveReqVO;
import cn.iocoder.yudao.module.mes.dal.dataobject.qc.ncr.MesQcNcrDO;
import cn.iocoder.yudao.module.mes.dal.mysql.qc.ncr.MesQcNcrMapper;
import cn.iocoder.yudao.module.mes.enums.qc.MesNcrStatusEnum;
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 java.math.BigDecimal;
 
import static org.junit.jupiter.api.Assertions.assertThrows;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.*;
 
@ExtendWith(MockitoExtension.class)
class MesQcNcrGuardTest {
    @Mock private MesQcNcrMapper mapper;
    @Mock private MdmItemApi mdmItemApi;
    @InjectMocks private MesQcNcrServiceImpl service;
 
    private MesQcNcrDO sourceNcr() {
        return new MesQcNcrDO().setId(1L).setCode("NCR-1").setQcId(2L)
                .setItemId(3L).setUnqualifiedQuantity(new BigDecimal("10"))
                .setStatus(MesNcrStatusEnum.PENDING_REVIEW.getStatus());
    }
 
    private MesQcNcrSaveReqVO request(Long itemId, String quantity) {
        var req = new MesQcNcrSaveReqVO();
        req.setId(1L);
        req.setCode("NCR-1");
        req.setItemId(itemId);
        req.setUnqualifiedQuantity(new BigDecimal(quantity));
        return req;
    }
 
    @Test
    void rejectsChangingMaterialOrQuantityOfSourceInspection() {
        when(mapper.selectByIdForUpdate(1L)).thenReturn(sourceNcr());
        assertThrows(ServiceException.class, () -> service.updateNcr(request(4L, "10")));
        assertThrows(ServiceException.class, () -> service.updateNcr(request(3L, "11")));
        verify(mapper, times(2)).selectByIdForUpdate(1L);
        verify(mapper, never()).updateById(any(MesQcNcrDO.class));
    }
 
    @Test
    void rejectsDeletingSourceInspectionNcr() {
        when(mapper.selectByIdForUpdate(1L)).thenReturn(sourceNcr());
        assertThrows(ServiceException.class, () -> service.deleteNcr(1L));
        verify(mapper, never()).deleteById(any(Long.class));
    }
 
    @Test
    void acceptsEquivalentQuantityWithDifferentDecimalScale() {
        when(mapper.selectByIdForUpdate(1L)).thenReturn(sourceNcr());
        when(mdmItemApi.getItem(3L)).thenReturn(CommonResult.success(null));
        service.updateNcr(request(3L, "10.00"));
        verify(mapper).updateById(any(MesQcNcrDO.class));
    }
 
    @Test
    void repeatedDispositionChecksLockedCurrentStatusBeforeCreatingDocuments() {
        var disposed = sourceNcr().setStatus(MesNcrStatusEnum.DISPOSED.getStatus());
        when(mapper.selectByIdForUpdate(1L)).thenReturn(disposed);
        var req = new MesQcNcrDisposeReqVO();
        req.setId(1L);
        req.setDisposition(2);
        assertThrows(ServiceException.class, () -> service.disposeNcr(req));
        verify(mapper).selectByIdForUpdate(1L);
        verify(mapper, never()).updateById(any(MesQcNcrDO.class));
    }
}