Commit dea8883f8243b5bd2d67c5213c9b9ac76a24d9dc
1 parent
555310de
【代码评审】IoT:插件管理相关的逻辑
Showing
12 changed files
with
39 additions
and
354 deletions
yudao-module-iot/yudao-module-iot-api/src/main/java/cn/iocoder/yudao/module/iot/enums/plugin/IotPluginDeployTypeEnum.java
| ... | ... | @@ -13,7 +13,7 @@ import java.util.Arrays; |
| 13 | 13 | @Getter |
| 14 | 14 | public enum IotPluginDeployTypeEnum implements IntArrayValuable { |
| 15 | 15 | |
| 16 | - UPLOAD(0, "上传jar"), | |
| 16 | + UPLOAD(0, "上传 jar"), // TODO @haohao:UPLOAD 和 ALONE 感觉有点冲突,前者是部署方式,后者是运行方式。这个后续再讨论下哈 | |
| 17 | 17 | ALONE(1, "独立运行"); |
| 18 | 18 | |
| 19 | 19 | public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(IotPluginDeployTypeEnum::getDeployType).toArray(); | ... | ... |
yudao-module-iot/yudao-module-iot-api/src/main/java/cn/iocoder/yudao/module/iot/enums/plugin/IotPluginStatusEnum.java
| ... | ... | @@ -42,6 +42,11 @@ public enum IotPluginStatusEnum implements IntArrayValuable { |
| 42 | 42 | return null; |
| 43 | 43 | } |
| 44 | 44 | |
| 45 | + @Override | |
| 46 | + public int[] array() { | |
| 47 | + return ARRAYS; | |
| 48 | + } | |
| 49 | + | |
| 45 | 50 | public static boolean isValidState(Integer state) { |
| 46 | 51 | return fromState(state) != null; |
| 47 | 52 | } |
| ... | ... | @@ -50,8 +55,4 @@ public enum IotPluginStatusEnum implements IntArrayValuable { |
| 50 | 55 | return Arrays.stream(values()).anyMatch(e -> e.getStatus().equals(status)); |
| 51 | 56 | } |
| 52 | 57 | |
| 53 | - @Override | |
| 54 | - public int[] array() { | |
| 55 | - return new int[0]; | |
| 56 | - } | |
| 57 | 58 | } | ... | ... |
yudao-module-iot/yudao-module-iot-api/src/main/java/cn/iocoder/yudao/module/iot/enums/plugin/IotPluginTypeEnum.java
| 1 | 1 | package cn.iocoder.yudao.module.iot.enums.plugin; |
| 2 | 2 | |
| 3 | 3 | import cn.iocoder.yudao.framework.common.core.IntArrayValuable; |
| 4 | +import lombok.AllArgsConstructor; | |
| 4 | 5 | import lombok.Getter; |
| 5 | 6 | |
| 6 | 7 | import java.util.Arrays; |
| ... | ... | @@ -10,6 +11,7 @@ import java.util.Arrays; |
| 10 | 11 | * |
| 11 | 12 | * @author haohao |
| 12 | 13 | */ |
| 14 | +@AllArgsConstructor | |
| 13 | 15 | @Getter |
| 14 | 16 | public enum IotPluginTypeEnum implements IntArrayValuable { |
| 15 | 17 | |
| ... | ... | @@ -28,11 +30,12 @@ public enum IotPluginTypeEnum implements IntArrayValuable { |
| 28 | 30 | */ |
| 29 | 31 | private final String name; |
| 30 | 32 | |
| 31 | - IotPluginTypeEnum(Integer type, String name) { | |
| 32 | - this.type = type; | |
| 33 | - this.name = name; | |
| 33 | + @Override | |
| 34 | + public int[] array() { | |
| 35 | + return ARRAYS; | |
| 34 | 36 | } |
| 35 | 37 | |
| 38 | + // TODO @haohao:可以使用 hutool 简化 | |
| 36 | 39 | public static IotPluginTypeEnum fromType(Integer type) { |
| 37 | 40 | for (IotPluginTypeEnum value : values()) { |
| 38 | 41 | if (value.getType().equals(type)) { |
| ... | ... | @@ -46,8 +49,4 @@ public enum IotPluginTypeEnum implements IntArrayValuable { |
| 46 | 49 | return fromType(type) != null; |
| 47 | 50 | } |
| 48 | 51 | |
| 49 | - @Override | |
| 50 | - public int[] array() { | |
| 51 | - return ARRAYS; | |
| 52 | - } | |
| 53 | 52 | } | ... | ... |
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/plugininfo/PluginInfoController.java
| ... | ... | @@ -20,7 +20,6 @@ import org.springframework.web.multipart.MultipartFile; |
| 20 | 20 | |
| 21 | 21 | import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; |
| 22 | 22 | import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; |
| 23 | -import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; | |
| 24 | 23 | import static cn.iocoder.yudao.module.infra.enums.ErrorCodeConstants.FILE_IS_EMPTY; |
| 25 | 24 | |
| 26 | 25 | @Tag(name = "管理后台 - IoT 插件信息") |
| ... | ... | @@ -86,7 +85,6 @@ public class PluginInfoController { |
| 86 | 85 | return success(true); |
| 87 | 86 | } |
| 88 | 87 | |
| 89 | - // 修改插件状态 | |
| 90 | 88 | @PutMapping("/update-status") |
| 91 | 89 | @Operation(summary = "修改插件状态") |
| 92 | 90 | @PreAuthorize("@ss.hasPermission('iot:plugin-info:update')") | ... | ... |
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/plugininfo/vo/PluginInfoPageReqVO.java
| 1 | 1 | package cn.iocoder.yudao.module.iot.controller.admin.plugininfo.vo; |
| 2 | 2 | |
| 3 | +import cn.iocoder.yudao.framework.common.validation.InEnum; | |
| 4 | +import cn.iocoder.yudao.module.iot.enums.plugin.IotPluginTypeEnum; | |
| 3 | 5 | import lombok.*; |
| 4 | 6 | import io.swagger.v3.oas.annotations.media.Schema; |
| 5 | 7 | import cn.iocoder.yudao.framework.common.pojo.PageParam; |
| ... | ... | @@ -8,13 +10,12 @@ import java.time.LocalDateTime; |
| 8 | 10 | |
| 9 | 11 | import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; |
| 10 | 12 | |
| 13 | +// TODO @haohao:只查询必要字段哈 | |
| 11 | 14 | @Schema(description = "管理后台 - IoT 插件信息分页 Request VO") |
| 12 | 15 | @Data |
| 13 | -@EqualsAndHashCode(callSuper = true) | |
| 14 | -@ToString(callSuper = true) | |
| 15 | 16 | public class PluginInfoPageReqVO extends PageParam { |
| 16 | 17 | |
| 17 | - @Schema(description = "插件包id", example = "24627") | |
| 18 | + @Schema(description = "插件包 ID ", example = "24627") | |
| 18 | 19 | private String pluginId; |
| 19 | 20 | |
| 20 | 21 | @Schema(description = "插件名称", example = "赵六") |
| ... | ... | @@ -33,6 +34,7 @@ public class PluginInfoPageReqVO extends PageParam { |
| 33 | 34 | private String version; |
| 34 | 35 | |
| 35 | 36 | @Schema(description = "插件类型", example = "2") |
| 37 | + @InEnum(IotPluginTypeEnum.class) | |
| 36 | 38 | private Integer type; |
| 37 | 39 | |
| 38 | 40 | @Schema(description = "设备插件协议类型") | ... | ... |
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/plugininfo/vo/PluginInfoRespVO.java
| 1 | 1 | package cn.iocoder.yudao.module.iot.controller.admin.plugininfo.vo; |
| 2 | 2 | |
| 3 | +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; | |
| 4 | +import com.alibaba.excel.annotation.ExcelProperty; | |
| 3 | 5 | import io.swagger.v3.oas.annotations.media.Schema; |
| 4 | -import lombok.*; | |
| 6 | +import lombok.Data; | |
| 5 | 7 | |
| 6 | 8 | import java.time.LocalDateTime; |
| 7 | -import com.alibaba.excel.annotation.*; | |
| 8 | 9 | |
| 9 | 10 | @Schema(description = "管理后台 - IoT 插件信息 Response VO") |
| 10 | 11 | @Data |
| 11 | 12 | @ExcelIgnoreUnannotated |
| 12 | 13 | public class PluginInfoRespVO { |
| 13 | 14 | |
| 14 | - @Schema(description = "主键ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "11546") | |
| 15 | - @ExcelProperty("主键ID") | |
| 15 | + @Schema(description = "主键 ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "11546") | |
| 16 | + @ExcelProperty("主键 ID") | |
| 16 | 17 | private Long id; |
| 17 | 18 | |
| 18 | - @Schema(description = "插件包id", requiredMode = Schema.RequiredMode.REQUIRED, example = "24627") | |
| 19 | - @ExcelProperty("插件包id") | |
| 19 | + @Schema(description = "插件包 ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "24627") | |
| 20 | + @ExcelProperty("插件包 ID") | |
| 20 | 21 | private String pluginId; |
| 21 | 22 | |
| 22 | 23 | @Schema(description = "插件名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "赵六") | ... | ... |
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/plugininstance/vo/PluginInstancePageReqVO.java
| ... | ... | @@ -8,6 +8,7 @@ import java.time.LocalDateTime; |
| 8 | 8 | |
| 9 | 9 | import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; |
| 10 | 10 | |
| 11 | +// TODO @haohao:建议搞个 plugin,然后里面分 info 和 instance。另外,是不是 info => config 会好点,插件配置? | |
| 11 | 12 | @Schema(description = "管理后台 - IoT 插件实例分页 Request VO") |
| 12 | 13 | @Data |
| 13 | 14 | @EqualsAndHashCode(callSuper = true) | ... | ... |
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/dataobject/plugininfo/PluginInfoDO.java
| ... | ... | @@ -22,12 +22,13 @@ import lombok.*; |
| 22 | 22 | public class PluginInfoDO extends BaseDO { |
| 23 | 23 | |
| 24 | 24 | /** |
| 25 | - * 主键ID | |
| 25 | + * 主键 ID | |
| 26 | 26 | */ |
| 27 | 27 | @TableId |
| 28 | 28 | private Long id; |
| 29 | + // TODO @haohao:这个是不是改成类似 key 之类的字段哈? | |
| 29 | 30 | /** |
| 30 | - * 插件包id | |
| 31 | + * 插件包 ID | |
| 31 | 32 | */ |
| 32 | 33 | private String pluginId; |
| 33 | 34 | /** |
| ... | ... | @@ -41,10 +42,12 @@ public class PluginInfoDO extends BaseDO { |
| 41 | 42 | /** |
| 42 | 43 | * 部署方式 |
| 43 | 44 | */ |
| 45 | + // TODO @haohao:枚举 | |
| 44 | 46 | private Integer deployType; |
| 45 | 47 | /** |
| 46 | 48 | * 插件包文件名 |
| 47 | 49 | */ |
| 50 | + // TODO @haohao:是不是叫 fileName 哈?避免后续有别的字段,类似 fileUrl? | |
| 48 | 51 | private String file; |
| 49 | 52 | /** |
| 50 | 53 | * 插件版本 |
| ... | ... | @@ -53,6 +56,7 @@ public class PluginInfoDO extends BaseDO { |
| 53 | 56 | /** |
| 54 | 57 | * 插件类型 |
| 55 | 58 | */ |
| 59 | + // TODO @haohao:枚举 | |
| 56 | 60 | private Integer type; |
| 57 | 61 | /** |
| 58 | 62 | * 设备插件协议类型 |
| ... | ... | @@ -61,6 +65,7 @@ public class PluginInfoDO extends BaseDO { |
| 61 | 65 | /** |
| 62 | 66 | * 状态 |
| 63 | 67 | */ |
| 68 | + // TODO @haohao:枚举 | |
| 64 | 69 | private Integer status; |
| 65 | 70 | /** |
| 66 | 71 | * 插件配置项描述信息 | ... | ... |
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/dataobject/plugininstance/PluginInstanceDO.java
| 1 | 1 | package cn.iocoder.yudao.module.iot.dal.dataobject.plugininstance; |
| 2 | 2 | |
| 3 | -import lombok.*; | |
| 4 | -import java.util.*; | |
| 5 | -import java.time.LocalDateTime; | |
| 6 | -import java.time.LocalDateTime; | |
| 7 | -import com.baomidou.mybatisplus.annotation.*; | |
| 8 | 3 | import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; |
| 4 | +import com.baomidou.mybatisplus.annotation.KeySequence; | |
| 5 | +import com.baomidou.mybatisplus.annotation.TableId; | |
| 6 | +import com.baomidou.mybatisplus.annotation.TableName; | |
| 7 | +import lombok.*; | |
| 9 | 8 | |
| 9 | +// TODO @haohao:一些必要的关联、枚举 | |
| 10 | 10 | /** |
| 11 | 11 | * IoT 插件实例 DO |
| 12 | 12 | * |
| ... | ... | @@ -28,7 +28,7 @@ public class PluginInstanceDO extends BaseDO { |
| 28 | 28 | @TableId |
| 29 | 29 | private Long id; |
| 30 | 30 | /** |
| 31 | - * 插件主程序id | |
| 31 | + * 插件主程序 ID | |
| 32 | 32 | */ |
| 33 | 33 | private String mainId; |
| 34 | 34 | /** |
| ... | ... | @@ -44,7 +44,7 @@ public class PluginInstanceDO extends BaseDO { |
| 44 | 44 | */ |
| 45 | 45 | private Integer port; |
| 46 | 46 | /** |
| 47 | - * 心跳时间,心路时间超过30秒需要剔除 | |
| 47 | + * 心跳时间,心路时间超过 30 秒需要剔除 | |
| 48 | 48 | */ |
| 49 | 49 | private Long heartbeatAt; |
| 50 | 50 | ... | ... |
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/device/IotDeviceDataService.java
yudao-module-iot/yudao-module-iot-biz/src/test/java/cn/iocoder/yudao/module/iot/service/plugininfo/PluginInfoServiceImplTest.java deleted
| 1 | -package cn.iocoder.yudao.module.iot.service.plugininfo; | |
| 2 | - | |
| 3 | -import org.junit.jupiter.api.Disabled; | |
| 4 | -import org.junit.jupiter.api.Test; | |
| 5 | - | |
| 6 | -import jakarta.annotation.Resource; | |
| 7 | - | |
| 8 | -import cn.iocoder.yudao.framework.test.core.ut.BaseDbUnitTest; | |
| 9 | - | |
| 10 | -import cn.iocoder.yudao.module.iot.controller.admin.plugininfo.vo.*; | |
| 11 | -import cn.iocoder.yudao.module.iot.dal.dataobject.plugininfo.PluginInfoDO; | |
| 12 | -import cn.iocoder.yudao.module.iot.dal.mysql.plugininfo.PluginInfoMapper; | |
| 13 | -import cn.iocoder.yudao.framework.common.pojo.PageResult; | |
| 14 | - | |
| 15 | -import org.springframework.context.annotation.Import; | |
| 16 | - | |
| 17 | -import static cn.iocoder.yudao.module.iot.enums.ErrorCodeConstants.*; | |
| 18 | -import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.*; | |
| 19 | -import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.*; | |
| 20 | -import static cn.iocoder.yudao.framework.common.util.date.LocalDateTimeUtils.*; | |
| 21 | -import static cn.iocoder.yudao.framework.common.util.object.ObjectUtils.*; | |
| 22 | -import static org.junit.jupiter.api.Assertions.*; | |
| 23 | - | |
| 24 | -/** | |
| 25 | - * {@link PluginInfoServiceImpl} 的单元测试类 | |
| 26 | - * | |
| 27 | - * @author 芋道源码 | |
| 28 | - */ | |
| 29 | -@Import(PluginInfoServiceImpl.class) | |
| 30 | -public class PluginInfoServiceImplTest extends BaseDbUnitTest { | |
| 31 | - | |
| 32 | - @Resource | |
| 33 | - private PluginInfoServiceImpl pluginInfoService; | |
| 34 | - | |
| 35 | - @Resource | |
| 36 | - private PluginInfoMapper pluginInfoMapper; | |
| 37 | - | |
| 38 | - @Test | |
| 39 | - public void testCreatePluginInfo_success() { | |
| 40 | - // 准备参数 | |
| 41 | - PluginInfoSaveReqVO createReqVO = randomPojo(PluginInfoSaveReqVO.class).setId(null); | |
| 42 | - | |
| 43 | - // 调用 | |
| 44 | - Long pluginInfoId = pluginInfoService.createPluginInfo(createReqVO); | |
| 45 | - // 断言 | |
| 46 | - assertNotNull(pluginInfoId); | |
| 47 | - // 校验记录的属性是否正确 | |
| 48 | - PluginInfoDO pluginInfo = pluginInfoMapper.selectById(pluginInfoId); | |
| 49 | - assertPojoEquals(createReqVO, pluginInfo, "id"); | |
| 50 | - } | |
| 51 | - | |
| 52 | - @Test | |
| 53 | - public void testUpdatePluginInfo_success() { | |
| 54 | - // mock 数据 | |
| 55 | - PluginInfoDO dbPluginInfo = randomPojo(PluginInfoDO.class); | |
| 56 | - pluginInfoMapper.insert(dbPluginInfo);// @Sql: 先插入出一条存在的数据 | |
| 57 | - // 准备参数 | |
| 58 | - PluginInfoSaveReqVO updateReqVO = randomPojo(PluginInfoSaveReqVO.class, o -> { | |
| 59 | - o.setId(dbPluginInfo.getId()); // 设置更新的 ID | |
| 60 | - }); | |
| 61 | - | |
| 62 | - // 调用 | |
| 63 | - pluginInfoService.updatePluginInfo(updateReqVO); | |
| 64 | - // 校验是否更新正确 | |
| 65 | - PluginInfoDO pluginInfo = pluginInfoMapper.selectById(updateReqVO.getId()); // 获取最新的 | |
| 66 | - assertPojoEquals(updateReqVO, pluginInfo); | |
| 67 | - } | |
| 68 | - | |
| 69 | - @Test | |
| 70 | - public void testUpdatePluginInfo_notExists() { | |
| 71 | - // 准备参数 | |
| 72 | - PluginInfoSaveReqVO updateReqVO = randomPojo(PluginInfoSaveReqVO.class); | |
| 73 | - | |
| 74 | - // 调用, 并断言异常 | |
| 75 | - assertServiceException(() -> pluginInfoService.updatePluginInfo(updateReqVO), PLUGIN_INFO_NOT_EXISTS); | |
| 76 | - } | |
| 77 | - | |
| 78 | - @Test | |
| 79 | - public void testDeletePluginInfo_success() { | |
| 80 | - // mock 数据 | |
| 81 | - PluginInfoDO dbPluginInfo = randomPojo(PluginInfoDO.class); | |
| 82 | - pluginInfoMapper.insert(dbPluginInfo);// @Sql: 先插入出一条存在的数据 | |
| 83 | - // 准备参数 | |
| 84 | - Long id = dbPluginInfo.getId(); | |
| 85 | - | |
| 86 | - // 调用 | |
| 87 | - pluginInfoService.deletePluginInfo(id); | |
| 88 | - // 校验数据不存在了 | |
| 89 | - assertNull(pluginInfoMapper.selectById(id)); | |
| 90 | - } | |
| 91 | - | |
| 92 | - @Test | |
| 93 | - public void testDeletePluginInfo_notExists() { | |
| 94 | - // 准备参数 | |
| 95 | - Long id = randomLongId(); | |
| 96 | - | |
| 97 | - // 调用, 并断言异常 | |
| 98 | - assertServiceException(() -> pluginInfoService.deletePluginInfo(id), PLUGIN_INFO_NOT_EXISTS); | |
| 99 | - } | |
| 100 | - | |
| 101 | - @Test | |
| 102 | - @Disabled // TODO 请修改 null 为需要的值,然后删除 @Disabled 注解 | |
| 103 | - public void testGetPluginInfoPage() { | |
| 104 | - // mock 数据 | |
| 105 | - PluginInfoDO dbPluginInfo = randomPojo(PluginInfoDO.class, o -> { // 等会查询到 | |
| 106 | - o.setPluginId(null); | |
| 107 | - o.setName(null); | |
| 108 | - o.setDescription(null); | |
| 109 | - o.setDeployType(null); | |
| 110 | - o.setFile(null); | |
| 111 | - o.setVersion(null); | |
| 112 | - o.setType(null); | |
| 113 | - o.setProtocol(null); | |
| 114 | - o.setStatus(null); | |
| 115 | - o.setConfigSchema(null); | |
| 116 | - o.setConfig(null); | |
| 117 | - o.setScript(null); | |
| 118 | - o.setCreateTime(null); | |
| 119 | - }); | |
| 120 | - pluginInfoMapper.insert(dbPluginInfo); | |
| 121 | - // 测试 pluginId 不匹配 | |
| 122 | - pluginInfoMapper.insert(cloneIgnoreId(dbPluginInfo, o -> o.setPluginId(null))); | |
| 123 | - // 测试 name 不匹配 | |
| 124 | - pluginInfoMapper.insert(cloneIgnoreId(dbPluginInfo, o -> o.setName(null))); | |
| 125 | - // 测试 description 不匹配 | |
| 126 | - pluginInfoMapper.insert(cloneIgnoreId(dbPluginInfo, o -> o.setDescription(null))); | |
| 127 | - // 测试 deployType 不匹配 | |
| 128 | - pluginInfoMapper.insert(cloneIgnoreId(dbPluginInfo, o -> o.setDeployType(null))); | |
| 129 | - // 测试 file 不匹配 | |
| 130 | - pluginInfoMapper.insert(cloneIgnoreId(dbPluginInfo, o -> o.setFile(null))); | |
| 131 | - // 测试 version 不匹配 | |
| 132 | - pluginInfoMapper.insert(cloneIgnoreId(dbPluginInfo, o -> o.setVersion(null))); | |
| 133 | - // 测试 type 不匹配 | |
| 134 | - pluginInfoMapper.insert(cloneIgnoreId(dbPluginInfo, o -> o.setType(null))); | |
| 135 | - // 测试 protocol 不匹配 | |
| 136 | - pluginInfoMapper.insert(cloneIgnoreId(dbPluginInfo, o -> o.setProtocol(null))); | |
| 137 | - // 测试 state 不匹配 | |
| 138 | - pluginInfoMapper.insert(cloneIgnoreId(dbPluginInfo, o -> o.setStatus(null))); | |
| 139 | - // 测试 configSchema 不匹配 | |
| 140 | - pluginInfoMapper.insert(cloneIgnoreId(dbPluginInfo, o -> o.setConfigSchema(null))); | |
| 141 | - // 测试 config 不匹配 | |
| 142 | - pluginInfoMapper.insert(cloneIgnoreId(dbPluginInfo, o -> o.setConfig(null))); | |
| 143 | - // 测试 script 不匹配 | |
| 144 | - pluginInfoMapper.insert(cloneIgnoreId(dbPluginInfo, o -> o.setScript(null))); | |
| 145 | - // 测试 createTime 不匹配 | |
| 146 | - pluginInfoMapper.insert(cloneIgnoreId(dbPluginInfo, o -> o.setCreateTime(null))); | |
| 147 | - // 准备参数 | |
| 148 | - PluginInfoPageReqVO reqVO = new PluginInfoPageReqVO(); | |
| 149 | - reqVO.setPluginId(null); | |
| 150 | - reqVO.setName(null); | |
| 151 | - reqVO.setDescription(null); | |
| 152 | - reqVO.setDeployType(null); | |
| 153 | - reqVO.setFile(null); | |
| 154 | - reqVO.setVersion(null); | |
| 155 | - reqVO.setType(null); | |
| 156 | - reqVO.setProtocol(null); | |
| 157 | - reqVO.setStatus(null); | |
| 158 | - reqVO.setConfigSchema(null); | |
| 159 | - reqVO.setConfig(null); | |
| 160 | - reqVO.setScript(null); | |
| 161 | - reqVO.setCreateTime(buildBetweenTime(2023, 2, 1, 2023, 2, 28)); | |
| 162 | - | |
| 163 | - // 调用 | |
| 164 | - PageResult<PluginInfoDO> pageResult = pluginInfoService.getPluginInfoPage(reqVO); | |
| 165 | - // 断言 | |
| 166 | - assertEquals(1, pageResult.getTotal()); | |
| 167 | - assertEquals(1, pageResult.getList().size()); | |
| 168 | - assertPojoEquals(dbPluginInfo, pageResult.getList().get(0)); | |
| 169 | - } | |
| 170 | - | |
| 171 | -} | |
| 172 | 0 | \ No newline at end of file |
yudao-module-iot/yudao-module-iot-biz/src/test/java/cn/iocoder/yudao/module/iot/service/plugininstance/PluginInstanceServiceImplTest.java deleted
| 1 | -package cn.iocoder.yudao.module.iot.service.plugininstance; | |
| 2 | - | |
| 3 | -import org.junit.jupiter.api.Disabled; | |
| 4 | -import org.junit.jupiter.api.Test; | |
| 5 | -import org.springframework.boot.test.mock.mockito.MockBean; | |
| 6 | - | |
| 7 | -import jakarta.annotation.Resource; | |
| 8 | - | |
| 9 | -import cn.iocoder.yudao.framework.test.core.ut.BaseDbUnitTest; | |
| 10 | - | |
| 11 | -import cn.iocoder.yudao.module.iot.controller.admin.plugininstance.vo.*; | |
| 12 | -import cn.iocoder.yudao.module.iot.dal.dataobject.plugininstance.PluginInstanceDO; | |
| 13 | -import cn.iocoder.yudao.module.iot.dal.mysql.plugininstance.PluginInstanceMapper; | |
| 14 | -import cn.iocoder.yudao.framework.common.pojo.PageResult; | |
| 15 | - | |
| 16 | -import jakarta.annotation.Resource; | |
| 17 | -import org.springframework.context.annotation.Import; | |
| 18 | -import java.util.*; | |
| 19 | -import java.time.LocalDateTime; | |
| 20 | - | |
| 21 | -import static cn.hutool.core.util.RandomUtil.*; | |
| 22 | -import static cn.iocoder.yudao.module.iot.enums.ErrorCodeConstants.*; | |
| 23 | -import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.*; | |
| 24 | -import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.*; | |
| 25 | -import static cn.iocoder.yudao.framework.common.util.date.LocalDateTimeUtils.*; | |
| 26 | -import static cn.iocoder.yudao.framework.common.util.object.ObjectUtils.*; | |
| 27 | -import static cn.iocoder.yudao.framework.common.util.date.DateUtils.*; | |
| 28 | -import static org.junit.jupiter.api.Assertions.*; | |
| 29 | -import static org.mockito.Mockito.*; | |
| 30 | - | |
| 31 | -/** | |
| 32 | - * {@link PluginInstanceServiceImpl} 的单元测试类 | |
| 33 | - * | |
| 34 | - * @author 芋道源码 | |
| 35 | - */ | |
| 36 | -@Import(PluginInstanceServiceImpl.class) | |
| 37 | -public class PluginInstanceServiceImplTest extends BaseDbUnitTest { | |
| 38 | - | |
| 39 | - @Resource | |
| 40 | - private PluginInstanceServiceImpl pluginInstanceService; | |
| 41 | - | |
| 42 | - @Resource | |
| 43 | - private PluginInstanceMapper pluginInstanceMapper; | |
| 44 | - | |
| 45 | - @Test | |
| 46 | - public void testCreatePluginInstance_success() { | |
| 47 | - // 准备参数 | |
| 48 | - PluginInstanceSaveReqVO createReqVO = randomPojo(PluginInstanceSaveReqVO.class).setId(null); | |
| 49 | - | |
| 50 | - // 调用 | |
| 51 | - Long pluginInstanceId = pluginInstanceService.createPluginInstance(createReqVO); | |
| 52 | - // 断言 | |
| 53 | - assertNotNull(pluginInstanceId); | |
| 54 | - // 校验记录的属性是否正确 | |
| 55 | - PluginInstanceDO pluginInstance = pluginInstanceMapper.selectById(pluginInstanceId); | |
| 56 | - assertPojoEquals(createReqVO, pluginInstance, "id"); | |
| 57 | - } | |
| 58 | - | |
| 59 | - @Test | |
| 60 | - public void testUpdatePluginInstance_success() { | |
| 61 | - // mock 数据 | |
| 62 | - PluginInstanceDO dbPluginInstance = randomPojo(PluginInstanceDO.class); | |
| 63 | - pluginInstanceMapper.insert(dbPluginInstance);// @Sql: 先插入出一条存在的数据 | |
| 64 | - // 准备参数 | |
| 65 | - PluginInstanceSaveReqVO updateReqVO = randomPojo(PluginInstanceSaveReqVO.class, o -> { | |
| 66 | - o.setId(dbPluginInstance.getId()); // 设置更新的 ID | |
| 67 | - }); | |
| 68 | - | |
| 69 | - // 调用 | |
| 70 | - pluginInstanceService.updatePluginInstance(updateReqVO); | |
| 71 | - // 校验是否更新正确 | |
| 72 | - PluginInstanceDO pluginInstance = pluginInstanceMapper.selectById(updateReqVO.getId()); // 获取最新的 | |
| 73 | - assertPojoEquals(updateReqVO, pluginInstance); | |
| 74 | - } | |
| 75 | - | |
| 76 | - @Test | |
| 77 | - public void testUpdatePluginInstance_notExists() { | |
| 78 | - // 准备参数 | |
| 79 | - PluginInstanceSaveReqVO updateReqVO = randomPojo(PluginInstanceSaveReqVO.class); | |
| 80 | - | |
| 81 | - // 调用, 并断言异常 | |
| 82 | - assertServiceException(() -> pluginInstanceService.updatePluginInstance(updateReqVO), PLUGIN_INSTANCE_NOT_EXISTS); | |
| 83 | - } | |
| 84 | - | |
| 85 | - @Test | |
| 86 | - public void testDeletePluginInstance_success() { | |
| 87 | - // mock 数据 | |
| 88 | - PluginInstanceDO dbPluginInstance = randomPojo(PluginInstanceDO.class); | |
| 89 | - pluginInstanceMapper.insert(dbPluginInstance);// @Sql: 先插入出一条存在的数据 | |
| 90 | - // 准备参数 | |
| 91 | - Long id = dbPluginInstance.getId(); | |
| 92 | - | |
| 93 | - // 调用 | |
| 94 | - pluginInstanceService.deletePluginInstance(id); | |
| 95 | - // 校验数据不存在了 | |
| 96 | - assertNull(pluginInstanceMapper.selectById(id)); | |
| 97 | - } | |
| 98 | - | |
| 99 | - @Test | |
| 100 | - public void testDeletePluginInstance_notExists() { | |
| 101 | - // 准备参数 | |
| 102 | - Long id = randomLongId(); | |
| 103 | - | |
| 104 | - // 调用, 并断言异常 | |
| 105 | - assertServiceException(() -> pluginInstanceService.deletePluginInstance(id), PLUGIN_INSTANCE_NOT_EXISTS); | |
| 106 | - } | |
| 107 | - | |
| 108 | - @Test | |
| 109 | - @Disabled // TODO 请修改 null 为需要的值,然后删除 @Disabled 注解 | |
| 110 | - public void testGetPluginInstancePage() { | |
| 111 | - // mock 数据 | |
| 112 | - PluginInstanceDO dbPluginInstance = randomPojo(PluginInstanceDO.class, o -> { // 等会查询到 | |
| 113 | - o.setMainId(null); | |
| 114 | - o.setPluginId(null); | |
| 115 | - o.setIp(null); | |
| 116 | - o.setPort(null); | |
| 117 | - o.setHeartbeatAt(null); | |
| 118 | - o.setCreateTime(null); | |
| 119 | - }); | |
| 120 | - pluginInstanceMapper.insert(dbPluginInstance); | |
| 121 | - // 测试 mainId 不匹配 | |
| 122 | - pluginInstanceMapper.insert(cloneIgnoreId(dbPluginInstance, o -> o.setMainId(null))); | |
| 123 | - // 测试 pluginId 不匹配 | |
| 124 | - pluginInstanceMapper.insert(cloneIgnoreId(dbPluginInstance, o -> o.setPluginId(null))); | |
| 125 | - // 测试 ip 不匹配 | |
| 126 | - pluginInstanceMapper.insert(cloneIgnoreId(dbPluginInstance, o -> o.setIp(null))); | |
| 127 | - // 测试 port 不匹配 | |
| 128 | - pluginInstanceMapper.insert(cloneIgnoreId(dbPluginInstance, o -> o.setPort(null))); | |
| 129 | - // 测试 heartbeatAt 不匹配 | |
| 130 | - pluginInstanceMapper.insert(cloneIgnoreId(dbPluginInstance, o -> o.setHeartbeatAt(null))); | |
| 131 | - // 测试 createTime 不匹配 | |
| 132 | - pluginInstanceMapper.insert(cloneIgnoreId(dbPluginInstance, o -> o.setCreateTime(null))); | |
| 133 | - // 准备参数 | |
| 134 | - PluginInstancePageReqVO reqVO = new PluginInstancePageReqVO(); | |
| 135 | - reqVO.setMainId(null); | |
| 136 | - reqVO.setPluginId(null); | |
| 137 | - reqVO.setIp(null); | |
| 138 | - reqVO.setPort(null); | |
| 139 | - reqVO.setHeartbeatAt(null); | |
| 140 | - reqVO.setCreateTime(buildBetweenTime(2023, 2, 1, 2023, 2, 28)); | |
| 141 | - | |
| 142 | - // 调用 | |
| 143 | - PageResult<PluginInstanceDO> pageResult = pluginInstanceService.getPluginInstancePage(reqVO); | |
| 144 | - // 断言 | |
| 145 | - assertEquals(1, pageResult.getTotal()); | |
| 146 | - assertEquals(1, pageResult.getList().size()); | |
| 147 | - assertPojoEquals(dbPluginInstance, pageResult.getList().get(0)); | |
| 148 | - } | |
| 149 | - | |
| 150 | -} | |
| 151 | 0 | \ No newline at end of file |