| | |
| | | package cn.iocoder.yudao.module.mes.service.qc.seedquality; |
| | | |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.qc.seedquality.MesQcSeedQualityDO; |
| | | import cn.iocoder.yudao.module.mes.controller.admin.qc.seedquality.vo.MesQcSeedQualityRetestReqVO; |
| | | import cn.iocoder.yudao.module.mes.controller.admin.qc.seedquality.vo.MesQcSeedQualityBatchRetestReqVO; |
| | | import cn.iocoder.yudao.module.mes.dal.mysql.qc.seedquality.MesQcSeedQualityActionMapper; |
| | | import cn.iocoder.yudao.module.mes.dal.mysql.qc.seedquality.MesQcSeedQualityMapper; |
| | | import cn.iocoder.yudao.module.mes.service.qc.approver.MesQcApproverService; |
| | | import cn.iocoder.yudao.module.mes.service.wm.transaction.MesWmTransactionService; |
| | | import org.junit.jupiter.api.BeforeEach; |
| | | import org.junit.jupiter.api.Test; |
| | | import org.mockito.ArgumentCaptor; |
| | | import org.springframework.test.util.ReflectionTestUtils; |
| | | import java.util.List; |
| | | |
| | | import static org.junit.jupiter.api.Assertions.*; |
| | | import static org.mockito.Mockito.*; |
| | |
| | | private final MesQcSeedQualityMapper qualityMapper = mock(MesQcSeedQualityMapper.class); |
| | | private final MesQcSeedQualityActionMapper actionMapper = mock(MesQcSeedQualityActionMapper.class); |
| | | private final MesWmTransactionService transactionService = mock(MesWmTransactionService.class); |
| | | private final MesQcApproverService approverService = mock(MesQcApproverService.class); |
| | | |
| | | @BeforeEach |
| | | void setUp() { |
| | | ReflectionTestUtils.setField(service, "qualityMapper", qualityMapper); |
| | | ReflectionTestUtils.setField(service, "actionMapper", actionMapper); |
| | | ReflectionTestUtils.setField(service, "wmTransactionService", transactionService); |
| | | ReflectionTestUtils.setField(service, "approverService", approverService); |
| | | } |
| | | |
| | | @Test |
| | | void failedRetestNeedsBothApprovalsBeforeDisposal() { |
| | | void initialApprovalOnlyQueuesRetestAndFailedRetestCanReturnToRetest() { |
| | | when(qualityMapper.selectByIdForUpdate(1L)).thenReturn( |
| | | MesQcSeedQualityDO.builder().id(1L).code("B1").result(2).workflowStatus(50).build(), |
| | | MesQcSeedQualityDO.builder().id(1L).code("B1").result(2).workflowStatus(20).build(), |
| | | MesQcSeedQualityDO.builder().id(1L).code("B1").result(2).workflowStatus(60).build()); |
| | | service.processApprove(1L, true, "确认不合格,送公司质检审批"); |
| | | service.processApprove(1L, true, ""); |
| | | verifyNoInteractions(transactionService); |
| | | service.companyApprove(1L, false, "返回复检"); |
| | | service.companyApprove(1L, false, "复检不合格,重新取样"); |
| | | ArgumentCaptor<MesQcSeedQualityDO> update = ArgumentCaptor.forClass(MesQcSeedQualityDO.class); |
| | | verify(qualityMapper, times(2)).updateById(update.capture()); |
| | | assertEquals(60, update.getAllValues().get(0).getWorkflowStatus()); |
| | | assertEquals(10, update.getAllValues().get(0).getWorkflowStatus()); |
| | | assertEquals(10, update.getAllValues().get(1).getWorkflowStatus()); |
| | | verifyNoInteractions(transactionService); |
| | | } |
| | | |
| | | @Test |
| | | void rejectedInitialInspectionNeedsRecheck() { |
| | | when(qualityMapper.selectByIdForUpdate(1L)).thenReturn( |
| | | MesQcSeedQualityDO.builder().id(1L).code("B1").result(2).workflowStatus(25).build()); |
| | | service.processApprove(1L, false, "初检样本无效,重新检测"); |
| | | ArgumentCaptor<MesQcSeedQualityDO> update = ArgumentCaptor.forClass(MesQcSeedQualityDO.class); |
| | | verify(qualityMapper).updateById(update.capture()); |
| | | assertEquals(50, update.getValue().getWorkflowStatus()); |
| | | verifyNoInteractions(transactionService); |
| | | } |
| | | |
| | | @Test |
| | | void rejectionRequiresOpinion() { |
| | | when(qualityMapper.selectByIdForUpdate(1L)).thenReturn( |
| | | MesQcSeedQualityDO.builder().id(1L).workflowStatus(20).build()); |
| | | assertEquals("驳回时请填写审批意见", assertThrows(IllegalArgumentException.class, |
| | | () -> service.processApprove(1L, false, " ")).getMessage()); |
| | | verify(qualityMapper, never()).updateById(any(MesQcSeedQualityDO.class)); |
| | | verifyNoInteractions(actionMapper, transactionService); |
| | | } |
| | | |
| | | @Test |
| | | void cannotRetestBeforeInitialReview() { |
| | | when(qualityMapper.selectByIdForUpdate(1L)).thenReturn( |
| | | MesQcSeedQualityDO.builder().id(1L).code("B1").workflowStatus(25).build()); |
| | | assertThrows(IllegalArgumentException.class, |
| | | () -> service.retest(1L, new MesQcSeedQualityRetestReqVO())); |
| | | verify(qualityMapper, never()).updateById(any(MesQcSeedQualityDO.class)); |
| | | verifyNoInteractions(transactionService, actionMapper); |
| | | } |
| | | |
| | | @Test |
| | | void batchRetestRejectsDifferentProductionBatchesBeforeAnyWrite() { |
| | | when(qualityMapper.selectByIdForUpdate(1L)).thenReturn( |
| | | MesQcSeedQualityDO.builder().id(1L).code("B1").batchCode("A").workflowStatus(10).build()); |
| | | when(qualityMapper.selectByIdForUpdate(2L)).thenReturn( |
| | | MesQcSeedQualityDO.builder().id(2L).code("B2").batchCode("B").workflowStatus(10).build()); |
| | | MesQcSeedQualityBatchRetestReqVO request = new MesQcSeedQualityBatchRetestReqVO(); |
| | | request.setIds(List.of(1L, 2L)); |
| | | assertThrows(IllegalArgumentException.class, () -> service.retestBatch(request)); |
| | | verify(qualityMapper, never()).updateById(any(MesQcSeedQualityDO.class)); |
| | | verifyNoInteractions(transactionService, actionMapper); |
| | | } |
| | | |
| | | @Test |
| | | void skipsApprovalWhenStatusChanged() { |
| | | when(qualityMapper.selectByIdForUpdate(1L)).thenReturn( |
| | | MesQcSeedQualityDO.builder().id(1L).workflowStatus(40).build()); |