test: Add comprehensive tests for dispatch strategies and IoT signal processing, fix SignalLossRuleProcessor bug
This commit is contained in:
@@ -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());
|
||||
}
|
||||
}
|
||||
@@ -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());
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user