test: Add comprehensive tests for dispatch strategies and IoT signal processing, fix SignalLossRuleProcessor bug

This commit is contained in:
lzh
2026-01-23 11:44:49 +08:00
parent 9750088ca6
commit 5bb3ff6979
5 changed files with 466 additions and 6 deletions

View File

@@ -0,0 +1,99 @@
package com.viewsh.module.ops.environment.service.dispatch;
import com.viewsh.module.ops.api.queue.OrderQueueDTO;
import com.viewsh.module.ops.api.queue.OrderQueueService;
import com.viewsh.module.ops.core.dispatch.model.AssigneeRecommendation;
import com.viewsh.module.ops.core.dispatch.model.OrderDispatchContext;
import com.viewsh.module.ops.enums.CleanerStatusEnum;
import com.viewsh.module.ops.enums.PriorityEnum;
import com.viewsh.module.ops.environment.dal.dataobject.cleaner.OpsCleanerStatusDO;
import com.viewsh.module.ops.environment.service.cleaner.CleanerStatusService;
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.time.LocalDateTime;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import static org.junit.jupiter.api.Assertions.*;
import static org.mockito.ArgumentMatchers.anyLong;
import static org.mockito.Mockito.when;
@ExtendWith(MockitoExtension.class)
class CleanerAreaAssignStrategyTest {
@InjectMocks
private CleanerAreaAssignStrategy strategy;
@Mock
private CleanerStatusService cleanerStatusService;
@Mock
private OrderQueueService orderQueueService;
@Mock
private com.viewsh.module.ops.core.dispatch.DispatchEngine dispatchEngine;
@Test
void testRecommend_SelectIdleCleaner() {
// Setup
OpsCleanerStatusDO c1 = new OpsCleanerStatusDO();
c1.setUserId(1L);
c1.setStatus(CleanerStatusEnum.BUSY.getCode());
c1.setBatteryLevel(80);
OpsCleanerStatusDO c2 = new OpsCleanerStatusDO();
c2.setUserId(2L);
c2.setStatus(CleanerStatusEnum.IDLE.getCode());
c2.setBatteryLevel(90);
c2.setLastHeartbeatTime(LocalDateTime.now());
when(cleanerStatusService.listCleanersByArea(101L)).thenReturn(Arrays.asList(c1, c2));
OrderDispatchContext context = OrderDispatchContext.builder()
.orderId(100L)
.areaId(101L)
.priority(PriorityEnum.P1)
.build();
// Execute
AssigneeRecommendation rec = strategy.recommend(context);
// Verify
assertTrue(rec.hasRecommendation());
assertEquals(2L, rec.getAssigneeId());
}
@Test
void testRecommend_SelectLeastBusyCleaner_WhenAllBusy() {
// Setup
OpsCleanerStatusDO c1 = new OpsCleanerStatusDO();
c1.setUserId(1L);
c1.setStatus(CleanerStatusEnum.BUSY.getCode());
OpsCleanerStatusDO c2 = new OpsCleanerStatusDO();
c2.setUserId(2L);
c2.setStatus(CleanerStatusEnum.BUSY.getCode());
when(cleanerStatusService.listCleanersByArea(101L)).thenReturn(Arrays.asList(c1, c2));
// C1 has 5 tasks, C2 has 1 task
when(orderQueueService.getWaitingTasksByUserId(1L)).thenReturn(Arrays.asList(new OrderQueueDTO(), new OrderQueueDTO()));
when(orderQueueService.getWaitingTasksByUserId(2L)).thenReturn(Collections.singletonList(new OrderQueueDTO()));
OrderDispatchContext context = OrderDispatchContext.builder()
.areaId(101L)
.priority(PriorityEnum.P1)
.build();
// Execute
AssigneeRecommendation rec = strategy.recommend(context);
// Verify
assertEquals(2L, rec.getAssigneeId());
}
}

View File

@@ -0,0 +1,78 @@
package com.viewsh.module.ops.environment.service.dispatch;
import com.viewsh.module.ops.api.queue.OrderQueueDTO;
import com.viewsh.module.ops.api.queue.OrderQueueService;
import com.viewsh.module.ops.core.dispatch.model.DispatchDecision;
import com.viewsh.module.ops.core.dispatch.model.DispatchPath;
import com.viewsh.module.ops.core.dispatch.model.OrderDispatchContext;
import com.viewsh.module.ops.enums.CleanerStatusEnum;
import com.viewsh.module.ops.enums.PriorityEnum;
import com.viewsh.module.ops.environment.dal.dataobject.cleaner.OpsCleanerStatusDO;
import com.viewsh.module.ops.environment.service.cleaner.CleanerStatusService;
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.util.Collections;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.mockito.Mockito.when;
@ExtendWith(MockitoExtension.class)
class CleanerPriorityScheduleStrategyTest {
@InjectMocks
private CleanerPriorityScheduleStrategy strategy;
@Mock
private CleanerStatusService cleanerStatusService;
@Mock
private OrderQueueService orderQueueService;
@Mock
private com.viewsh.module.ops.core.dispatch.DispatchEngine dispatchEngine;
@Test
void testDecide_P0_Interrupt() {
// Setup
OpsCleanerStatusDO c1 = new OpsCleanerStatusDO();
c1.setUserId(1L);
c1.setStatus(CleanerStatusEnum.BUSY.getCode());
c1.setCurrentOpsOrderId(500L);
when(cleanerStatusService.getStatus(1L)).thenReturn(c1);
OrderDispatchContext context = OrderDispatchContext.builder()
.priority(PriorityEnum.P0)
.recommendedAssigneeId(1L)
.build();
// Execute
DispatchDecision decision = strategy.decide(context);
// Verify
assertEquals(DispatchPath.INTERRUPT_AND_DISPATCH, decision.getPath());
assertEquals(500L, decision.getInterruptedOrderId());
}
@Test
void testDecide_Normal_EnqueueOnly() {
OpsCleanerStatusDO c1 = new OpsCleanerStatusDO();
c1.setUserId(1L);
c1.setStatus(CleanerStatusEnum.BUSY.getCode());
when(cleanerStatusService.getStatus(1L)).thenReturn(c1);
OrderDispatchContext context = OrderDispatchContext.builder()
.priority(PriorityEnum.P1)
.recommendedAssigneeId(1L)
.build();
DispatchDecision decision = strategy.decide(context);
assertEquals(DispatchPath.ENQUEUE_ONLY, decision.getPath());
}
}