package cn.iocoder.yudao.module.iot.service.rule.scene.matcher.condition;
|
|
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.IotSceneRuleConditionOperatorEnum;
|
import cn.iocoder.yudao.module.iot.enums.rule.IotSceneRuleConditionTypeEnum;
|
import cn.iocoder.yudao.module.iot.service.rule.scene.matcher.IotBaseConditionMatcherTest;
|
import org.junit.jupiter.api.BeforeEach;
|
import org.junit.jupiter.api.Test;
|
|
import java.time.LocalDateTime;
|
import java.time.ZoneOffset;
|
|
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 IotCurrentTimeConditionMatcher} 的单元测试
|
*
|
* @author HUIHUI
|
*/
|
public class IotCurrentTimeConditionMatcherTest extends IotBaseConditionMatcherTest {
|
|
private IotCurrentTimeConditionMatcher matcher;
|
|
@BeforeEach
|
public void setUp() {
|
matcher = new IotCurrentTimeConditionMatcher();
|
}
|
|
@Test
|
public void testGetSupportedConditionType() {
|
// 调用
|
IotSceneRuleConditionTypeEnum result = matcher.getSupportedConditionType();
|
|
// 断言
|
assertEquals(IotSceneRuleConditionTypeEnum.CURRENT_TIME, result);
|
}
|
|
@Test
|
public void testGetPriority() {
|
// 调用
|
int result = matcher.getPriority();
|
|
// 断言
|
assertEquals(40, result);
|
}
|
|
@Test
|
public void testIsEnabled() {
|
// 调用
|
boolean result = matcher.isEnabled();
|
|
// 断言
|
assertTrue(result);
|
}
|
|
// ========== 时间戳条件测试 ==========
|
|
@Test
|
public void testMatches_dateTimeGreaterThan_success() {
|
// 准备参数
|
IotDeviceMessage message = createDeviceMessage();
|
long pastTimestamp = LocalDateTime.now().minusHours(1).toEpochSecond(ZoneOffset.of("+8"));
|
IotSceneRuleDO.TriggerCondition condition = createDateTimeCondition(
|
IotSceneRuleConditionOperatorEnum.DATE_TIME_GREATER_THAN.getOperator(),
|
String.valueOf(pastTimestamp)
|
);
|
|
// 调用
|
boolean result = matcher.matches(message, condition);
|
|
// 断言
|
assertTrue(result);
|
}
|
|
@Test
|
public void testMatches_dateTimeGreaterThan_fail() {
|
// 准备参数
|
IotDeviceMessage message = createDeviceMessage();
|
long futureTimestamp = LocalDateTime.now().plusHours(1).toEpochSecond(ZoneOffset.of("+8"));
|
IotSceneRuleDO.TriggerCondition condition = createDateTimeCondition(
|
IotSceneRuleConditionOperatorEnum.DATE_TIME_GREATER_THAN.getOperator(),
|
String.valueOf(futureTimestamp)
|
);
|
|
// 调用
|
boolean result = matcher.matches(message, condition);
|
|
// 断言
|
assertFalse(result);
|
}
|
|
@Test
|
public void testMatches_dateTimeLessThan_success() {
|
// 准备参数
|
IotDeviceMessage message = createDeviceMessage();
|
long futureTimestamp = LocalDateTime.now().plusHours(1).toEpochSecond(ZoneOffset.of("+8"));
|
IotSceneRuleDO.TriggerCondition condition = createDateTimeCondition(
|
IotSceneRuleConditionOperatorEnum.DATE_TIME_LESS_THAN.getOperator(),
|
String.valueOf(futureTimestamp)
|
);
|
|
// 调用
|
boolean result = matcher.matches(message, condition);
|
|
// 断言
|
assertTrue(result);
|
}
|
|
@Test
|
public void testMatches_dateTimeBetween_success() {
|
// 准备参数
|
IotDeviceMessage message = createDeviceMessage();
|
long startTimestamp = LocalDateTime.now().minusHours(1).toEpochSecond(ZoneOffset.of("+8"));
|
long endTimestamp = LocalDateTime.now().plusHours(1).toEpochSecond(ZoneOffset.of("+8"));
|
IotSceneRuleDO.TriggerCondition condition = createDateTimeCondition(
|
IotSceneRuleConditionOperatorEnum.DATE_TIME_BETWEEN.getOperator(),
|
startTimestamp + "," + endTimestamp
|
);
|
|
// 调用
|
boolean result = matcher.matches(message, condition);
|
|
// 断言
|
assertTrue(result);
|
}
|
|
@Test
|
public void testMatches_dateTimeBetween_fail() {
|
// 准备参数
|
IotDeviceMessage message = createDeviceMessage();
|
long startTimestamp = LocalDateTime.now().plusHours(1).toEpochSecond(ZoneOffset.of("+8"));
|
long endTimestamp = LocalDateTime.now().plusHours(2).toEpochSecond(ZoneOffset.of("+8"));
|
IotSceneRuleDO.TriggerCondition condition = createDateTimeCondition(
|
IotSceneRuleConditionOperatorEnum.DATE_TIME_BETWEEN.getOperator(),
|
startTimestamp + "," + endTimestamp
|
);
|
|
// 调用
|
boolean result = matcher.matches(message, condition);
|
|
// 断言
|
assertFalse(result);
|
}
|
|
// ========== 当日时间条件测试 ==========
|
|
@Test
|
public void testMatches_timeGreaterThan_earlyMorning() {
|
// 准备参数
|
IotDeviceMessage message = createDeviceMessage();
|
IotSceneRuleDO.TriggerCondition condition = createTimeCondition(
|
IotSceneRuleConditionOperatorEnum.TIME_GREATER_THAN.getOperator(),
|
"06:00:00" // 早上6点
|
);
|
|
// 调用
|
boolean result = matcher.matches(message, condition);
|
|
// 断言
|
// 结果取决于当前时间,如果当前时间大于6点则为true
|
assertNotNull(result);
|
}
|
|
@Test
|
public void testMatches_timeLessThan_lateNight() {
|
// 准备参数
|
IotDeviceMessage message = createDeviceMessage();
|
IotSceneRuleDO.TriggerCondition condition = createTimeCondition(
|
IotSceneRuleConditionOperatorEnum.TIME_LESS_THAN.getOperator(),
|
"23:59:59" // 晚上11点59分59秒
|
);
|
|
// 调用
|
boolean result = matcher.matches(message, condition);
|
|
// 断言
|
// 大部分情况下应该为true,除非在午夜前1秒运行测试
|
assertNotNull(result);
|
}
|
|
@Test
|
public void testMatches_timeBetween_allDay() {
|
// 准备参数
|
IotDeviceMessage message = createDeviceMessage();
|
IotSceneRuleDO.TriggerCondition condition = createTimeCondition(
|
IotSceneRuleConditionOperatorEnum.TIME_BETWEEN.getOperator(),
|
"00:00:00,23:59:59" // 全天
|
);
|
|
// 调用
|
boolean result = matcher.matches(message, condition);
|
|
// 断言
|
assertTrue(result); // 全天范围应该总是匹配
|
}
|
|
@Test
|
public void testMatches_timeBetween_workingHours() {
|
// 准备参数
|
IotDeviceMessage message = createDeviceMessage();
|
IotSceneRuleDO.TriggerCondition condition = createTimeCondition(
|
IotSceneRuleConditionOperatorEnum.TIME_BETWEEN.getOperator(),
|
"09:00:00,17:00:00" // 工作时间
|
);
|
|
// 调用
|
boolean result = matcher.matches(message, condition);
|
|
// 断言
|
// 结果取决于当前时间是否在工作时间内
|
assertNotNull(result);
|
}
|
|
// ========== 异常情况测试 ==========
|
|
@Test
|
public void testMatches_nullCondition() {
|
// 准备参数
|
IotDeviceMessage message = createDeviceMessage();
|
|
// 调用
|
boolean result = matcher.matches(message, null);
|
|
// 断言
|
assertFalse(result);
|
}
|
|
@Test
|
public void testMatches_nullConditionType() {
|
// 准备参数
|
IotDeviceMessage message = createDeviceMessage();
|
IotSceneRuleDO.TriggerCondition condition = new IotSceneRuleDO.TriggerCondition();
|
condition.setType(null);
|
|
// 调用
|
boolean result = matcher.matches(message, condition);
|
|
// 断言
|
assertFalse(result);
|
}
|
|
@Test
|
public void testMatches_invalidOperator() {
|
// 准备参数
|
IotDeviceMessage message = createDeviceMessage();
|
IotSceneRuleDO.TriggerCondition condition = new IotSceneRuleDO.TriggerCondition();
|
condition.setType(IotSceneRuleConditionTypeEnum.CURRENT_TIME.getType());
|
condition.setOperator(randomString()); // 随机无效操作符
|
condition.setParam("12:00:00");
|
|
// 调用
|
boolean result = matcher.matches(message, condition);
|
|
// 断言
|
assertFalse(result);
|
}
|
|
@Test
|
public void testMatches_invalidTimeFormat() {
|
// 准备参数
|
IotDeviceMessage message = createDeviceMessage();
|
IotSceneRuleDO.TriggerCondition condition = createTimeCondition(
|
IotSceneRuleConditionOperatorEnum.TIME_GREATER_THAN.getOperator(),
|
randomString() // 随机无效时间格式
|
);
|
|
// 调用
|
boolean result = matcher.matches(message, condition);
|
|
// 断言
|
assertFalse(result);
|
}
|
|
@Test
|
public void testMatches_invalidTimestampFormat() {
|
// 准备参数
|
IotDeviceMessage message = createDeviceMessage();
|
IotSceneRuleDO.TriggerCondition condition = createDateTimeCondition(
|
IotSceneRuleConditionOperatorEnum.DATE_TIME_GREATER_THAN.getOperator(),
|
randomString() // 随机无效时间戳格式
|
);
|
|
// 调用
|
boolean result = matcher.matches(message, condition);
|
|
// 断言
|
assertFalse(result);
|
}
|
|
@Test
|
public void testMatches_invalidBetweenFormat() {
|
// 准备参数
|
IotDeviceMessage message = createDeviceMessage();
|
IotSceneRuleDO.TriggerCondition condition = createTimeCondition(
|
IotSceneRuleConditionOperatorEnum.TIME_BETWEEN.getOperator(),
|
"09:00:00" // 缺少结束时间
|
);
|
|
// 调用
|
boolean result = matcher.matches(message, condition);
|
|
// 断言
|
assertFalse(result);
|
}
|
|
// ========== 辅助方法 ==========
|
|
/**
|
* 创建设备消息
|
*/
|
private IotDeviceMessage createDeviceMessage() {
|
IotDeviceMessage message = new IotDeviceMessage();
|
message.setDeviceId(randomLongId());
|
return message;
|
}
|
|
/**
|
* 创建日期时间条件
|
*/
|
private IotSceneRuleDO.TriggerCondition createDateTimeCondition(String operator, String param) {
|
IotSceneRuleDO.TriggerCondition condition = new IotSceneRuleDO.TriggerCondition();
|
condition.setType(IotSceneRuleConditionTypeEnum.CURRENT_TIME.getType());
|
condition.setOperator(operator);
|
condition.setParam(param);
|
return condition;
|
}
|
|
/**
|
* 创建当日时间条件
|
*/
|
private IotSceneRuleDO.TriggerCondition createTimeCondition(String operator, String param) {
|
IotSceneRuleDO.TriggerCondition condition = new IotSceneRuleDO.TriggerCondition();
|
condition.setType(IotSceneRuleConditionTypeEnum.CURRENT_TIME.getType());
|
condition.setOperator(operator);
|
condition.setParam(param);
|
return condition;
|
}
|
|
}
|