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));
|
}
|
}
|