package cn.iocoder.yudao.module.iot.service.rule.scene.timer; import cn.hutool.core.collection.ListUtil; import cn.iocoder.yudao.module.iot.dal.dataobject.rule.IotSceneRuleDO; import cn.iocoder.yudao.module.iot.enums.rule.IotSceneRuleTriggerTypeEnum; import cn.iocoder.yudao.module.iot.framework.job.core.IotSchedulerManager; import cn.iocoder.yudao.module.iot.job.rule.IotSceneRuleJob; import org.junit.jupiter.api.BeforeEach; 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 org.quartz.SchedulerException; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.*; /** * {@link IotSceneRuleTimerHandler} 的单元测试类 * * @author HUIHUI */ @ExtendWith(MockitoExtension.class) public class IotSceneRuleTimerHandlerTest { @Mock private IotSchedulerManager schedulerManager; @InjectMocks private IotSceneRuleTimerHandler timerHandler; @BeforeEach void setUp() { // 重置 Mock 对象 reset(schedulerManager); } @Test public void testRegisterTimerTriggers_success() throws SchedulerException { // 准备参数 Long sceneRuleId = 1L; IotSceneRuleDO sceneRule = new IotSceneRuleDO(); sceneRule.setId(sceneRuleId); sceneRule.setStatus(0); // 0 表示启用 // 创建定时触发器 IotSceneRuleDO.Trigger timerTrigger = new IotSceneRuleDO.Trigger(); timerTrigger.setType(IotSceneRuleTriggerTypeEnum.TIMER.getType()); timerTrigger.setCronExpression("0 0 12 * * ?"); // 每天中午12点 sceneRule.setTriggers(ListUtil.toList(timerTrigger)); // 调用 timerHandler.registerTimerTriggers(sceneRule); // 验证 verify(schedulerManager, times(1)).addOrUpdateJob( eq(IotSceneRuleJob.class), eq("iot_scene_rule_timer_" + sceneRuleId), eq("0 0 12 * * ?"), eq(IotSceneRuleJob.buildJobDataMap(sceneRuleId)) ); } @Test public void testRegisterTimerTriggers_noTimerTrigger() throws SchedulerException { // 准备参数 - 没有定时触发器 IotSceneRuleDO sceneRule = new IotSceneRuleDO(); sceneRule.setStatus(0); // 0 表示启用 // 创建非定时触发器 IotSceneRuleDO.Trigger deviceTrigger = new IotSceneRuleDO.Trigger(); deviceTrigger.setType(IotSceneRuleTriggerTypeEnum.DEVICE_PROPERTY_POST.getType()); sceneRule.setTriggers(ListUtil.toList(deviceTrigger)); // 调用 timerHandler.registerTimerTriggers(sceneRule); // 验证 - 不应该调用调度器 verify(schedulerManager, never()).addOrUpdateJob(any(), any(), any(), any()); } @Test public void testRegisterTimerTriggers_emptyCronExpression() throws SchedulerException { // 准备参数 - CRON 表达式为空 Long sceneRuleId = 2L; IotSceneRuleDO sceneRule = new IotSceneRuleDO(); sceneRule.setId(sceneRuleId); sceneRule.setStatus(0); // 0 表示启用 // 创建定时触发器但没有 CRON 表达式 IotSceneRuleDO.Trigger timerTrigger = new IotSceneRuleDO.Trigger(); timerTrigger.setType(IotSceneRuleTriggerTypeEnum.TIMER.getType()); timerTrigger.setCronExpression(""); // 空的 CRON 表达式 sceneRule.setTriggers(ListUtil.toList(timerTrigger)); // 调用 timerHandler.registerTimerTriggers(sceneRule); // 验证 - 不应该调用调度器 verify(schedulerManager, never()).addOrUpdateJob(any(), any(), any(), any()); } @Test public void testUnregisterTimerTriggers_success() throws SchedulerException { // 准备参数 Long sceneRuleId = 3L; // 调用 timerHandler.unregisterTimerTriggers(sceneRuleId); // 验证 verify(schedulerManager, times(1)).deleteJob("iot_scene_rule_timer_" + sceneRuleId); } @Test public void testPauseTimerTriggers_success() throws SchedulerException { // 准备参数 Long sceneRuleId = 4L; // 调用 timerHandler.pauseTimerTriggers(sceneRuleId); // 验证 verify(schedulerManager, times(1)).pauseJob("iot_scene_rule_timer_" + sceneRuleId); } }