package cn.iocoder.yudao.module.iot.service.rule.scene.matcher.trigger;
|
|
import cn.iocoder.yudao.module.iot.core.mq.message.IotDeviceMessage;
|
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.service.rule.scene.matcher.IotBaseConditionMatcherTest;
|
import org.junit.jupiter.api.BeforeEach;
|
import org.junit.jupiter.api.Test;
|
|
import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomLongId;
|
import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomString;
|
import static org.junit.jupiter.api.Assertions.*;
|
|
/**
|
* {@link IotTimerTriggerMatcher} 的单元测试
|
*
|
* @author HUIHUI
|
*/
|
public class IotTimerTriggerMatcherTest extends IotBaseConditionMatcherTest {
|
|
private IotTimerTriggerMatcher matcher;
|
|
@BeforeEach
|
public void setUp() {
|
matcher = new IotTimerTriggerMatcher();
|
}
|
|
@Test
|
public void testGetSupportedTriggerType_success() {
|
// 准备参数
|
// 无需准备参数
|
|
// 调用
|
IotSceneRuleTriggerTypeEnum result = matcher.getSupportedTriggerType();
|
|
// 断言
|
assertEquals(IotSceneRuleTriggerTypeEnum.TIMER, result);
|
}
|
|
@Test
|
public void testGetPriority_success() {
|
// 准备参数
|
// 无需准备参数
|
|
// 调用
|
int result = matcher.getPriority();
|
|
// 断言
|
assertEquals(50, result);
|
}
|
|
@Test
|
public void testIsEnabled_success() {
|
// 准备参数
|
// 无需准备参数
|
|
// 调用
|
boolean result = matcher.isEnabled();
|
|
// 断言
|
assertTrue(result);
|
}
|
|
@Test
|
public void testMatches_validCronExpressionSuccess() {
|
// 准备参数
|
IotDeviceMessage message = createDeviceMessage();
|
String cronExpression = "0 0 12 * * ?"; // 每天中午12点
|
IotSceneRuleDO.Trigger trigger = createValidTrigger(cronExpression);
|
|
// 调用
|
boolean result = matcher.matches(message, trigger);
|
|
// 断言
|
assertTrue(result);
|
}
|
|
@Test
|
public void testMatches_everyMinuteCronSuccess() {
|
// 准备参数
|
IotDeviceMessage message = createDeviceMessage();
|
String cronExpression = "0 * * * * ?"; // 每分钟
|
IotSceneRuleDO.Trigger trigger = createValidTrigger(cronExpression);
|
|
// 调用
|
boolean result = matcher.matches(message, trigger);
|
|
// 断言
|
assertTrue(result);
|
}
|
|
@Test
|
public void testMatches_weekdaysCronSuccess() {
|
// 准备参数
|
IotDeviceMessage message = createDeviceMessage();
|
String cronExpression = "0 0 9 ? * MON-FRI"; // 工作日上午9点
|
IotSceneRuleDO.Trigger trigger = createValidTrigger(cronExpression);
|
|
// 调用
|
boolean result = matcher.matches(message, trigger);
|
|
// 断言
|
assertTrue(result);
|
}
|
|
@Test
|
public void testMatches_invalidCronExpression() {
|
// 准备参数
|
IotDeviceMessage message = createDeviceMessage();
|
String cronExpression = randomString(); // 随机无效的 cron 表达式
|
IotSceneRuleDO.Trigger trigger = createValidTrigger(cronExpression);
|
|
// 调用
|
boolean result = matcher.matches(message, trigger);
|
|
// 断言
|
assertFalse(result);
|
}
|
|
@Test
|
public void testMatches_emptyCronExpression() {
|
// 准备参数
|
IotDeviceMessage message = createDeviceMessage();
|
String cronExpression = ""; // 空的 cron 表达式
|
IotSceneRuleDO.Trigger trigger = createValidTrigger(cronExpression);
|
|
// 调用
|
boolean result = matcher.matches(message, trigger);
|
|
// 断言
|
assertFalse(result);
|
}
|
|
@Test
|
public void testMatches_nullCronExpression() {
|
// 准备参数
|
IotDeviceMessage message = createDeviceMessage();
|
IotSceneRuleDO.Trigger trigger = new IotSceneRuleDO.Trigger();
|
trigger.setType(IotSceneRuleTriggerTypeEnum.TIMER.getType());
|
trigger.setCronExpression(null);
|
|
// 调用
|
boolean result = matcher.matches(message, trigger);
|
|
// 断言
|
assertFalse(result);
|
}
|
|
@Test
|
public void testMatches_nullTrigger() {
|
// 准备参数
|
IotDeviceMessage message = createDeviceMessage();
|
|
// 调用
|
boolean result = matcher.matches(message, null);
|
|
// 断言
|
assertFalse(result);
|
}
|
|
@Test
|
public void testMatches_nullTriggerType() {
|
// 准备参数
|
IotDeviceMessage message = createDeviceMessage();
|
IotSceneRuleDO.Trigger trigger = new IotSceneRuleDO.Trigger();
|
trigger.setType(null);
|
trigger.setCronExpression("0 0 12 * * ?");
|
|
// 调用
|
boolean result = matcher.matches(message, trigger);
|
|
// 断言
|
assertFalse(result);
|
}
|
|
@Test
|
public void testMatches_complexCronExpressionSuccess() {
|
// 准备参数
|
IotDeviceMessage message = createDeviceMessage();
|
String cronExpression = "0 15 10 ? * 6#3"; // 每月第三个星期五上午10:15
|
IotSceneRuleDO.Trigger trigger = createValidTrigger(cronExpression);
|
|
// 调用
|
boolean result = matcher.matches(message, trigger);
|
|
// 断言
|
assertTrue(result);
|
}
|
|
@Test
|
public void testMatches_incorrectCronFormat() {
|
// 准备参数
|
IotDeviceMessage message = createDeviceMessage();
|
String cronExpression = "0 0 12 * *"; // 缺少字段的 cron 表达式
|
IotSceneRuleDO.Trigger trigger = createValidTrigger(cronExpression);
|
|
// 调用
|
boolean result = matcher.matches(message, trigger);
|
|
// 断言
|
assertFalse(result);
|
}
|
|
@Test
|
public void testMatches_specificDateCronSuccess() {
|
// 准备参数
|
IotDeviceMessage message = createDeviceMessage();
|
String cronExpression = "0 0 0 1 1 ? 2025"; // 2025年1月1日午夜
|
IotSceneRuleDO.Trigger trigger = createValidTrigger(cronExpression);
|
|
// 调用
|
boolean result = matcher.matches(message, trigger);
|
|
// 断言
|
assertTrue(result);
|
}
|
|
@Test
|
public void testMatches_everySecondCronSuccess() {
|
// 准备参数
|
IotDeviceMessage message = createDeviceMessage();
|
String cronExpression = "* * * * * ?"; // 每秒执行
|
IotSceneRuleDO.Trigger trigger = createValidTrigger(cronExpression);
|
|
// 调用
|
boolean result = matcher.matches(message, trigger);
|
|
// 断言
|
assertTrue(result);
|
}
|
|
@Test
|
public void testMatches_invalidCharactersCron() {
|
// 准备参数
|
IotDeviceMessage message = createDeviceMessage();
|
String cronExpression = "0 0 12 * * @ #"; // 包含无效字符的 cron 表达式
|
IotSceneRuleDO.Trigger trigger = createValidTrigger(cronExpression);
|
|
// 调用
|
boolean result = matcher.matches(message, trigger);
|
|
// 断言
|
assertFalse(result);
|
}
|
|
@Test
|
public void testMatches_rangeCronSuccess() {
|
// 准备参数
|
IotDeviceMessage message = createDeviceMessage();
|
// quartz cron 中,day-of-month 与 day-of-week 不能同时为 *,需要把其中一个改成 ?
|
IotSceneRuleDO.Trigger trigger = createValidTrigger("0 0 9-17 ? * MON-FRI"); // 工作日 9-17 点
|
|
// 调用
|
boolean result = matcher.matches(message, trigger);
|
|
// 断言
|
assertTrue(result);
|
}
|
|
// ========== 辅助方法 ==========
|
|
/**
|
* 创建设备消息
|
*/
|
private IotDeviceMessage createDeviceMessage() {
|
IotDeviceMessage message = new IotDeviceMessage();
|
message.setDeviceId(randomLongId());
|
return message;
|
}
|
|
/**
|
* 创建有效的定时触发器
|
*/
|
private IotSceneRuleDO.Trigger createValidTrigger(String cronExpression) {
|
IotSceneRuleDO.Trigger trigger = new IotSceneRuleDO.Trigger();
|
trigger.setType(IotSceneRuleTriggerTypeEnum.TIMER.getType());
|
trigger.setCronExpression(cronExpression);
|
return trigger;
|
}
|
|
}
|