package com.zy.asrs.controller; import com.zy.asrs.entity.WrkMast; import com.zy.asrs.mapper.WrkMastLogMapper; import com.zy.asrs.mapper.WrkMastMapper; import com.zy.asrs.service.WrkMastService; import com.zy.asrs.service.impl.WrkMastServiceImpl; 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.Arrays; import java.util.Date; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.mockito.Mockito.verifyNoInteractions; import static org.mockito.Mockito.when; @ExtendWith(MockitoExtension.class) class OpenControllerQueryTaskMetricsTest { private static final long BASE_TIME = 1700000000000L; @Mock private WrkMastService wrkMastService; @Mock private WrkMastMapper wrkMastMapper; @Mock private WrkMastLogMapper wrkMastLogMapper; private OpenController controller; private WrkMastServiceImpl wrkMastServiceImpl; @BeforeEach void setUp() { controller = new OpenController(); ReflectionTestUtils.setField(controller, "wrkMastService", wrkMastService); wrkMastServiceImpl = new WrkMastServiceImpl(); ReflectionTestUtils.setField(wrkMastServiceImpl, "baseMapper", wrkMastMapper); ReflectionTestUtils.setField(wrkMastServiceImpl, "wrkMastLogMapper", wrkMastLogMapper); } @Test void inboundFirstPalletCostTimeIsZero() { WrkMast wrkMast = inboundTask("TRAIN-1", 0); when(wrkMastService.firstInboundCreateTimeByTrainNo("TRAIN-1")).thenReturn(atMinute(0)); assertEquals(0L, controller.resolveCostTime(wrkMast, atMinute(99))); } @Test void inboundLaterPalletCostTimeUsesFirstTrainPalletCreateTime() { WrkMast wrkMast = inboundTask("TRAIN-1", 17); when(wrkMastService.firstInboundCreateTimeByTrainNo("TRAIN-1")).thenReturn(atMinute(0)); assertEquals(17L, controller.resolveCostTime(wrkMast, atMinute(99))); } @Test void inboundSuppUsesFinishedPalletCountByTrainNo() { WrkMast wrkMast = inboundTask("TRAIN-1", 17); when(wrkMastService.finishedInboundPalletCountByTrainNo("TRAIN-1")).thenReturn(3); assertEquals(3, controller.resolveInboundSupp(wrkMast)); } @Test void inboundMetricsReturnZeroWhenTrainNoIsEmpty() { WrkMast wrkMast = inboundTask(null, 17); assertEquals(0L, controller.resolveCostTime(wrkMast, atMinute(99))); assertEquals(0, controller.resolveInboundSupp(wrkMast)); verifyNoInteractions(wrkMastService); } @Test void outboundCostTimeUsesCurrentTimeMinusTaskCreateTime() { WrkMast wrkMast = outboundTask(0); assertEquals(12L, controller.resolveCostTime(wrkMast, atMinute(12))); } @Test void costTimeReturnsZeroWhenCreateTimeIsMissingOrClockMovesBackward() { WrkMast missingCreateTime = new WrkMast(); missingCreateTime.setIoType(101); WrkMast futureCreateTime = outboundTask(20); assertEquals(0L, controller.resolveCostTime(missingCreateTime, atMinute(12))); assertEquals(0L, controller.resolveCostTime(futureCreateTime, atMinute(12))); } @Test void serviceUsesEarliestInboundCreateTimeAcrossMainAndLog() { when(wrkMastMapper.selectFirstInboundCreateTimeByTrainNo("TRAIN-1")).thenReturn(atMinute(10)); when(wrkMastLogMapper.selectFirstInboundCreateTimeByTrainNo("TRAIN-1")).thenReturn(atMinute(3)); assertEquals(atMinute(3), wrkMastServiceImpl.firstInboundCreateTimeByTrainNo("TRAIN-1")); } @Test void serviceDeduplicatesFinishedInboundPalletsAcrossMainAndLog() { when(wrkMastMapper.listFinishedInboundWrkNosByTrainNo("TRAIN-1")).thenReturn(Arrays.asList(1001, 1002)); when(wrkMastLogMapper.listFinishedInboundWrkNosByTrainNo("TRAIN-1")).thenReturn(Arrays.asList(1002, 1003, null, -1)); assertEquals(3, wrkMastServiceImpl.finishedInboundPalletCountByTrainNo("TRAIN-1")); } private static WrkMast inboundTask(String trainNo, int createMinute) { WrkMast wrkMast = new WrkMast(); wrkMast.setIoType(1); wrkMast.setTrainNo(trainNo); wrkMast.setAppeTime(atMinute(createMinute)); return wrkMast; } private static WrkMast outboundTask(int createMinute) { WrkMast wrkMast = new WrkMast(); wrkMast.setIoType(101); wrkMast.setAppeTime(atMinute(createMinute)); return wrkMast; } private static Date atMinute(int minute) { return new Date(BASE_TIME + minute * 60L * 1000L); } }