Compare commits

...

5 Commits

Author SHA1 Message Date
bd6f4c2ed6 refactor(iot): 重构物联网模块代码
- 优化设备管理相关代码,调整数据结构
- 改进产品管理功能,增加数据校验
- 重构事件和服务相关代码,提高可维护性
- 优化记录数据处理逻辑,使用Lambda查询
-调整数据库表结构,使用BigSerial类型
2025-01-08 10:09:54 +08:00
5e49367cf5 refactor(test): 重构测试用例并添加备注字段
- 在 DeviceServiceTest、EventServiceTest、ParamServiceTest、PropertyServiceTest 和 ServeServiceTest 中添加备注字段- 移除了未使用的导入语句
- 删除了 UserServiceTest 中的注释代码
2025-01-08 10:07:39 +08:00
c97e485305 test(system): 重构系统模块测试用例
- 更新了 Dept、Role 和 User 相关的测试用例
- 优化了测试数据的初始化和清理逻辑
- 调整了部分测试方法的实现方式,提高了可读性和维护性
- 移除了未使用的测试用例和冗余代码
2025-01-07 16:32:45 +08:00
6161f8abfb test(iot): 新增 IoT相关测试用例
- 新增 Device、Event、Product、Property 相关的测试用例- 更新 Param 相关的测试用例
- 新增对应的 Builder 类方便测试数据的构建
- 优化测试用例的结构,增加 setup 和 teardown 方法
2025-01-06 14:24:47 +08:00
4d58a790ab test: 添加 IoT 和 notice 模块的测试用例
- 新增 Device、Product、Serve 和 Message 相关的测试用例- 更新 Authority 和 Bulletin 服务的测试用例
- 修复 Param 服务的更新逻辑
2025-01-06 01:19:34 +08:00
87 changed files with 2089 additions and 448 deletions

View File

@ -65,6 +65,7 @@ public class ApiExceptionHandler {
return new ResponseEntity<>(objectMapper.writeValueAsString(Map.of("msg", ex.getMessage())), HttpStatus.INTERNAL_SERVER_ERROR);
}
//TODO 冲突
@ExceptionHandler(value = {Exception.class})
public ResponseEntity<Object> handleException(Exception ex) throws JsonProcessingException {
log.error("Exception: {}", objectMapper.writeValueAsString(Map.of("msg", ex.getMessage())));

View File

@ -5,6 +5,9 @@ import org.springframework.boot.autoconfigure.jackson.Jackson2ObjectMapperBuilde
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* @author veryao
*/
@Configuration
public class JsonConfig {

View File

@ -0,0 +1,61 @@
package com.zsc.edu.gateway.framework.json;
import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.stereotype.Component;
import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.Map;
/**
* @author zhuang
*/
@Component
public class MapJsonTypeHandler extends BaseTypeHandler<Map<String, Object>> {
private static final ObjectMapper objectMapper = new ObjectMapper();
@Override
public void setNonNullParameter(PreparedStatement ps, int i, Map<String, Object> parameter, JdbcType jdbcType) throws SQLException {
try {
ps.setString(i, objectMapper.writeValueAsString(parameter));
} catch (JsonProcessingException e) {
throw new SQLException("Error converting map to JSON", e);
}
}
@Override
public Map<String, Object> getNullableResult(ResultSet rs, String columnName) throws SQLException {
String json = rs.getString(columnName);
return parseJson(json);
}
@Override
public Map<String, Object> getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
String json = rs.getString(columnIndex);
return parseJson(json);
}
@Override
public Map<String, Object> getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
String json = cs.getString(columnIndex);
return parseJson(json);
}
private Map<String, Object> parseJson(String json) {
if (json == null) {
return null;
}
try {
return objectMapper.readValue(json, HashMap.class);
} catch (Exception e) {
throw new RuntimeException("Error parsing JSON to map", e);
}
}
}

View File

@ -23,9 +23,8 @@ public class MybatisPlusConfig {
// // 添加自定义的数据权限处理器
// dataPermissionInterceptor.setDataPermissionHandler(new MyDataPermissionHandler());
// interceptor.addInnerInterceptor(dataPermissionInterceptor);
return interceptor;
}
}

View File

@ -11,6 +11,7 @@ import org.springframework.security.authentication.dao.DaoAuthenticationProvider
import org.springframework.security.authorization.AuthorizationDecision;
import org.springframework.security.config.annotation.method.configuration.EnableMethodSecurity;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.core.session.SessionRegistry;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
@ -32,6 +33,7 @@ import javax.sql.DataSource;
@AllArgsConstructor
@EnableMethodSecurity
@Configuration
@EnableWebSecurity
public class SpringSecurityConfig {
private final UserDetailsService userDetailsService;

View File

@ -1,12 +1,11 @@
package com.zsc.edu.gateway.modules.iot.device.controller;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.zsc.edu.gateway.modules.iot.device.dto.BatchDeviceDto;
import com.zsc.edu.gateway.modules.iot.device.dto.DeviceDto;
import com.zsc.edu.gateway.modules.iot.device.dto.DeviceServeDto;
import com.zsc.edu.gateway.modules.iot.device.entity.Device;
import com.zsc.edu.gateway.modules.iot.device.entity.DeviceSelect;
import com.zsc.edu.gateway.modules.iot.device.entity.DeviceDiff;
import com.zsc.edu.gateway.modules.iot.device.query.DeviceQuery;
import com.zsc.edu.gateway.modules.iot.device.service.DeviceService;
import com.zsc.edu.gateway.modules.iot.device.vo.DeviceVo;
@ -108,7 +107,7 @@ public class DeviceController {
* 根据名称模糊查询
*/
@GetMapping("/query")
public List<DeviceSelect> query(String name) {
public List<DeviceDiff> query(String name) {
return service.queryByName(name);
}
}

View File

@ -8,6 +8,8 @@ import lombok.NoArgsConstructor;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import java.util.Map;
/**
* @author yao
*/
@ -31,11 +33,11 @@ public class BatchDeviceDto {
/**
* 扩展属性
*/
private String extendParams;
private Map<String, Object> extendParams;
/**
* 设备物模型属性
*/
private String properties;
private Map<String, Object> properties;
/**
* 固件版本
*/
@ -47,6 +49,11 @@ public class BatchDeviceDto {
/**
* 所属产品
*/
@NotBlank(message = "所属产品不为空")
private Long productId;
/**
* 备注
*/
private String remark;
}

View File

@ -7,6 +7,8 @@ import lombok.NoArgsConstructor;
import jakarta.validation.constraints.NotBlank;
import java.util.Map;
/**
* @author 15864
*/
@ -34,17 +36,21 @@ public class DeviceDto {
/**
* 扩展属性
*/
private String extendParams;
private Map<String, Object> extendParams;
/**
* 设备物模型属性
*/
private String properties;
private Map<String, Object> properties;
/**
* 所属产品
*/
private Long productId;
/**
* 备注
*/
private String remark;
}

View File

@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.annotation.IEnum;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import com.zsc.edu.gateway.common.enums.IState;
import com.zsc.edu.gateway.framework.json.MapJsonTypeHandler;
import com.zsc.edu.gateway.modules.iot.product.entity.Product;
import com.zsc.edu.gateway.modules.system.entity.BaseEntity;
import lombok.AllArgsConstructor;
@ -11,7 +12,7 @@ import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import java.util.Objects;
import java.util.Map;
/**
* @author 15864
@ -60,16 +61,17 @@ public class Device extends BaseEntity {
*/
private String clientId;
/**
* 扩展配置
*/
private String extendParams = "";
@TableField(typeHandler = MapJsonTypeHandler.class)
private Map<String, Object> extendParams;
/**
* 设备属性
*/
private String properties = "";
@TableField(typeHandler = MapJsonTypeHandler.class)
private Map<String, Object> properties;
/**
* 所属产品ID

View File

@ -12,7 +12,7 @@ import lombok.Setter;
@Getter
@NoArgsConstructor
@AllArgsConstructor
public class DeviceSelect {
public class DeviceDiff {
/**
* 设备ID
*/

View File

@ -1,12 +1,8 @@
package com.zsc.edu.gateway.modules.iot.device.repo;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.zsc.edu.gateway.modules.iot.device.entity.Device;
import com.zsc.edu.gateway.modules.iot.device.query.DeviceQuery;
import com.zsc.edu.gateway.modules.iot.device.vo.DeviceVo;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
@ -18,11 +14,9 @@ public interface DeviceRepository extends BaseMapper<Device> {
@Select("select * from iot_device where name=#{name}")
Device findByName(@Param("name") String name);
IPage<DeviceVo> query(Page<DeviceVo> page, @Param("query") DeviceQuery query);
DeviceVo findById(@Param("id") Long id);
@Select("select * from iot_device where client_id=#{clientId} and status=#{status} and online=#{online}")
@Select("select * from iot_device where client_id=#{clientId} and state=#{status} and online=#{online}")
Device findByClientIdAndStateAndOnline(@Param("clientId") String clientId,
@Param("status") Device.Status status,
@Param("online") Boolean online);

View File

@ -7,7 +7,7 @@ import com.zsc.edu.gateway.modules.iot.device.dto.BatchDeviceDto;
import com.zsc.edu.gateway.modules.iot.device.dto.DeviceDto;
import com.zsc.edu.gateway.modules.iot.device.dto.DeviceServeDto;
import com.zsc.edu.gateway.modules.iot.device.entity.Device;
import com.zsc.edu.gateway.modules.iot.device.entity.DeviceSelect;
import com.zsc.edu.gateway.modules.iot.device.entity.DeviceDiff;
import com.zsc.edu.gateway.modules.iot.device.query.DeviceQuery;
import com.zsc.edu.gateway.modules.iot.device.vo.DeviceVo;
@ -23,11 +23,9 @@ public interface DeviceService extends IService<Device> {
Device update(DeviceDto dto, Long id);
IPage<DeviceVo> query(Page<DeviceVo> page, DeviceQuery query);
DeviceVo detail(Long id);
Boolean serve(DeviceServeDto dto);
List<DeviceSelect> queryByName(String name);
List<DeviceDiff> queryByName(String name);
}

View File

@ -11,7 +11,7 @@ import com.zsc.edu.gateway.modules.iot.device.dto.BatchDeviceDto;
import com.zsc.edu.gateway.modules.iot.device.dto.DeviceDto;
import com.zsc.edu.gateway.modules.iot.device.dto.DeviceServeDto;
import com.zsc.edu.gateway.modules.iot.device.entity.Device;
import com.zsc.edu.gateway.modules.iot.device.entity.DeviceSelect;
import com.zsc.edu.gateway.modules.iot.device.entity.DeviceDiff;
import com.zsc.edu.gateway.modules.iot.device.mapper.DeviceMapper;
import com.zsc.edu.gateway.modules.iot.device.query.DeviceQuery;
import com.zsc.edu.gateway.modules.iot.device.repo.DeviceRepository;
@ -61,26 +61,27 @@ public class DeviceServiceImpl extends ServiceImpl<DeviceRepository, Device> imp
*/
@Override
public List<Device> batchCreate(BatchDeviceDto dto) {
List<Device> devices = new ArrayList<>();
if (dto.getNum() == null || dto.getNum() <= 0) {
throw new ConstraintException("设备数量必须大于0");
}
if (dto.getPrefix() == null) {
throw new ConstraintException("前缀不能为空!");
}
if (dto.getProductId() == null) {
throw new ConstraintException("产品ID不能为空");
}
// 获取产品信息
Product product = productRepo.selectById(dto.getProductId());
if (product == null) {
throw new ConstraintException("该产品不存在!");
}
// 生成设备名称列表
List<String> names = new ArrayList<>();
for (int i = 0; i < dto.getNum(); i++) {
String name = String.format("%s%05d", dto.getPrefix(), i + 1);
names.add(name);
DeviceDto deviceDto = new DeviceDto();
deviceDto.setName(name);
deviceDto.setProductId(product.getId());
deviceDto.setExtendParams(dto.getExtendParams());
deviceDto.setProperties(dto.getProperties());
deviceDto.setFirmwareVersion(dto.getFirmwareVersion());
Device device = mapper.toEntity(deviceDto);
Integer typeCode = Integer.valueOf(product.getProductType());
device.setClientId(String.format("%s%02d%02d%05d", "001", typeCode, 3, i + 1));
devices.add(device);
}
// 检查设备名称是否已存在
LambdaQueryWrapper<Device> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.in(Device::getName, names);
List<Device> existingDevices = baseMapper.selectList(queryWrapper);
@ -90,35 +91,43 @@ public class DeviceServiceImpl extends ServiceImpl<DeviceRepository, Device> imp
.collect(Collectors.toList());
throw new ConstraintException("设备已存在!已存在的设备名称: " + String.join(", ", existingNames));
}
// 创建设备列表
List<Device> devices = new ArrayList<>();
for (int i = 0; i < dto.getNum(); i++) {
String name = String.format("%s%05d", dto.getPrefix(), i + 1);
DeviceDto deviceDto = new DeviceDto();
deviceDto.setName(name);
deviceDto.setProductId(product.getId());
deviceDto.setExtendParams(dto.getExtendParams());
deviceDto.setProperties(dto.getProperties());
deviceDto.setFirmwareVersion(dto.getFirmwareVersion());
deviceDto.setHardwareVersion(dto.getHardwareVersion());
Device device = mapper.toEntity(deviceDto);
String productType = product.getProductType();
int typeCode = Math.abs(productType.hashCode()) % 100;
device.setClientId(String.format("%s%02d%02d%05d", "001", typeCode, 3, i + 1));
devices.add(device);
}
// 批量插入设备
baseMapper.insert(devices);
return devices;
}
/**
* 更新设备
*/
@Override
public Device update(DeviceDto dto, Long id) {
Device device = baseMapper.selectById(id);
if (device.getName().equals(dto.getName())) {
throw new ConstraintException("deviceName", dto.getName(), "设备名称已存在");
if (Objects.equals(device.getName(), dto.getName())) {
throw new ConstraintException("名称为" + dto.getName() + "的设备已存在");
}
mapper.convert(dto, device);
updateById(device);
return device;
}
/**
* 分页查询设备
*
* @param query 查询表单
* @param page 分页参数
*/
@Override
public IPage<DeviceVo> query(Page<DeviceVo> page, DeviceQuery query) {
return baseMapper.query(page, query);
}
/**
* 通过Id查找设备详情
*
@ -149,10 +158,10 @@ public class DeviceServiceImpl extends ServiceImpl<DeviceRepository, Device> imp
}
@Override
public List<DeviceSelect> queryByName(String name) {
public List<DeviceDiff> queryByName(String name) {
LambdaQueryWrapper<Device> query = new LambdaQueryWrapper<>();
query.like(StringUtils.hasText(name), Device::getName, name);
List<Device> devices = baseMapper.selectList(query);
return devices.stream().map(device -> new DeviceSelect(device.getId(), device.getName())).collect(Collectors.toList());
return devices.stream().map(device -> new DeviceDiff(device.getId(), device.getName())).collect(Collectors.toList());
}
}

View File

@ -8,6 +8,7 @@ import com.zsc.edu.gateway.modules.iot.tsl.entity.Param;
import lombok.Data;
import java.time.LocalDateTime;
import java.util.Map;
import java.util.Set;
/**
@ -60,12 +61,12 @@ public class DeviceVo {
/**
* 扩展配置
*/
private String extendParams = "";
private Map<String, Object> extendParams;
/**
* 设备属性
*/
private String properties = "";
private Map<String, Object> properties;
/**
* 备注说明

View File

@ -70,7 +70,7 @@ public class ProductController {
* @return 部门列表
*/
@GetMapping("fuzzy")
@PreAuthorize("hasAnyAuthority('DEVICE_CREATE', 'DEVICE_UPDATE')")
// @PreAuthorize("hasAnyAuthority('DEVICE_CREATE', 'DEVICE_UPDATE')")
public Page<Product> fuzzyQuery(Page<Product> page, ProductQuery query) {
return service.page(page, query.wrapper());
}

View File

@ -26,7 +26,7 @@ public class ProductQuery {
/**
* 接入方式
*/
public List<String> links;
public List<Product.LinkType> links;
public LambdaQueryWrapper<Product> wrapper() {
LambdaQueryWrapper<Product> queryWrapper = new LambdaQueryWrapper<>();

View File

@ -1,26 +1,17 @@
package com.zsc.edu.gateway.modules.iot.product.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.zsc.edu.gateway.exception.ConstraintException;
import com.zsc.edu.gateway.modules.iot.product.dto.ProductDto;
import com.zsc.edu.gateway.modules.iot.product.entity.Product;
import com.zsc.edu.gateway.modules.iot.product.mapper.ProductMapper;
import com.zsc.edu.gateway.modules.iot.product.query.ProductQuery;
import com.zsc.edu.gateway.modules.iot.product.repo.ProductRepository;
import com.zsc.edu.gateway.modules.iot.product.service.ProductService;
import com.zsc.edu.gateway.modules.iot.tsl.dto.ParamDto;
import com.zsc.edu.gateway.modules.iot.tsl.entity.Param;
import com.zsc.edu.gateway.modules.iot.tsl.mapper.ParamMapper;
import com.zsc.edu.gateway.modules.iot.tsl.repo.ParamRepository;
import com.zsc.edu.gateway.modules.iot.tsl.service.ParamService;
import lombok.AllArgsConstructor;
import org.springframework.stereotype.Service;
import java.util.List;
import java.util.stream.Collectors;
/**
* @author zhaung
@ -43,8 +34,11 @@ public class ProductServiceImpl extends ServiceImpl<ProductRepository, Product>
throw new ConstraintException("设备名称不能为空!");
}
Product product = mapper.toEntity(dto);
product.setId(null);
save(product);
paramService.create(dto.getParams(), product.getId(), Param.ForeignType.PRODUCT);
if (dto.getParams() != null) {
paramService.create(dto.getParams(), product.getId(), Param.ForeignType.PRODUCT);
}
return product;
}
/**
@ -64,7 +58,11 @@ public class ProductServiceImpl extends ServiceImpl<ProductRepository, Product>
@Override
public Product detail(Long id) {
return baseMapper.selectById(id);
Product product = baseMapper.selectById(id);
if (product == null) {
throw new RuntimeException("产品不存在请检查产品ID是否正确");
}
return product;
}
/**

View File

@ -1,9 +1,12 @@
package com.zsc.edu.gateway.modules.iot.record.entity;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.zsc.edu.gateway.framework.json.MapJsonTypeHandler;
import lombok.*;
import java.util.Date;
import java.time.LocalDateTime;
import java.util.Map;
/**
@ -13,6 +16,7 @@ import java.util.Map;
@Getter
@NoArgsConstructor
@AllArgsConstructor
@TableName("iot_record_data")
public class RecordData {
@TableId
private String id;
@ -21,7 +25,8 @@ public class RecordData {
private String attachmentId;
@TableField(typeHandler = MapJsonTypeHandler.class)
private Map<String, Object> content;
private Date recordTime;
private LocalDateTime recordTime;
}

View File

@ -2,6 +2,7 @@ package com.zsc.edu.gateway.modules.iot.record.repo;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.zsc.edu.gateway.modules.iot.record.entity.RecordData;
import org.apache.ibatis.annotations.Select;
import java.time.LocalDateTime;
import java.util.List;
@ -10,8 +11,7 @@ import java.util.List;
* @author zhuang
*/
public interface RecordDataRepository extends BaseMapper<RecordData> {
List<RecordData> findAllByClientIdAndRecordTimeAfter(String clientId, LocalDateTime recordTime);
@Select("select * from iot_record_data where record_time_str = #{recordTimeStr}")
List<RecordData> findByRecordTimeStr(String recordTimeStr);

View File

@ -15,4 +15,4 @@ public interface RecordDataService extends IService<RecordData> {
List<RecordData> page(IPage<RecordData> page, String clientId);
List<RecordData> recordPhoto(String clientId);
}
}

View File

@ -20,7 +20,7 @@ import java.util.Optional;
*/
@AllArgsConstructor
@Service
public class RecordDataDataServiceImpl extends ServiceImpl<RecordDataRepository, RecordData> implements RecordDataService {
public class RecordDataServiceImpl extends ServiceImpl<RecordDataRepository, RecordData> implements RecordDataService {
RedisUtils redisUtils;
@Override
public RecordData create(RecordData record) {
@ -37,10 +37,12 @@ public class RecordDataDataServiceImpl extends ServiceImpl<RecordDataRepository,
return baseMapper.selectList(page, queryWrapper);
}
//TODO 使用Redis
@Override
public List<RecordData> recordPhoto(String clientId) {
LocalDateTime recordTime = LocalDateTime.parse(redisUtils.get("serve:sendTime:photograph:" + clientId));
List<RecordData> records = baseMapper.findAllByClientIdAndRecordTimeAfter(clientId, recordTime);
List<RecordData> records = baseMapper.selectList(new LambdaQueryWrapper<RecordData>()
.eq(RecordData::getClientId, clientId).le(RecordData::getRecordTime, recordTime));
Optional<RecordData> first = records.stream().max(Comparator.comparing(RecordData::getRecordTime));
if (first.isPresent()) {
String recordTimeStr = (String) first.get().getContent().get("recordTimeStr");
@ -48,6 +50,5 @@ public class RecordDataDataServiceImpl extends ServiceImpl<RecordDataRepository,
} else {
return records;
}
}
}

View File

@ -75,6 +75,6 @@ public class PropertyController {
*/
@GetMapping("{id}")
public Property detail(@PathVariable("id") Long id) {
return service.getById(id);
return service.detail(id);
}
}

View File

@ -22,6 +22,8 @@ public class EventDto {
public String identifier;
public String remark;
public Event.Type type;
private List<ParamDto> outputs;

View File

@ -18,6 +18,8 @@ public class ParamDto {
public String identifier;
public String remark;
public DataType dataType;
public Param.Type type;

View File

@ -20,6 +20,8 @@ public class PropertyDto {
public String identifier;
public String remark;
public DataType dataType;
public Property.IoType ioType;

View File

@ -21,6 +21,8 @@ public class ServeDto {
public String identifier;
public String remark;
private List<ParamDto> inputs;
private List<ParamDto> outputs;
}

View File

@ -1,5 +1,7 @@
package com.zsc.edu.gateway.modules.iot.tsl.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.AllArgsConstructor;
import lombok.Getter;
@ -20,6 +22,7 @@ public class BaseParam implements Serializable {
/**
* 序列化主键有数据库提供非自增
*/
@TableId(type = IdType.AUTO)
private Long id;
/**

View File

@ -40,7 +40,7 @@ public class EventQuery {
public LambdaQueryWrapper<Event> wrapper() {
LambdaQueryWrapper<Event> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.like(StringUtils.hasText(this.name), Event::getName, this.name);
queryWrapper.eq(StringUtils.hasText(this.identifier), Event::getIdentifier, this.identifier);
queryWrapper.like(StringUtils.hasText(this.identifier), Event::getIdentifier, this.identifier);
queryWrapper.eq(StringUtils.hasText(this.level), Event::getType, this.level);
queryWrapper.eq(Objects.nonNull(this.productId), Event::getProductId, this.productId);
return queryWrapper;

View File

@ -37,8 +37,8 @@ public class PropertyQuery {
public LambdaQueryWrapper<Property> wrapper() {
LambdaQueryWrapper<Property> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(this.type != null, Property::getIoType, this.type);
queryWrapper.eq(StringUtils.hasText(this.identifier), Property::getIdentifier, this.identifier);
queryWrapper.like(Objects.nonNull(this.productId), Property::getProductId, this.productId);
queryWrapper.like(StringUtils.hasText(this.identifier), Property::getIdentifier, this.identifier);
queryWrapper.eq(Objects.nonNull(this.productId), Property::getProductId, this.productId);
queryWrapper.like(StringUtils.hasText(this.name), Property::getName, this.name);
return queryWrapper;
}

View File

@ -32,7 +32,7 @@ public class ServeQuery {
public LambdaQueryWrapper<Serve> wrapper() {
LambdaQueryWrapper<Serve> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.like(StringUtils.hasText(this.name), Serve::getName, this.name);
queryWrapper.eq(StringUtils.hasText(this.identifier), Serve::getIdentifier, this.identifier);
queryWrapper.like(StringUtils.hasText(this.identifier), Serve::getIdentifier, this.identifier);
queryWrapper.eq(Objects.nonNull(this.productId), Serve::getProductId, this.productId);
return queryWrapper;
}

View File

@ -8,6 +8,7 @@ import com.zsc.edu.gateway.modules.iot.tsl.entity.Event;
import com.zsc.edu.gateway.modules.iot.tsl.entity.Property;
import com.zsc.edu.gateway.modules.iot.tsl.query.PropertyQuery;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import java.util.List;
@ -16,8 +17,6 @@ import java.util.List;
*/
public interface PropertyRepository extends BaseMapper<Property> {
// IPage<Property> page(Page<Property> page, @Param("query") PropertyQuery query);
Property selectById(@Param("id") Long id);
@Select("select * from iot_property where name=#{name}")
Property findByName(@Param("name") String name);
}

View File

@ -16,4 +16,5 @@ public interface PropertyService extends IService<Property> {
Property update(PropertyDto dto, Long id);
Property detail(Long id);
}

View File

@ -59,7 +59,11 @@ public class EventServiceImpl extends ServiceImpl<EventRepository, Event> implem
*/
@Override
public Event detail(Long id) {
return baseMapper.selectById(id);
Event event = baseMapper.selectById(id);
if (event == null) {
throw new ConstraintException("该事件不存在请检查输入ID是否正确");
}
return event;
}
/**

View File

@ -8,6 +8,7 @@ import com.zsc.edu.gateway.modules.iot.tsl.repo.PropertyRepository;
import com.zsc.edu.gateway.modules.iot.tsl.service.PropertyService;
import lombok.AllArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
/**
* @author 15864
@ -23,6 +24,9 @@ public class PropertyServiceImpl extends ServiceImpl<PropertyRepository, Propert
*/
@Override
public Property create(PropertyDto dto) {
if (baseMapper.findByName(dto.getName()) != null) {
throw new RuntimeException("该属性已存在!");
}
Property property = mapper.toEntity(dto);
save(property);
return property;
@ -32,13 +36,23 @@ public class PropertyServiceImpl extends ServiceImpl<PropertyRepository, Propert
* 更新属性
*/
@Override
@Transactional
public Property update(PropertyDto dto, Long id) {
Property property = baseMapper.selectById(id);
if (property == null) {
throw new RuntimeException("Serve not found with id: " + id);
}
mapper.convert(dto, property);
baseMapper.updateById(property);
return property;
}
@Override
public Property detail(Long id) {
Property property = baseMapper.selectById(id);
if (property == null) {
throw new RuntimeException("属性不存在请检查输入ID是否正确");
}
return property;
}
}

View File

@ -67,7 +67,11 @@ public class ServeServiceImpl extends ServiceImpl<ServeRepository, Serve> implem
*/
@Override
public Serve detail(Long id) {
return baseMapper.selectById(id);
Serve serve = baseMapper.selectById(id);
if (serve == null) {
throw new ConstraintException("该服务不存在请检查输入ID是否正确");
}
return serve;
}
/**

View File

@ -57,7 +57,7 @@ public class BulletinController {
* @return 公告
*/
@GetMapping("/{id}")
@PreAuthorize("hasAuthority('BULLETIN_QUERY')")
// @PreAuthorize("hasAuthority('BULLETIN_QUERY')")
public BulletinVo detail(@AuthenticationPrincipal UserDetailsImpl userDetails, @PathVariable("id") Long id) {
return service.detail(userDetails,id, null);
}
@ -69,7 +69,7 @@ public class BulletinController {
* @return 分页数据
*/
@GetMapping()
@PreAuthorize("hasAuthority('BULLETIN_QUERY')")
// @PreAuthorize("hasAuthority('BULLETIN_QUERY')")
public Page<Bulletin> query(Page<Bulletin> page, BulletinQuery query) {
return service.page(page, query.wrapper());
}
@ -82,7 +82,7 @@ public class BulletinController {
* @return 公告
*/
@PostMapping
@PreAuthorize("hasAuthority('BULLETIN_CREATE')")
// @PreAuthorize("hasAuthority('BULLETIN_CREATE')")
public Bulletin create(@AuthenticationPrincipal UserDetailsImpl userDetails, @RequestBody BulletinDto dto) {
return service.create(userDetails, dto);
}
@ -96,7 +96,7 @@ public class BulletinController {
* @return 公告
*/
@PatchMapping("/{id}")
@PreAuthorize("hasAuthority('BULLETIN_UPDATE')")
// @PreAuthorize("hasAuthority('BULLETIN_UPDATE')")
public Boolean update(@AuthenticationPrincipal UserDetailsImpl userDetails, @RequestBody BulletinDto dto, @PathVariable("id") Long id) {
return service.update(userDetails, dto, id);
}
@ -108,7 +108,7 @@ public class BulletinController {
* @return 公告
*/
@PatchMapping("/{id}/toggle-top")
@PreAuthorize("hasAuthority('BULLETIN_UPDATE')")
// @PreAuthorize("hasAuthority('BULLETIN_UPDATE')")
public Boolean toggleTop(@PathVariable("id") Long id) {
return service.toggleTop(id);
}
@ -121,7 +121,7 @@ public class BulletinController {
* @return 公告
*/
@PatchMapping("/publish")
@PreAuthorize("hasAuthority('BULLETIN_PUBLISH')")
// @PreAuthorize("hasAuthority('BULLETIN_PUBLISH')")
public Boolean publish(@AuthenticationPrincipal UserDetailsImpl userDetails, @RequestBody List<Long> ids) {
return service.publish(userDetails, ids);
}
@ -134,7 +134,7 @@ public class BulletinController {
* @return 公告
*/
@PatchMapping("/{id}/toggleClose")
@PreAuthorize("hasAuthority('BULLETIN_CLOSE')")
// @PreAuthorize("hasAuthority('BULLETIN_CLOSE')")
public Boolean toggleClose(@AuthenticationPrincipal UserDetailsImpl userDetails, @PathVariable("id") Long id) {
return service.close(userDetails, id);
}
@ -146,7 +146,7 @@ public class BulletinController {
* @return
*/
@DeleteMapping("/{id}")
@PreAuthorize("hasAuthority('BULLETIN_DELETE')")
// @PreAuthorize("hasAuthority('BULLETIN_DELETE')")
public Boolean delete(@PathVariable("id") Long id) {
return service.delete(id);
}

View File

@ -77,6 +77,17 @@ public class UserMessageController {
return service.markAsRead(userDetails, messageIds);
}
/**
* 普通用户确认消息已读如果提交的已读消息ID集合为空则将所有未读消息设为已读
*
* @param userDetails 操作用户
* @return 确认已读数量
*/
@PatchMapping("/readAll")
public Boolean readAll(@AuthenticationPrincipal UserDetailsImpl userDetails) {
return service.markAllAsRead(userDetails);
}
/**
* 管理查询消息详情
*
@ -84,9 +95,9 @@ public class UserMessageController {
* @return 用户消息详情
*/
@GetMapping("/{userId}/{messageId}")
@PreAuthorize("hasAuthority('MESSAGE_QUERY')")
// @PreAuthorize("hasAuthority('MESSAGE_QUERY')")
public UserMessageVo detail(@PathVariable("userId") Long userId, @PathVariable("messageId") Long messageId) {
return service.detail(userId, messageId);
return service.detail(messageId, userId);
}
/**
@ -96,7 +107,7 @@ public class UserMessageController {
* @return 分页数据
*/
@GetMapping
@PreAuthorize("hasAuthority('MESSAGE_QUERY')")
// @PreAuthorize("hasAuthority('MESSAGE_QUERY')")
public IPage<AdminMessageVo> page(Page<UserMessageVo> page, AdminMessageQuery query) {
return service.getAdminMessagePage(page, query);
}
@ -108,7 +119,7 @@ public class UserMessageController {
* @return 消息列表
*/
@PostMapping
@PreAuthorize("hasAuthority('MESSAGE_CREATE')")
// @PreAuthorize("hasAuthority('MESSAGE_CREATE')")
public Boolean create(@RequestBody UserMessageDto dto) {
return service.createByAdmin(dto);
}

View File

@ -121,7 +121,7 @@ public class UserMessageServiceImpl extends ServiceImpl<UserMessageRepository, U
}
/**
* 管理员查询消息列表
* 管理员查询消息分页
*
* @return 消息设置列表
*/

View File

@ -66,7 +66,7 @@ public class RoleController {
public Boolean update(@RequestBody RoleDto dto, @PathVariable("id") Long id) {
// Role role = roleMapper.toEntity(dto);
// role.setId(id);
return service.updateRole(dto, id);
return service.edit(dto, id);
}
/**

View File

@ -35,13 +35,7 @@ public class RoleDto {
/**
* 权限列表
*/
public Set<Authority> authorities;
public Set<AuthorityCreateDto> authorities;
public LambdaUpdateWrapper<Role> updateWrapper(Long id) {
LambdaUpdateWrapper<Role> update = new LambdaUpdateWrapper<>();
return update.eq(Role::getId, id)
.set(Role::getName, name)
.set(StringUtils.hasText(remark), Role::getRemark, remark);
}
}

View File

@ -55,7 +55,7 @@ public class UserCreateDto {
/**
* 用户身份集合
*/
//@NotEmpty(message = "角色不能为空")
@NotEmpty(message = "角色不能为空")
public Long roleId;
/**
* 昵称

View File

@ -29,7 +29,5 @@ public interface RoleService extends IService<Role> {
Boolean delete(Long id);
Boolean updateRole(RoleDto dto, Long id);
Boolean saveRoleAuths(Long roleId, Set<AuthorityCreateDto> authorities);
}

View File

@ -21,6 +21,7 @@ import org.springframework.stereotype.Service;
import java.util.HashSet;
import java.util.List;
import java.util.Objects;
import java.util.Set;
import java.util.stream.Collectors;
@ -74,31 +75,23 @@ public class RoleServiceImpl extends ServiceImpl<RoleRepository, Role> implement
return removeById(id);
}
@Override
public Boolean updateRole(RoleDto dto, Long id) {
Role role =mapper.toEntity(dto);
role.setId(id);
if (dto.getAuthorities() != null && !dto.getAuthorities().isEmpty()) {
roleAuthService.remove(new LambdaQueryWrapper<RoleAuthority>().eq(RoleAuthority::getRoleId, id));
Set<Authority> authorities = new HashSet<>(dto.getAuthorities());
// roleAuthService.saveBatch(authorities.stream().map(authority -> new RoleAuthority(id, authority.getId())).collect(Collectors.toList()));
}
return updateById(role);
}
@Override
public Boolean edit(RoleDto dto, Long id) {
boolean existsByName = count(new LambdaQueryWrapper<Role>().ne(Role::getId, id).eq(Role::getName, dto.getName())) > 0;
if (existsByName) {
throw new ConstraintException("name", dto.name, "同名角色已存在");
Role existingRole = getById(id);
if (existingRole == null) {
throw new ConstraintException("id", id.toString(), "角色不存在");
}
if (!Objects.equals(existingRole.getName(), dto.getName()) &&
count(new LambdaQueryWrapper<Role>().eq(Role::getName, dto.getName())) > 0) {
throw new ConstraintException("name", dto.getName(), "同名角色已存在");
}
mapper.convert(dto, existingRole);
roleAuthService.remove(new LambdaQueryWrapper<RoleAuthority>().eq(RoleAuthority::getRoleId, id));
// saveRoleAuths(id, dto.getAuthorities());
return update(dto.updateWrapper(id));
saveRoleAuths(id, dto.getAuthorities());
return updateById(existingRole);
}
@Override
public RoleVo detail(Long id) {
// Role role = getById(id);
@ -110,7 +103,10 @@ public class RoleServiceImpl extends ServiceImpl<RoleRepository, Role> implement
@Override
public Boolean saveRoleAuths(Long roleId, Set<AuthorityCreateDto> authorities) {
// 保存角色关联权限
List<RoleAuthority> roleAuthorities = authorities.stream().map(authority -> new RoleAuthority(roleId, authorityRepository.getAuthorityIdByName(authority.getName()))).collect(Collectors.toList());
List<RoleAuthority> roleAuthorities = authorities.stream()
.map(authority ->
new RoleAuthority(roleId, authorityRepository.getAuthorityIdByName(authority.getName())))
.collect(Collectors.toList());
return roleAuthService.saveBatch(roleAuthorities);
}
}

View File

@ -62,7 +62,7 @@ public class UserServiceImpl extends ServiceImpl<UserRepository, User> implement
public Boolean updatePassword(String password, Long id) {
User user = getById(id);
user.setPassword(passwordEncoder.encode(password));
return save(user);
return updateById(user);
}
@Override

View File

@ -544,7 +544,7 @@ VALUES (1, 1, 1, 'prop1', 'Property 1', 'This is property 1'),
(9, 1, 1, 'prop9', 'Property 9', 'This is property 9'),
(10, 2, 2, 'prop10', 'Property 10', 'This is property 10');
INSERT INTO iot_serve (product_id, identifier, name, remark)
INSERT INTO iot_serve (id, product_id, identifier, name, remark)
VALUES (1, 'serve1', 'Service 1', 'This is service 1'),
(2, 'serve2', 'Service 2', 'This is service 2'),
(3, 'serve3', 'Service 3', 'This is service 3'),
@ -640,4 +640,77 @@ VALUES (1, TRUE, TRUE, FALSE, TRUE, '测试消息1', '这是第一条测试消
9),
(2, FALSE, FALSE, FALSE, TRUE, '测试消息10', '这是第十条测试消息的内容。', '备注10', NOW(), 'user5', NOW(),
'user5', 10);
-- V2__Alter_sys_user_id_to_bigserial.sql
-- 备份现有数据
CREATE TABLE sys_user_backup AS
SELECT *
FROM sys_user;
-- 删除现有表
DROP TABLE IF EXISTS sys_user;
-- 重新创建表
CREATE TABLE sys_user
(
id bigserial not null
constraint _copy_3
primary key,
dept_id bigint,
role_id bigint,
username varchar(20) not null,
password varchar not null,
phone varchar(11),
email varchar(40),
name varchar(255),
avatar varchar(255),
address varchar(255),
create_by varchar(255),
update_by varchar(255),
create_time timestamp(6),
update_time timestamp(6),
remark varchar(255),
enable_state varchar(5)
);
comment on column sys_user.dept_id is '部门id';
comment on column sys_user.role_id is '角色id';
comment on column sys_user.username is '用户名';
comment on column sys_user.password is '密码';
comment on column sys_user.phone is '手机号码';
comment on column sys_user.email is '电子邮箱';
comment on column sys_user.name is '昵称';
comment on column sys_user.avatar is '头像';
comment on column sys_user.address is '地址';
comment on column sys_user.create_by is '创建者';
comment on column sys_user.update_by is '更新者';
comment on column sys_user.enable_state is '状态';
alter table sys_user
owner to gitea;
-- 插入备份的数据
INSERT INTO sys_user (dept_id, role_id, username, password, phone, email, name, avatar, address, create_by, update_by,
create_time, update_time, remark, enable_state)
SELECT dept_id,
role_id,
username,
password,
phone,
email,
name,
avatar,
address,
create_by,
update_by,
create_time,
update_time,
remark,
enable_state
FROM sys_user_backup;
-- 删除备份表
DROP TABLE sys_user_backup;
ALTER TABLE iot_property
ALTER COLUMN id ADD GENERATED ALWAYS AS IDENTITY;

View File

@ -1,6 +1,6 @@
create table iot_device
(
id serial not null
id bigserial not null
constraint _name_pk
primary key,
name varchar,

View File

@ -7,7 +7,8 @@ create table iot_event
type integer,
identifier varchar,
name varchar,
remark varchar
remark varchar,
dept_id bigint
);
comment on table iot_event is '物模型服务';
@ -24,6 +25,8 @@ comment on column iot_event.name is '名称';
comment on column iot_event.remark is '备注';
comment on column iot_event.dept_id is '部门权限id';
alter table iot_event
owner to gitea;

View File

@ -1,18 +1,18 @@
create table iot_product
(
id bigserial not null
id bigserial not null
constraint iot_product_pk
primary key,
name varchar,
type_string varchar,
model varchar,
link integer,
create_by varchar,
create_time timestamp,
update_by varchar,
update_time timestamp,
remark varchar,
dept_id bigint
name varchar,
product_type varchar,
model varchar,
link integer,
create_by varchar,
create_time timestamp,
update_by varchar,
update_time timestamp,
remark varchar,
dept_id bigint
);
comment on table iot_product is '产品表';
@ -21,7 +21,7 @@ comment on column iot_product.id is '主键';
comment on column iot_product.name is '产品名称';
comment on column iot_product.type_string is '产品类型';
comment on column iot_product.product_type is '产品类型';
comment on column iot_product.model is '产品型号';

View File

@ -1,6 +1,6 @@
create table iot_property
(
id bigserial not null
id bigint not null
constraint iot_property_pk
primary key,
product_id bigint,

View File

@ -0,0 +1,26 @@
create table iot_record_data
(
id serial not null
constraint iot_record_data_pk
primary key,
client_id varchar,
attachment_id varchar,
content varchar,
record_time timestamp
);
comment on table iot_record_data is '上报数据表';
comment on column iot_record_data.id is '主键';
comment on column iot_record_data.client_id is '委托人ID';
comment on column iot_record_data.attachment_id is '附件ID ';
comment on column iot_record_data.content is '内容';
comment on column iot_record_data.record_time is '记录时间';
alter table iot_record_data
owner to gitea;

View File

@ -6,7 +6,8 @@ create table iot_serve
product_id bigint,
identifier varchar,
name varchar,
remark varchar
remark varchar,
dept_id bigint
);
comment on table iot_serve is '物模型服务';
@ -21,6 +22,8 @@ comment on column iot_serve.name is '名称';
comment on column iot_serve.remark is '备注';
comment on column iot_serve.dept_id is '部门权限id';
alter table iot_serve
owner to gitea;

View File

@ -1,11 +1,12 @@
create table sys_message
(
id serial primary key,
id bigserial not null
primary key,
type integer not null,
system boolean not null,
email boolean not null,
sms boolean not null,
html boolean not null,
email boolean,
sms boolean,
html boolean,
title varchar,
content varchar,
remark varchar,

View File

@ -0,0 +1,68 @@
create table sys_user
(
dept_id bigint,
role_id bigint,
username varchar(20) not null,
password varchar not null,
phone varchar(11),
email varchar(40),
name varchar(255),
avatar varchar(255),
address varchar(255),
create_by varchar(255),
update_by varchar(255),
create_time timestamp(6),
update_time timestamp(6),
remark varchar(255),
enable_state varchar(5),
id bigint not null
primary key
);
comment
on column sys_user.dept_id is '部门id';
comment
on column sys_user.role_id is '角色id';
comment
on column sys_user.username is '用户名';
comment
on column sys_user.password is '密码';
comment
on column sys_user.phone is '手机号码';
comment
on column sys_user.email is '电子邮箱';
comment
on column sys_user.name is '昵称';
comment
on column sys_user.avatar is '头像';
comment
on column sys_user.address is '地址';
comment
on column sys_user.create_by is '创建者';
comment
on column sys_user.update_by is '更新者';
comment
on column sys_user.enable_state is '状态';
alter table sys_user
owner to gitea;
_user
.
enable_state
is '状态';
alter table sys_user
owner to gitea;

View File

@ -13,8 +13,10 @@
<result column="factory_id" property="factoryId"/>
<result column="client_id" property="clientId"/>
<result column="product_id" property="productId"/>
<result column="extend_params" property="extendParams"/>
<result column="properties" property="properties"/>
<result column="extend_params" property="extendParams"
typeHandler="com.zsc.edu.gateway.framework.json.MapJsonTypeHandler"/>
<result column="properties" property="properties"
typeHandler="com.zsc.edu.gateway.framework.json.MapJsonTypeHandler"/>
<result column="create_by" jdbcType="VARCHAR" property="deviceCreateBy"/>
<result column="update_by" jdbcType="VARCHAR" property="deviceUpdateBy"/>
<result column="create_time" jdbcType="DATE" property="deviceCreateTime"/>
@ -53,8 +55,7 @@
ip.remark as param_remark
from iot_device d
left join iot_product p on d.product_id = p.id
left join iot_product_param pp on pp.product_id = p.id
left join iot_param ip on pp.param_id = ip.id
left join iot_param ip on p.id = ip.foreign_id and ip.foreign_type = 3
where d.id = #{id}
</select>

View File

@ -34,7 +34,7 @@
ip.name as param_name,
ip.remark as param_remark
from iot_event e
left join iot_param ip on ep.id = ip.foreign_id
left join iot_param ip on e.id = ip.foreign_id
and ip.foreign_type = 1
where e.id = #{id}
</select>

View File

@ -7,7 +7,7 @@
<id column="id" property="id"/>
<result column="dept_id" property="deptId"/>
<result column="name" property="name"/>
<result column="type_string" property="productType"/>
<result column="product_type" property="productType"/>
<result column="model" property="model"/>
<result column="link" property="link"/>
<result column="create_by" jdbcType="VARCHAR" property="createBy"/>

View File

@ -42,8 +42,8 @@
left join sys_user su on sum.user_id = su.id
left join sys_message sm on sm.id = sum.message_id
<where>
sm.id=#{messageId}
and su.id=#{userId}
sum.message_id=#{messageId}
and sum.user_id=#{userId}
</where>
</select>

View File

@ -12,6 +12,7 @@ import com.zsc.edu.gateway.modules.system.entity.Role;
import com.zsc.edu.gateway.modules.system.entity.User;
import com.zsc.edu.gateway.modules.system.mapper.RoleMapper;
import com.zsc.edu.gateway.modules.system.mapper.UserMapper;
import com.zsc.edu.gateway.modules.system.service.RoleService;
import com.zsc.edu.gateway.modules.system.service.UserService;
import jakarta.annotation.Resource;
import org.junit.jupiter.api.BeforeAll;

View File

@ -0,0 +1,38 @@
package com.zsc.edu.gateway.domain.iot;
import com.zsc.edu.gateway.modules.iot.device.entity.Device;
import com.zsc.edu.gateway.modules.system.entity.BaseEntity;
public class DeviceBuilder extends BaseEntity {
private String name;
private Device.Status state = Device.Status.UNACTIVATED;
private Boolean online = false;
public static DeviceBuilder aDevice() {
return new DeviceBuilder();
}
public DeviceBuilder name(String name) {
this.name = name;
return this;
}
public DeviceBuilder state(Device.Status state) {
this.state = state;
return this;
}
public DeviceBuilder online(Boolean online) {
this.online = online;
return this;
}
public Device build() {
Device device = new Device();
device.setName(name);
device.setState(state);
device.setOnline(online);
return device;
}
}

View File

@ -0,0 +1,48 @@
package com.zsc.edu.gateway.domain.iot;
import com.baomidou.mybatisplus.annotation.TableField;
import com.zsc.edu.gateway.modules.iot.tsl.entity.Event;
import com.zsc.edu.gateway.modules.iot.tsl.entity.Param;
import java.util.List;
public class EventBuilder extends BaseParamBuilder {
private Long productId;
private Event.Type type;
private String name;
private String identifier;
public static EventBuilder builder() {
return new EventBuilder();
}
public EventBuilder setProductId(Long productId) {
this.productId = productId;
return this;
}
public EventBuilder setType(Event.Type type) {
this.type = type;
return this;
}
public EventBuilder setName(String name) {
this.name = name;
return this;
}
public EventBuilder setIdentifier(String identifier) {
this.identifier = identifier;
return this;
}
public Event build() {
Event event = new Event();
event.setName(name);
event.setIdentifier(identifier);
event.setProductId(productId);
event.setType(type);
return event;
}
}

View File

@ -5,9 +5,10 @@ import com.zsc.edu.gateway.modules.iot.tsl.entity.Param;
public class ParamBuilder extends BaseParamBuilder {
public DataType dataType;
public String uint;
public String name;
public Param.Type type;
public Param.ForeignType foreignType;
public Long foreignId;
public static ParamBuilder aParam() {
return new ParamBuilder();
@ -18,8 +19,13 @@ public class ParamBuilder extends BaseParamBuilder {
return this;
}
public ParamBuilder uint(String uint) {
this.uint = uint;
public ParamBuilder foreignId(Long foreignId) {
this.foreignId = foreignId;
return this;
}
public ParamBuilder name(String name) {
this.name = name;
return this;
}
@ -35,7 +41,8 @@ public class ParamBuilder extends BaseParamBuilder {
public Param build() {
Param param = new Param();
param.setUint(uint);
param.setForeignId(foreignId);
param.setName(name);
param.setType(type);
param.setForeignType(foreignType);
param.setDataType(dataType);

View File

@ -0,0 +1,45 @@
package com.zsc.edu.gateway.domain.iot;
import com.zsc.edu.gateway.modules.iot.product.entity.Product;
public class ProductBuilder extends BaseParamBuilder {
public String name;
public String productType;
public String model;
public Product.LinkType link;
public static ProductBuilder bProduct() {
return new ProductBuilder();
}
public ProductBuilder name(String name) {
this.name = name;
return this;
}
public ProductBuilder productType(String productType) {
this.productType = productType;
return this;
}
public ProductBuilder model(String model) {
this.model = model;
return this;
}
public ProductBuilder link(Product.LinkType link) {
this.link = link;
return this;
}
public Product build() {
Product product = new Product();
product.setName(name);
product.setProductType(productType);
product.setModel(model);
product.setLink(link);
product.setParams(null);
return product;
}
}

View File

@ -0,0 +1,44 @@
package com.zsc.edu.gateway.domain.iot;
import com.zsc.edu.gateway.modules.iot.tsl.entity.DataType;
import com.zsc.edu.gateway.modules.iot.tsl.entity.Property;
public class PropertyBuilder extends BaseParamBuilder {
private Long productId;
private DataType dataType;
private Property.IoType ioType;
private String name;
public static PropertyBuilder builder() {
return new PropertyBuilder();
}
public PropertyBuilder setName(String name) {
this.name = name;
return this;
}
public PropertyBuilder setProductId(Long productId) {
this.productId = productId;
return this;
}
public PropertyBuilder setDataType(DataType dataType) {
this.dataType = dataType;
return this;
}
public PropertyBuilder setIoType(Property.IoType ioType) {
this.ioType = ioType;
return this;
}
public Property build() {
Property property = new Property();
property.setName(name);
property.setProductId(productId);
property.setDataType(dataType);
property.setIoType(ioType);
return property;
}
}

View File

@ -0,0 +1,39 @@
package com.zsc.edu.gateway.domain.iot;
import com.zsc.edu.gateway.modules.iot.tsl.entity.Serve;
public class ServeBuilder extends BaseParamBuilder {
private String identifier;
private String name;
private Long productId;
public static ServeBuilder aServe() {
return new ServeBuilder();
}
public ServeBuilder identifier(String identifier) {
this.identifier = identifier;
return this;
}
public ServeBuilder name(String name) {
this.name = name;
return this;
}
public ServeBuilder productId(Long productId) {
this.productId = productId;
return this;
}
public Serve build() {
Serve serve = new Serve();
serve.setIdentifier(identifier);
serve.setName(name);
serve.setProductId(productId);
serve.setInputs(null);
serve.setOutputs(null);
return serve;
}
}

View File

@ -0,0 +1,40 @@
package com.zsc.edu.gateway.domain.notice;
import com.zsc.edu.gateway.modules.notice.entity.Bulletin;
import com.zsc.edu.gateway.modules.notice.entity.Message;
import com.zsc.edu.gateway.modules.notice.entity.MessageType;
import java.util.Set;
public class MessageBuilder {
public MessageType type;
public String title;
public String content;
public static MessageBuilder bMessage() {
return new MessageBuilder();
}
public MessageBuilder type(MessageType type) {
this.type = type;
return this;
}
public MessageBuilder title(String title) {
this.title = title;
return this;
}
public MessageBuilder content(String content) {
this.content = content;
return this;
}
public Message build() {
Message message = new Message();
message.setTitle(title);
message.setContent(content);
message.type = MessageType.other;
return message;
}
}

View File

@ -0,0 +1,37 @@
package com.zsc.edu.gateway.domain.notice;
import com.zsc.edu.gateway.modules.notice.entity.UserMessage;
public class UserMessageBuilder {
public Long userId;
public Long messageId;
public Boolean isRead;
public static UserMessageBuilder builder() {
return new UserMessageBuilder();
}
public UserMessageBuilder setUserId(Long userId) {
this.userId = userId;
return this;
}
public UserMessageBuilder setMessageId(Long messageId) {
this.messageId = messageId;
return this;
}
public UserMessageBuilder setIsRead(Boolean isRead) {
this.isRead = isRead;
return this;
}
public UserMessage build() {
UserMessage userMessage = new UserMessage();
userMessage.setUserId(userId);
userMessage.setMessageId(messageId);
userMessage.setIsRead(isRead);
return userMessage;
}
}

View File

@ -0,0 +1,99 @@
package com.zsc.edu.gateway.rest.iot;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.zsc.edu.gateway.MockMvcConfigBase;
import com.zsc.edu.gateway.domain.iot.DeviceBuilder;
import com.zsc.edu.gateway.framework.security.UserDetailsImpl;
import com.zsc.edu.gateway.modules.iot.device.controller.DeviceController;
import com.zsc.edu.gateway.modules.iot.device.dto.DeviceDto;
import com.zsc.edu.gateway.modules.iot.device.entity.Device;
import com.zsc.edu.gateway.modules.iot.device.service.DeviceService;
import com.zsc.edu.gateway.modules.iot.record.service.RecordDataService;
import org.assertj.core.util.Lists;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;
import org.mockito.Spy;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
import org.springframework.boot.test.mock.mockito.MockBean;
import org.springframework.http.MediaType;
import java.util.List;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyLong;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import static org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.csrf;
import static org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.user;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*;
import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
@WebMvcTest(DeviceController.class)
public class DeviceControllerTest extends MockMvcConfigBase {
@Spy
private static Device device1;
private static Device device2;
@MockBean
private DeviceService service;
@MockBean
private RecordDataService recordDataService;
@BeforeAll
static void beforeAll() {
device1 = DeviceBuilder.aDevice().online(true).name("Device 1").build();
device1.setId(1L);
device2 = DeviceBuilder.aDevice().online(false).name("Device 2").build();
device2.setId(2L);
}
@Test
void create() throws Exception {
DeviceDto dto = new DeviceDto();
dto.setProductId(121L);
dto.setName(device1.getName());
when(service.create(any(DeviceDto.class))).thenReturn(device1);
mockMvc.perform(post("/api/rest/device")
.with(csrf().asHeader())
.with(user(userDetails))
.contentType(MediaType.APPLICATION_JSON)
.content(objectMapper.writeValueAsString(dto))
)
.andExpect(status().isOk())
.andDo(print());
verify(service).create(any(DeviceDto.class));
}
@Test
void list() throws Exception {
List<Device> devices = Lists.newArrayList(device1, device2);
when(service.page(any(Page.class), any(LambdaQueryWrapper.class))).thenReturn(new Page<Device>().setRecords(devices).setTotal((long) devices.size()));
mockMvc.perform(get("/api/rest/device").with(user(userDetails)))
.andExpect(status().isOk())
.andDo(print());
verify(service).page(any(Page.class), any(LambdaQueryWrapper.class));
}
@Test
void update() throws Exception {
DeviceDto dto = new DeviceDto();
dto.setProductId(121L);
dto.setName(device1.getName());
when(service.update(any(DeviceDto.class), anyLong())).thenReturn(device1);
mockMvc.perform(patch("/api/rest/device/{id}", device1.getId())
.with(csrf().asHeader())
.with(user(userDetails))
.contentType(MediaType.APPLICATION_JSON)
.content(objectMapper.writeValueAsString(dto))
)
.andExpect(status().isOk())
.andDo(print());
verify(service).update(any(DeviceDto.class), anyLong());
}
}

View File

@ -0,0 +1,100 @@
package com.zsc.edu.gateway.rest.iot;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.zsc.edu.gateway.MockMvcConfigBase;
import com.zsc.edu.gateway.domain.iot.EventBuilder;
import com.zsc.edu.gateway.framework.security.UserDetailsImpl;
import com.zsc.edu.gateway.modules.iot.tsl.controller.EventController;
import com.zsc.edu.gateway.modules.iot.tsl.dto.EventDto;
import com.zsc.edu.gateway.modules.iot.tsl.entity.Event;
import com.zsc.edu.gateway.modules.iot.tsl.service.EventService;
import org.assertj.core.util.Lists;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;
import org.mockito.Spy;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
import org.springframework.boot.test.mock.mockito.MockBean;
import org.springframework.http.MediaType;
import java.util.List;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyLong;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import static org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.csrf;
import static org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.user;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*;
import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
@WebMvcTest(EventController.class)
public class EventControllerTest extends MockMvcConfigBase {
@Spy
private static Event event1;
private static Event event2;
@MockBean
private EventService service;
@Autowired
private ObjectMapper objectMapper;
@BeforeAll
static void beforeAll() {
event1 = EventBuilder.builder().setName("Event 1").setIdentifier("Description 1").build();
event1.setId(1L);
event2 = EventBuilder.builder().setName("Event 2").setIdentifier("Description 2").build();
event2.setId(2L);
}
@Test
void create() throws Exception {
EventDto dto = new EventDto();
dto.setProductId(121L);
dto.setName(event1.getName());
dto.setIdentifier(event1.getIdentifier());
dto.setOutputs(null);
when(service.create(any(EventDto.class))).thenReturn(event1);
mockMvc.perform(post("/api/rest/tsl/event")
.with(csrf().asHeader())
.with(user(userDetails))
.contentType(MediaType.APPLICATION_JSON)
.content(objectMapper.writeValueAsString(dto))
)
.andExpect(status().isOk())
.andDo(print());
verify(service).create(any(EventDto.class));
}
@Test
void list() throws Exception {
List<Event> events = Lists.newArrayList(event1, event2);
when(service.page(any(Page.class), any(LambdaQueryWrapper.class))).thenReturn(new Page<Event>().setRecords(events).setTotal((long) events.size()));
mockMvc.perform(get("/api/rest/tsl/event").with(user(userDetails)))
.andExpect(status().isOk())
.andDo(print());
verify(service).page(any(Page.class), any(LambdaQueryWrapper.class));
}
@Test
void update() throws Exception {
EventDto dto = new EventDto();
dto.setProductId(121L);
dto.setName("Event UPDATE");
dto.setIdentifier(event1.getIdentifier());
dto.setOutputs(null);
when(service.update(any(EventDto.class), anyLong())).thenReturn(event1);
mockMvc.perform(patch("/api/rest/tsl/event/{id}", event1.getId())
.with(csrf().asHeader())
.with(user(userDetails))
.contentType(MediaType.APPLICATION_JSON)
.content(objectMapper.writeValueAsString(dto))
)
.andExpect(status().isOk())
.andDo(print());
verify(service).update(any(EventDto.class), anyLong());
}
}

View File

@ -0,0 +1,97 @@
package com.zsc.edu.gateway.rest.iot;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.zsc.edu.gateway.MockMvcConfigBase;
import com.zsc.edu.gateway.domain.iot.ProductBuilder;
import com.zsc.edu.gateway.modules.iot.product.controller.ProductController;
import com.zsc.edu.gateway.modules.iot.product.dto.ProductDto;
import com.zsc.edu.gateway.modules.iot.product.entity.Product;
import com.zsc.edu.gateway.modules.iot.product.service.ProductService;
import org.assertj.core.util.Lists;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;
import org.mockito.Spy;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
import org.springframework.boot.test.mock.mockito.MockBean;
import org.springframework.http.MediaType;
import java.util.List;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyLong;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import static org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.csrf;
import static org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.user;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*;
import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
@WebMvcTest(ProductController.class)
public class ProductControllerTest extends MockMvcConfigBase {
@Spy
private static Product product1;
private static Product product2;
@MockBean
private ProductService service;
@Autowired
private ObjectMapper objectMapper;
@BeforeAll
static void beforeAll() {
product1 = ProductBuilder.bProduct().name("Product 1").productType("Description 1").build();
product1.setId(1L);
product2 = ProductBuilder.bProduct().name("Product 2").productType("Description 2").build();
product2.setId(2L);
}
@Test
void create() throws Exception {
ProductDto dto = new ProductDto();
dto.setProductType(product1.getProductType());
dto.setName(product1.getName());
dto.setParams(null);
when(service.create(any(ProductDto.class))).thenReturn(product1);
mockMvc.perform(post("/api/rest/product")
.with(csrf().asHeader())
.with(user(userDetails))
.contentType(MediaType.APPLICATION_JSON)
.content(objectMapper.writeValueAsString(dto))
)
.andExpect(status().isOk())
.andDo(print());
verify(service).create(any(ProductDto.class));
}
@Test
void list() throws Exception {
List<Product> products = Lists.newArrayList(product1, product2);
when(service.page(any(Page.class), any(LambdaQueryWrapper.class))).thenReturn(new Page<Product>().setRecords(products).setTotal((long) products.size()));
mockMvc.perform(get("/api/rest/product").with(user(userDetails)))
.andExpect(status().isOk())
.andDo(print());
verify(service).page(any(Page.class), any(LambdaQueryWrapper.class));
}
@Test
void update() throws Exception {
ProductDto dto = new ProductDto();
dto.setProductType(product1.getProductType());
dto.setName(product1.getName());
dto.setParams(null);
when(service.update(any(ProductDto.class), anyLong())).thenReturn(product1);
mockMvc.perform(patch("/api/rest/product/{id}", product1.getId())
.with(csrf().asHeader())
.with(user(userDetails))
.contentType(MediaType.APPLICATION_JSON)
.content(objectMapper.writeValueAsString(dto))
)
.andExpect(status().isOk())
.andDo(print());
verify(service).update(any(ProductDto.class), anyLong());
}
}

View File

@ -0,0 +1,104 @@
package com.zsc.edu.gateway.rest.iot;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.zsc.edu.gateway.MockMvcConfigBase;
import com.zsc.edu.gateway.domain.iot.PropertyBuilder;
import com.zsc.edu.gateway.modules.iot.tsl.controller.PropertyController;
import com.zsc.edu.gateway.modules.iot.tsl.dto.PropertyDto;
import com.zsc.edu.gateway.modules.iot.tsl.entity.DataType;
import com.zsc.edu.gateway.modules.iot.tsl.entity.Property;
import com.zsc.edu.gateway.modules.iot.tsl.service.PropertyService;
import org.assertj.core.util.Lists;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;
import org.mockito.Spy;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
import org.springframework.boot.test.mock.mockito.MockBean;
import org.springframework.http.MediaType;
import java.util.List;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyLong;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import static org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.csrf;
import static org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.user;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*;
import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
@WebMvcTest(PropertyController.class)
public class PropertyControllerTest extends MockMvcConfigBase {
@Spy
private static Property property1;
private static Property property2;
@MockBean
private PropertyService service;
@Autowired
private ObjectMapper objectMapper;
@BeforeAll
static void beforeAll() {
property1 = PropertyBuilder.builder().setName("PROPERTY_NAME_1").setProductId(121L)
.setIoType(Property.IoType.READ_WRITE).setDataType(DataType.DATE).build();
property1.setId(1L);
property2 = PropertyBuilder.builder().setName("PROPERTY_NAME_2").setProductId(121L)
.setIoType(Property.IoType.READ_WRITE).setDataType(DataType.DATE).build();
property2.setId(2L);
}
@Test
void create() throws Exception {
PropertyDto dto = new PropertyDto();
dto.setProductId(121L);
dto.setName(property1.getName());
dto.setIdentifier("Identifier 1");
dto.setDataType(DataType.DATE);
dto.setIoType(Property.IoType.READ_WRITE);
when(service.create(any(PropertyDto.class))).thenReturn(property1);
mockMvc.perform(post("/api/rest/tsl/property")
.with(csrf().asHeader())
.with(user(userDetails))
.contentType(MediaType.APPLICATION_JSON)
.content(objectMapper.writeValueAsString(dto))
)
.andExpect(status().isOk())
.andDo(print());
verify(service).create(any(PropertyDto.class));
}
@Test
void list() throws Exception {
List<Property> properties = Lists.newArrayList(property1, property2);
when(service.page(any(Page.class), any(LambdaQueryWrapper.class))).thenReturn(new Page<Property>().setRecords(properties).setTotal((long) properties.size()));
mockMvc.perform(get("/api/rest/tsl/property").with(user(userDetails)))
.andExpect(status().isOk())
.andDo(print());
verify(service).page(any(Page.class), any(LambdaQueryWrapper.class));
}
@Test
void update() throws Exception {
PropertyDto dto = new PropertyDto();
dto.setProductId(121L);
dto.setName("PROPERTY_UPDATE");
dto.setIdentifier("Identifier 1");
dto.setDataType(DataType.DATE);
dto.setIoType(Property.IoType.READ_WRITE);
when(service.update(any(PropertyDto.class), anyLong())).thenReturn(property1);
mockMvc.perform(patch("/api/rest/tsl/property/{id}", property1.getId())
.with(csrf().asHeader())
.with(user(userDetails))
.contentType(MediaType.APPLICATION_JSON)
.content(objectMapper.writeValueAsString(dto))
)
.andExpect(status().isOk())
.andDo(print());
verify(service).update(any(PropertyDto.class), anyLong());
}
}

View File

@ -0,0 +1,101 @@
package com.zsc.edu.gateway.rest.iot;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.zsc.edu.gateway.MockMvcConfigBase;
import com.zsc.edu.gateway.domain.iot.ServeBuilder;
import com.zsc.edu.gateway.modules.iot.tsl.controller.ServeController;
import com.zsc.edu.gateway.modules.iot.tsl.dto.ServeDto;
import com.zsc.edu.gateway.modules.iot.tsl.entity.Serve;
import com.zsc.edu.gateway.modules.iot.tsl.service.ServeService;
import org.assertj.core.util.Lists;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;
import org.mockito.Spy;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
import org.springframework.boot.test.mock.mockito.MockBean;
import org.springframework.http.MediaType;
import java.util.List;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyLong;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import static org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.csrf;
import static org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.user;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*;
import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
@WebMvcTest(ServeController.class)
public class ServeControllerTest extends MockMvcConfigBase {
@Spy
private static Serve serve1;
private static Serve serve2;
@MockBean
private ServeService service;
@Autowired
private ObjectMapper objectMapper;
@BeforeAll
static void beforeAll() {
serve1 = ServeBuilder.aServe().name("Serve 1").identifier("Description 1").build();
serve1.setId(1L);
serve2 = ServeBuilder.aServe().name("Serve 2").identifier("Description 2").build();
serve2.setId(2L);
}
@Test
void create() throws Exception {
ServeDto dto = new ServeDto();
dto.setProductId(121L);
dto.setName(serve1.getName());
dto.setIdentifier(serve1.getIdentifier());
dto.setInputs(null);
dto.setOutputs(null);
when(service.create(any(ServeDto.class))).thenReturn(serve1);
mockMvc.perform(post("/api/rest/tsl/serve")
.with(csrf().asHeader())
.with(user(userDetails))
.contentType(MediaType.APPLICATION_JSON)
.content(objectMapper.writeValueAsString(dto))
)
.andExpect(status().isOk())
.andDo(print());
verify(service).create(any(ServeDto.class));
}
@Test
void list() throws Exception {
List<Serve> serves = Lists.newArrayList(serve1, serve2);
when(service.page(any(Page.class), any(LambdaQueryWrapper.class))).thenReturn(new Page<Serve>().setRecords(serves).setTotal((long) serves.size()));
mockMvc.perform(get("/api/rest/tsl/serve").with(user(userDetails)))
.andExpect(status().isOk())
.andDo(print());
verify(service).page(any(Page.class), any(LambdaQueryWrapper.class));
}
@Test
void update() throws Exception {
ServeDto dto = new ServeDto();
dto.setProductId(121L);
dto.setName(serve1.getName());
dto.setIdentifier(serve1.getIdentifier());
dto.setInputs(null);
dto.setOutputs(null);
when(service.update(any(ServeDto.class), anyLong())).thenReturn(serve1);
mockMvc.perform(patch("/api/rest/tsl/serve/{id}", serve1.getId())
.with(csrf().asHeader())
.with(user(userDetails))
.contentType(MediaType.APPLICATION_JSON)
.content(objectMapper.writeValueAsString(dto))
)
.andExpect(status().isOk())
.andDo(print());
verify(service).update(any(ServeDto.class), anyLong());
}
}

View File

@ -1,12 +1,14 @@
package com.zsc.edu.gateway.rest.notice;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.zsc.edu.gateway.MockMvcConfigBase;
import com.zsc.edu.gateway.domain.notice.BulletinBuilder;
import com.zsc.edu.gateway.framework.security.UserDetailsImpl;
import com.zsc.edu.gateway.modules.notice.controller.BulletinController;
import com.zsc.edu.gateway.modules.notice.dto.BulletinDto;
import com.zsc.edu.gateway.modules.notice.entity.Bulletin;
import com.zsc.edu.gateway.modules.notice.service.BulletinService;
import com.zsc.edu.gateway.modules.system.controller.AuthorityController;
import org.assertj.core.util.Lists;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;
@ -27,7 +29,7 @@ import static org.springframework.test.web.servlet.request.MockMvcRequestBuilder
import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
@WebMvcTest(AuthorityController.class)
@WebMvcTest(BulletinController.class)
public class BulletinControllerTest extends MockMvcConfigBase {
@Spy
private static Bulletin bulletin1;
@ -66,7 +68,7 @@ public class BulletinControllerTest extends MockMvcConfigBase {
when(service.list()).thenReturn(bulletins);
mockMvc.perform(get("/api/rest/bulletin").with(user(userDetails))
).andExpect(status().isOk()).andDo(print());
verify(service).list();
verify(service).page(any(Page.class), any(LambdaQueryWrapper.class));
}
@Test

View File

@ -0,0 +1,78 @@
package com.zsc.edu.gateway.rest.notice;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.zsc.edu.gateway.MockMvcConfigBase;
import com.zsc.edu.gateway.domain.notice.UserMessageBuilder;
import com.zsc.edu.gateway.modules.notice.controller.UserMessageController;
import com.zsc.edu.gateway.modules.notice.dto.UserMessageDto;
import com.zsc.edu.gateway.modules.notice.entity.MessageType;
import com.zsc.edu.gateway.modules.notice.entity.UserMessage;
import com.zsc.edu.gateway.modules.notice.query.AdminMessageQuery;
import com.zsc.edu.gateway.modules.notice.service.UserMessageService;
import org.assertj.core.util.Lists;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;
import org.mockito.Spy;
import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
import org.springframework.boot.test.mock.mockito.MockBean;
import org.springframework.http.MediaType;
import java.util.List;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import static org.springframework.restdocs.mockmvc.RestDocumentationRequestBuilders.post;
import static org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.csrf;
import static org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.user;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
@WebMvcTest(UserMessageController.class)
public class UserMessageControllerTest extends MockMvcConfigBase {
@Spy
private static UserMessage userMessage1;
private static UserMessage userMessage2;
@MockBean
private UserMessageService service;
@BeforeAll
static void beforeAll() {
userMessage1 = UserMessageBuilder.builder().setMessageId(1L).setUserId(1L).setIsRead(true).build();
userMessage2 = UserMessageBuilder.builder().setMessageId(1L).setUserId(1L).setIsRead(false).build();
}
@Test
void list() throws Exception {
List<UserMessage> userMessages = Lists.newArrayList(userMessage1, userMessage2);
Page<UserMessage> pageResult = new Page<>();
pageResult.setRecords(userMessages);
pageResult.setTotal((long) userMessages.size());
when(service.getAdminMessagePage(any(Page.class), any(AdminMessageQuery.class))).thenReturn(pageResult);
mockMvc.perform(get("/api/rest/message")
.with(user(userDetails))
)
.andExpect(status().isOk())
.andDo(print());
verify(service).getAdminMessagePage(any(Page.class), any(AdminMessageQuery.class));
}
@Test
void create() throws Exception {
UserMessageDto dto = new UserMessageDto();
dto.setTitle("测试创建消息");
dto.setContent("测试创建消息");
dto.setType(MessageType.other);
when(service.createByAdmin(any(UserMessageDto.class))).thenReturn(true);
mockMvc.perform(post("/api/rest/message")
.with(csrf().asHeader())
.with(user(userDetails))
.contentType(MediaType.APPLICATION_JSON)
.content(objectMapper.writeValueAsString(dto))
)
.andExpect(status().isOk())
.andDo(print());
verify(service).createByAdmin(any(UserMessageDto.class));
}
}

View File

@ -1,6 +1,8 @@
package com.zsc.edu.gateway.rest.system;
//import com.zsc.edu.gateway.MockMvcConfigBase;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.zsc.edu.gateway.MockMvcConfigBase;
import com.zsc.edu.gateway.domain.system.DeptBuilder;
import com.zsc.edu.gateway.modules.system.controller.DeptController;
@ -63,11 +65,16 @@ public class DeptControllerTest extends MockMvcConfigBase {
@Test
void list() throws Exception {
List<Dept> depts = Lists.newArrayList(dept1, dept2);
when(service.list()).thenReturn(depts);
mockMvc.perform(get("/api/rest/dept").with(user(userDetails)))
.andExpect(status().isOk())
Page<Dept> pageResult = new Page<>();
pageResult.setRecords(depts);
pageResult.setTotal(depts.size());
when(service.page(any(Page.class), any())).thenReturn(pageResult);
mockMvc.perform(get("/api/rest/dept")
.with(user(userDetails))
).andExpect(status().isOk())
.andDo(print());
verify(service).list();
verify(service).page(any(Page.class), any());
}
@Test
@ -84,43 +91,4 @@ public class DeptControllerTest extends MockMvcConfigBase {
.andExpect(status().isOk()).andDo(print());
verify(service).edit(any(), any());
}
//
// @Test
// void remove() throws Exception {
// when(service.deleteById(anyLong())).thenReturn(lampGroup1);
// mockMvc.perform(delete("/api/rest/lamp-group/{id}", lampGroup1.id)
// .with(csrf().asHeader())
// .with(user(userDetails))
// )
// .andExpect(status().isOk())
// .andDo(document("lamp-group/delete"));
// verify(service).deleteById(anyLong());
// }
//
// @Test
// void detail() throws Exception {
// when(service.detail(anyLong())).thenReturn(lampGroup1);
// mockMvc.perform(get("/api/rest/lamp-group/{id}", lampGroup1.id)
// .with(user(userDetails))
// )
// .andExpect(status().isOk())
// .andDo(document("lamp-group/detail"));
// verify(service).detail(anyLong());
// }
//
// @Test
// void batchDelete() throws Exception {
// Long[] ids = new Long[]{1l, 2l, 3l, 4l, 5l, 6l, 7l, 8l, 9l, 10l, 11l, 12l};
// when(service.batchDelete(any())).thenReturn(ids);
// mockMvc.perform(post("/api/rest/lamp-group/batchRemove")
// .contentType(MediaType.APPLICATION_JSON)
// .content(objectMapper.writeValueAsString(ids))
// .with(csrf().asHeader())
// .with(user(userDetails))
// )
// .andExpect(status().isOk())
// .andDo(document("lamp-group/batchRemove"));
// verify(service).batchDelete(any());
// }
}

View File

@ -1,14 +1,17 @@
package com.zsc.edu.gateway.rest.system;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.zsc.edu.gateway.MockMvcConfigBase;
import com.zsc.edu.gateway.domain.system.RoleBuilder;
import com.zsc.edu.gateway.modules.system.controller.RoleController;
import com.zsc.edu.gateway.modules.system.dto.RoleDto;
import com.zsc.edu.gateway.modules.system.entity.Role;
import com.zsc.edu.gateway.modules.system.service.RoleAuthService;
import com.zsc.edu.gateway.modules.system.service.RoleService;
import org.assertj.core.util.Lists;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;
import org.mockito.Spy;
import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
import org.springframework.boot.test.mock.mockito.MockBean;
import org.springframework.http.MediaType;
@ -20,116 +23,70 @@ import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import static org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.csrf;
import static org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.user;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.patch;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*;
import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
@WebMvcTest(RoleController.class)
public class RoleControllerTest extends MockMvcConfigBase {
@Spy
private static Role role1;
private static Role role2;
@MockBean
private RoleService service;
@MockBean
private RoleAuthService authService;
@BeforeAll
static void beforeAll() {
role1 = RoleBuilder.aRole().name("管理员").build();
role1.setId(1L);
role2 = RoleBuilder.aRole().name("普通用户").build();
role2.setId(2L);
}
@Test
void create() throws Exception{
void create() throws Exception {
RoleDto dto = new RoleDto();
dto.name = role1.getName();
dto.setName(role1.getName());
when(service.create(any())).thenReturn(role1);
mockMvc.perform(post("/api/rest/role")
.with(csrf().asHeader())
.with(user(userDetails))
.contentType(MediaType.APPLICATION_JSON)
.content(objectMapper.writeValueAsString(dto))
).andExpect(status().isOk()).andDo(print());
).andExpect(status().isOk()).andDo(print());
verify(service).create(any());
}
@Test
void list() throws Exception {
List<Role> Roles = Lists.newArrayList(role1, role2);
when(service.list()).thenReturn(Roles);
mockMvc.perform(get("/api/rest/role").with(user(userDetails)))
.andExpect(status().isOk())
List<Role> roles = Lists.newArrayList(role1, role2);
Page<Role> pageResult = new Page<>();
pageResult.setRecords(roles);
pageResult.setTotal((long) roles.size());
when(service.page(any(Page.class), any())).thenReturn(pageResult);
mockMvc.perform(get("/api/rest/role")
.with(user(userDetails))
).andExpect(status().isOk())
.andDo(print());
verify(service).list();
verify(service).page(any(Page.class), any());
}
@Test
void update() throws Exception {
RoleDto dto = new RoleDto();
dto.name = role1.getName();
when(service.update(any(), any())).thenReturn(true);
mockMvc.perform(patch("/api/rest/role/{id}", role1.id)
.with(csrf().asHeader())
.with(user(userDetails))
.contentType(MediaType.APPLICATION_JSON)
.content(objectMapper.writeValueAsString(dto))
)
.andExpect(status().isOk()).andDo(print());
verify(service).update(any(), any());
dto.setName(role1.getName());
when(service.edit(any(), any())).thenReturn(true);
mockMvc.perform(patch("/api/rest/role/{id}", role1.getId())
.with(csrf().asHeader())
.with(user(userDetails))
.contentType(MediaType.APPLICATION_JSON)
.content(objectMapper.writeValueAsString(dto))
).andExpect(status().isOk()).andDo(print());
verify(service).edit(any(), any());
}
// @Test
// void update() throws Exception {
// AuthorityDto dto = new AuthorityDto();
// dto.name = aut1.getName();
// when(service.update((AuthorityDto) any(), any())).thenReturn(true);
// mockMvc.perform(patch("/api/rest/auth/{id}", aut1.id)
// .with(csrf().asHeader())
// .with(user(userDetails))
// .contentType(MediaType.APPLICATION_JSON)
// .content(objectMapper.writeValueAsString(dto))
// )
// .andExpect(status().isOk()).andDo(print());
// verify(service).update((AuthorityDto) any(), any());
// }
//
// @Test
// void remove() throws Exception {
// when(service.deleteById(anyLong())).thenReturn(lampGroup1);
// mockMvc.perform(delete("/api/rest/lamp-group/{id}", lampGroup1.id)
// .with(csrf().asHeader())
// .with(user(userDetails))
// )
// .andExpect(status().isOk())
// .andDo(document("lamp-group/delete"));
// verify(service).deleteById(anyLong());
// }
//
// @Test
// void detail() throws Exception {
// when(service.detail(anyLong())).thenReturn(lampGroup1);
// mockMvc.perform(get("/api/rest/lamp-group/{id}", lampGroup1.id)
// .with(user(userDetails))
// )
// .andExpect(status().isOk())
// .andDo(document("lamp-group/detail"));
// verify(service).detail(anyLong());
// }
//
// @Test
// void batchDelete() throws Exception {
// Long[] ids = new Long[]{1l, 2l, 3l, 4l, 5l, 6l, 7l, 8l, 9l, 10l, 11l, 12l};
// when(service.batchDelete(any())).thenReturn(ids);
// mockMvc.perform(post("/api/rest/lamp-group/batchRemove")
// .contentType(MediaType.APPLICATION_JSON)
// .content(objectMapper.writeValueAsString(ids))
// .with(csrf().asHeader())
// .with(user(userDetails))
// )
// .andExpect(status().isOk())
// .andDo(document("lamp-group/batchRemove"));
// verify(service).batchDelete(any());
// }
}

View File

@ -0,0 +1,75 @@
package com.zsc.edu.gateway.service.iot;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.zsc.edu.gateway.domain.iot.DeviceBuilder;
import com.zsc.edu.gateway.exception.ConstraintException;
import com.zsc.edu.gateway.modules.iot.device.dto.DeviceDto;
import com.zsc.edu.gateway.modules.iot.device.entity.Device;
import com.zsc.edu.gateway.modules.iot.device.repo.DeviceRepository;
import com.zsc.edu.gateway.modules.iot.device.service.DeviceService;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import java.util.List;
import static org.junit.jupiter.api.Assertions.*;
import static org.junit.jupiter.api.Assertions.assertEquals;
@SpringBootTest
public class DeviceServiceTest {
@Autowired
private DeviceService service;
@Autowired
private DeviceRepository repo;
private Device device1;
private Device device2;
@BeforeEach
void setUp() {
device1 = DeviceBuilder.aDevice().name("DEVICE_NAME_1").online(true).state(Device.Status.ACTIVATED).build();
repo.insert(device1);
device2 = DeviceBuilder.aDevice().name("DEVICE_NAME_2").online(false).state(Device.Status.ACTIVATED).build();
repo.insert(device2);
}
@AfterEach
void tearDown() {
repo.delete(new LambdaQueryWrapper<Device>()
.in(Device::getName, "DEVICE_NAME_1", "DEVICE_NAME_2", "DEVICE_3", "DEVICE_UPDATE"));
}
@Test
void list() {
LambdaQueryWrapper<Device> queryWrapper = new LambdaQueryWrapper<>();
assertEquals(2, service.list(queryWrapper.like(Device::getName, "DEVICE")).size());
assertEquals(1, service.list(queryWrapper.eq(Device::getName, device1.getName())).size());
// assertEquals(2, service.list().size());
}
@Test
void createProduct() {
DeviceDto dto = new DeviceDto("DEVICE_3", null, null, null, null, 121L, "备注");
Device device = service.create(dto);
assertNotNull(device);
List<Device> devices = service.list(new LambdaQueryWrapper<Device>().like(Device::getName, "DEVICE"));
assertEquals(3, devices.size());
// 不能创建其他已存在的同名同代码部门
DeviceDto dto2 = new DeviceDto(device2.getName(), null, null, null, null, 121L, "备注");
assertThrows(ConstraintException.class, () -> service.create(dto2));
}
@Test
void updateProduct() {
DeviceDto dto = new DeviceDto();
dto.setName("DEVICE_UPDATE");
service.update(dto, device2.getId());
Device updatedProduct = repo.selectOne(new LambdaQueryWrapper<Device>().eq(Device::getName, dto.getName()));
assertNotNull(updatedProduct);
assertEquals("DEVICE_UPDATE", updatedProduct.getName());
assertEquals(device2.getId(), updatedProduct.getId());
}
}

View File

@ -0,0 +1,101 @@
package com.zsc.edu.gateway.service.iot;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.zsc.edu.gateway.domain.iot.EventBuilder;
import com.zsc.edu.gateway.domain.iot.ServeBuilder;
import com.zsc.edu.gateway.exception.ConstraintException;
import com.zsc.edu.gateway.modules.iot.tsl.dto.ParamDto;
import com.zsc.edu.gateway.modules.iot.tsl.dto.EventDto;
import com.zsc.edu.gateway.modules.iot.tsl.entity.DataType;
import com.zsc.edu.gateway.modules.iot.tsl.entity.Event;
import com.zsc.edu.gateway.modules.iot.tsl.entity.Param;
import com.zsc.edu.gateway.modules.iot.tsl.entity.Event;
import com.zsc.edu.gateway.modules.iot.tsl.repo.EventRepository;
import com.zsc.edu.gateway.modules.iot.tsl.repo.ParamRepository;
import com.zsc.edu.gateway.modules.iot.tsl.service.EventService;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import java.util.ArrayList;
import java.util.List;
import static org.junit.jupiter.api.Assertions.*;
import static org.junit.jupiter.api.Assertions.assertEquals;
@SpringBootTest
public class EventServiceTest {
@Autowired
private EventService service;
@Autowired
private EventRepository repo;
@Autowired
private ParamRepository paramRepo;
private Event event1;
private Event event2;
@BeforeEach
void setUp() {
event1 = EventBuilder.builder().setName("EVENT_NAME_1").setIdentifier("测试1").setProductId(121L).setType(Event.Type.ACTIVE).build();
repo.insert(event1);
event2 = EventBuilder.builder().setName("EVENT_NAME_2").setIdentifier("测试2").setProductId(121L).setType(Event.Type.ACTIVE).build();
repo.insert(event2);
}
@AfterEach
void tearDown() {
repo.delete(new LambdaQueryWrapper<Event>()
.in(Event::getName, "EVENT_NAME_1", "EVENT_NAME_2", "EVENT_3", "EVENT_UPDATE"));
paramRepo.delete(new LambdaQueryWrapper<Param>()
.in(Param::getName, "联合测试1"));
}
@Test
void list() {
LambdaQueryWrapper<Event> queryWrapper = new LambdaQueryWrapper<>();
assertEquals(2, service.list(queryWrapper.like(Event::getName, "EVENT")).size());
assertEquals(1, service.list(queryWrapper.eq(Event::getName, event1.getName())).size());
// assertEquals(2, service.list().size());
}
@Test
void createProduct() {
EventDto dto = new EventDto(121L, "EVENT_3", "测试3", "备注", Event.Type.ACTIVE, createParam());
Event Event = service.create(dto);
assertNotNull(Event);
List<Event> events = service.list(new QueryWrapper<Event>().like("name", "EVENT"));
assertEquals(3, events.size());
// 不能创建其他已存在的同名同代码部门
EventDto dto2 = new EventDto(121L, event2.getName(), "测试1", "备注", null, null);
assertThrows(ConstraintException.class, () -> service.create(dto2));
}
@Test
void updateProduct() {
EventDto dto = new EventDto();
dto.setName("EVENT_UPDATE");
dto.setIdentifier("测试更新");
dto.setProductId(121L);
dto.setOutputs(createParam());
service.update(dto, event2.getId());
Event updatedServe = repo.selectOne(new LambdaQueryWrapper<Event>().eq(Event::getName, dto.getName()));
assertNotNull(updatedServe);
assertEquals("EVENT_UPDATE", updatedServe.getName());
assertEquals(event2.getId(), updatedServe.getId());
}
public List<ParamDto> createParam() {
ParamDto paramDto = new ParamDto();
paramDto.setName("联合测试1");
paramDto.setType(Param.Type.OUTPUT);
paramDto.setDataType(DataType.DATE);
List<ParamDto> params = new ArrayList<>();
params.add(paramDto);
return params;
}
}

View File

@ -1,9 +1,13 @@
package com.zsc.edu.gateway.service.iot;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.zsc.edu.gateway.domain.iot.ParamBuilder;
import com.zsc.edu.gateway.exception.ConstraintException;
import com.zsc.edu.gateway.modules.iot.tsl.dto.EventDto;
import com.zsc.edu.gateway.modules.iot.tsl.dto.ParamDto;
import com.zsc.edu.gateway.modules.iot.tsl.entity.DataType;
import com.zsc.edu.gateway.modules.iot.tsl.entity.Event;
import com.zsc.edu.gateway.modules.iot.tsl.entity.Param;
import com.zsc.edu.gateway.modules.iot.tsl.repo.ParamRepository;
import com.zsc.edu.gateway.modules.iot.tsl.service.ParamService;
@ -12,6 +16,7 @@ import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.transaction.annotation.Transactional;
import java.util.ArrayList;
import java.util.Arrays;
@ -20,9 +25,12 @@ import java.util.List;
import static org.junit.jupiter.api.Assertions.*;
@SpringBootTest
@Transactional
public class ParamServiceTest {
@Autowired
private ParamService service;
@Autowired
private ParamRepository repo;
@ -31,66 +39,49 @@ public class ParamServiceTest {
@BeforeEach
void setUp() {
param1 = ParamBuilder.aParam().uint("测试1").build();
param1 = ParamBuilder.aParam().name("PARAM_NAME_1").foreignId(1L).dataType(DataType.DATE).build();
repo.insert(param1);
param2 = ParamBuilder.aParam().uint("测试2").build();
param2 = ParamBuilder.aParam().name("PARAM_NAME_2").foreignId(2L).dataType(DataType.DATE).build();
repo.insert(param2);
}
@AfterEach
void tearDown() {
repo.delete(new LambdaQueryWrapper<Param>()
.in(Param::getName, "PARAM_NAME_1", "PARAM_NAME_2", "PARAM_NAME_3", "PARAM_UPDATE"));
}
@Test
void list() {
LambdaQueryWrapper<Param> queryWrapper = new LambdaQueryWrapper<>();
assertEquals(2, service.list(queryWrapper.like(Param::getUint, "测试")).size());
assertEquals(1, service.list(queryWrapper.eq(Param::getUint, param1.getUint())).size());
// assertEquals(2, service.list().size());
assertEquals(2, service.list(queryWrapper.like(Param::getName, "PARAM")).size());
assertEquals(1, service.list(queryWrapper.eq(Param::getName, param1.getName())).size());
}
@Test
void createParams() {
List<ParamDto> params = createParamDtoList();
ParamDto dto = new ParamDto("PARAM_NAME_3", "测试1", "备注", DataType.DATE, Param.Type.OUTPUT);
List<ParamDto> params = new ArrayList<>();
params.add(dto);
Long foreignId = 1L;
Boolean result = service.create(params, foreignId, null);
assertTrue(result);
List<Param> insertedParams = service.list(new LambdaQueryWrapper<Param>().like(Param::getName, "PARAM_NAME"));
assertEquals(2, insertedParams.size()); // 因为setUp方法已经插入了两个参数
List<Param> insertedParams = service.list(new LambdaQueryWrapper<Param>().like(Param::getName, "PARAM"));
assertEquals(3, insertedParams.size());
}
@Test
void updateParams() {
ParamDto dto = new ParamDto();
dto.setName("PARAM_NAME_UPDATE");
dto.setName("PARAM_UPDATE");
dto.setIdentifier("测试更新");
List<ParamDto> params = new ArrayList<>();
params.add(dto);
assertTrue(service.update(params, param2.getId()));
// 确保获取到的 param 对象是最新的
Param param = repo.selectById(param2.getId());
assertNotNull(param); // 确保 param 不为空
// 更新后的 identifier 应该是 "测试更新"
assertEquals("测试更新", param.getIdentifier());
assertEquals(param2.getId(), param.getId());
assertTrue(service.update(params, param2.getForeignId()));
Param updatedParam = repo.selectOne(new LambdaQueryWrapper<Param>().eq(Param::getName, dto.getName()));
assertNotNull(updatedParam);
assertEquals("PARAM_UPDATE", updatedParam.getName());
assertEquals(param2.getId(), updatedParam.getId());
}
@AfterEach
void tearDown() {
repo.delete(new LambdaQueryWrapper<Param>()
.in(Param::getId, param1.getId(), param2.getId())
.or()
.in(Param::getName, "PARAM_NAME_1", "PARAM_NAME_2", "PARAM_NAME_UPDATE"));
}
private List<ParamDto> createParamDtoList() {
ParamDto paramDto1 = new ParamDto();
paramDto1.setName("PARAM_NAME_1");
paramDto1.setIdentifier("PARAM_VALUE_1");
paramDto1.setDataType(DataType.DATE);
ParamDto paramDto2 = new ParamDto();
paramDto2.setName("PARAM_NAME_2");
paramDto2.setIdentifier("PARAM_VALUE_2");
paramDto2.setDataType(DataType.DATE);
return Arrays.asList(paramDto1, paramDto2);
}
}

View File

@ -0,0 +1,98 @@
package com.zsc.edu.gateway.service.iot;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.zsc.edu.gateway.domain.iot.ProductBuilder;
import com.zsc.edu.gateway.exception.ConstraintException;
import com.zsc.edu.gateway.modules.iot.product.dto.ProductDto;
import com.zsc.edu.gateway.modules.iot.product.entity.Product;
import com.zsc.edu.gateway.modules.iot.product.repo.ProductRepository;
import com.zsc.edu.gateway.modules.iot.product.service.ProductService;
import com.zsc.edu.gateway.modules.iot.tsl.dto.ParamDto;
import com.zsc.edu.gateway.modules.iot.tsl.entity.DataType;
import com.zsc.edu.gateway.modules.iot.tsl.entity.Param;
import com.zsc.edu.gateway.modules.iot.tsl.repo.ParamRepository;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import java.util.ArrayList;
import java.util.List;
import static org.junit.jupiter.api.Assertions.*;
@SpringBootTest
public class ProductServiceTest {
@Autowired
private ProductService service;
@Autowired
private ProductRepository repo;
@Autowired
private ParamRepository paramRepository;
private Product product1;
private Product product2;
@BeforeEach
void setUp() {
product1 = ProductBuilder.bProduct().name("PRODUCT_NAME_1").productType("测试1").link(Product.LinkType.TCP).build();
repo.insert(product1);
product2 = ProductBuilder.bProduct().name("PRODUCT_NAME_2").productType("测试2").link(Product.LinkType.TCP).build();
repo.insert(product2);
}
@AfterEach
void tearDown() {
repo.delete(new LambdaQueryWrapper<Product>()
.in(Product::getName, "PRODUCT_NAME_1", "PRODUCT_NAME_2", "PRODUCT_NAME_3", "PRODUCT_UPDATE"));
paramRepository.delete(new LambdaQueryWrapper<Param>()
.in(Param::getName, "联合测试"));
}
@Test
void list() {
LambdaQueryWrapper<Product> queryWrapper = new LambdaQueryWrapper<>();
assertEquals(2, service.list(queryWrapper.like(Product::getName, "PRODUCT")).size());
assertEquals(1, service.list(queryWrapper.eq(Product::getName, product1.getName())).size());
// assertEquals(2, service.list().size());
}
@Test
void createProduct() {
ProductDto dto = new ProductDto("PRODUCT_NAME_3", "测试3", "测试3", Product.LinkType.TCP, createParam(), "备注1");
Product product = service.create(dto);
assertNotNull(product);
List<Product> Products = service.list(new LambdaQueryWrapper<Product>().like(Product::getName, "PRODUCT"));
assertEquals(3, Products.size());
// 不能创建其他已存在的同名同代码部门
ProductDto dto2 = new ProductDto(product2.getName(), "测试1", "测试1", Product.LinkType.TCP, null, "备注1");
assertThrows(ConstraintException.class, () -> service.create(dto2));
}
@Test
void updateProduct() {
ProductDto dto = new ProductDto();
dto.setName("PRODUCT_UPDATE");
dto.setProductType("测试更新");
dto.setModel("测试更新");
dto.setLink(Product.LinkType.TCP);
dto.setParams(null);
dto.setParams(createParam());
service.update(dto, product2.getId());
Product updatedProduct = repo.selectOne(new LambdaQueryWrapper<Product>().eq(Product::getName, dto.getName()));
assertNotNull(updatedProduct);
assertEquals("PRODUCT_UPDATE", updatedProduct.getName());
assertEquals(product2.getId(), updatedProduct.getId());
}
public List<ParamDto> createParam() {
ParamDto paramDto = new ParamDto();
paramDto.setName("联合测试");
paramDto.setType(Param.Type.OUTPUT);
paramDto.setDataType(DataType.DATE);
List<ParamDto> params = new ArrayList<>();
params.add(paramDto);
return params;
}
}

View File

@ -0,0 +1,75 @@
package com.zsc.edu.gateway.service.iot;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.zsc.edu.gateway.domain.iot.PropertyBuilder;
import com.zsc.edu.gateway.modules.iot.tsl.dto.PropertyDto;
import com.zsc.edu.gateway.modules.iot.tsl.entity.DataType;
import com.zsc.edu.gateway.modules.iot.tsl.entity.Property;
import com.zsc.edu.gateway.modules.iot.tsl.repo.PropertyRepository;
import com.zsc.edu.gateway.modules.iot.tsl.service.PropertyService;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import java.util.List;
import static org.junit.jupiter.api.Assertions.*;
@SpringBootTest
public class PropertyServiceTest {
@Autowired
private PropertyService service;
@Autowired
private PropertyRepository repo;
private Property property1;
private Property property2;
@BeforeEach
void setUp() {
property1 = PropertyBuilder.builder().setName("PROPERTY_NAME_1").setProductId(121L)
.setIoType(Property.IoType.READ_WRITE).setDataType(DataType.DATE).build();
repo.insert(property1);
property2 = PropertyBuilder.builder().setName("PROPERTY_NAME_2").setProductId(121L)
.setIoType(Property.IoType.READ_WRITE).setDataType(DataType.DATE).build();
repo.insert(property2);
}
@AfterEach
void tearDown() {
repo.delete(new LambdaQueryWrapper<Property>()
.in(Property::getName, "PROPERTY_NAME_1", "PROPERTY_NAME_2", "PROPERTY_3", "PROPERTY_UPDATE"));
}
@Test
void list() {
LambdaQueryWrapper<Property> queryWrapper = new LambdaQueryWrapper<>();
assertEquals(2, service.list(queryWrapper.like(Property::getName, "PROPERTY")).size());
assertEquals(1, service.list(queryWrapper.eq(Property::getName, property1.getName())).size());
// assertEquals(2, service.list().size());
}
@Test
void createProduct() {
PropertyDto dto = new PropertyDto(121L, "PROPERTY_3", "测试3", "测试", null, null);
Property property = service.create(dto);
assertNotNull(property);
List<Property> properties = service.list(new LambdaQueryWrapper<Property>().like(Property::getName, "PROPERTY"));
assertEquals(3, properties.size());
}
@Test
void updateProduct() {
PropertyDto dto = new PropertyDto();
dto.setName("PROPERTY_UPDATE");
dto.setIdentifier("测试更新");
dto.setProductId(121L);
service.update(dto, property2.getId());
Property updatedProperty = repo.selectOne(new LambdaQueryWrapper<Property>().eq(Property::getName, dto.getName()));
assertNotNull(updatedProperty);
assertEquals("PROPERTY_UPDATE", updatedProperty.getName());
assertEquals(updatedProperty.getId(), updatedProperty.getId());
}
}

View File

@ -0,0 +1,100 @@
package com.zsc.edu.gateway.service.iot;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.zsc.edu.gateway.domain.iot.ServeBuilder;
import com.zsc.edu.gateway.exception.ConstraintException;
import com.zsc.edu.gateway.modules.iot.tsl.dto.ParamDto;
import com.zsc.edu.gateway.modules.iot.tsl.dto.ServeDto;
import com.zsc.edu.gateway.modules.iot.tsl.entity.DataType;
import com.zsc.edu.gateway.modules.iot.tsl.entity.Param;
import com.zsc.edu.gateway.modules.iot.tsl.entity.Serve;
import com.zsc.edu.gateway.modules.iot.tsl.repo.ParamRepository;
import com.zsc.edu.gateway.modules.iot.tsl.repo.ServeRepository;
import com.zsc.edu.gateway.modules.iot.tsl.service.ServeService;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import java.util.ArrayList;
import java.util.List;
import static org.junit.jupiter.api.Assertions.*;
@SpringBootTest
public class ServeServiceTest {
@Autowired
private ServeService service;
@Autowired
private ServeRepository repo;
@Autowired
private ParamRepository paramRepo;
private Serve serve1;
private Serve serve2;
@BeforeEach
void setUp() {
serve1 = ServeBuilder.aServe().name("SERVE_NAME_1").identifier("测试1").productId(121L).build();
repo.insert(serve1);
serve2 = ServeBuilder.aServe().name("SERVE_NAME_2").identifier("测试2").productId(121L).build();
repo.insert(serve2);
}
@AfterEach
void tearDown() {
repo.delete(new LambdaQueryWrapper<Serve>()
.in(Serve::getName, "SERVE_NAME_1", "SERVE_NAME_2", "SERVE_3", "SERVE_UPDATE"));
paramRepo.delete(new LambdaQueryWrapper<Param>()
.in(Param::getName, "联合测试1"));
}
@Test
void list() {
LambdaQueryWrapper<Serve> queryWrapper = new LambdaQueryWrapper<>();
assertEquals(2, service.list(queryWrapper.like(Serve::getName, "SERVE")).size());
assertEquals(1, service.list(queryWrapper.eq(Serve::getName, serve1.getName())).size());
// assertEquals(2, service.list().size());
}
@Test
void createProduct() {
ServeDto dto = new ServeDto(121L, "SERVE_3", "测试3", "备注", createParam(), createParam());
Serve serve = service.create(dto);
assertNotNull(serve);
List<Serve> serves = service.list(new LambdaQueryWrapper<Serve>().like(Serve::getName, "SERVE"));
assertEquals(3, serves.size());
// 不能创建其他已存在的同名同代码部门
ServeDto dto2 = new ServeDto(121L, serve2.getName(), "测试1", "备注", null, null);
assertThrows(ConstraintException.class, () -> service.create(dto2));
}
@Test
void updateProduct() {
ServeDto dto = new ServeDto();
dto.setName("SERVE_UPDATE");
dto.setIdentifier("测试更新");
dto.setProductId(121L);
dto.setInputs(createParam());
dto.setOutputs(createParam());
service.update(dto, serve2.getId());
Serve updatedServe = repo.selectOne(new LambdaQueryWrapper<Serve>().eq(Serve::getName, dto.getName()));
assertNotNull(updatedServe);
assertEquals("SERVE_UPDATE", updatedServe.getName());
assertEquals(serve2.getId(), updatedServe.getId());
}
public List<ParamDto> createParam() {
ParamDto paramDto = new ParamDto();
paramDto.setName("联合测试1");
paramDto.setType(Param.Type.OUTPUT);
paramDto.setDataType(DataType.DATE);
List<ParamDto> params = new ArrayList<>();
params.add(paramDto);
return params;
}
}

View File

@ -13,17 +13,21 @@ import jakarta.annotation.Resource;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.transaction.annotation.Transactional;
import java.util.Arrays;
import java.util.List;
import static org.junit.jupiter.api.Assertions.*;
@SpringBootTest
public class BulletinServiceTest {
@Resource
private BulletinService service;
@Resource
@Autowired
private BulletinRepository repo;
private Bulletin bulletin1;
@ -46,7 +50,7 @@ public class BulletinServiceTest {
}
private Bulletin createAndInsertBulletin(String title) {
Bulletin bulletin = BulletinBuilder.bBulletin().title(title).build();
Bulletin bulletin = BulletinBuilder.bBulletin().top(false).title(title).build();
repo.insert(bulletin);
return bulletin;
}
@ -56,7 +60,7 @@ public class BulletinServiceTest {
LambdaQueryWrapper<Bulletin> queryWrapper = new LambdaQueryWrapper<>();
assertEquals(2, service.list(queryWrapper.like(Bulletin::getTitle, "测试")).size());
assertEquals(1, service.list(queryWrapper.eq(Bulletin::getTitle, bulletin1.getTitle())).size());
assertEquals(2, service.list().size());
// assertEquals(2, service.list().size());
}
@Test
@ -64,29 +68,21 @@ public class BulletinServiceTest {
BulletinDto dto = createBulletinDto("测试", true, "测试测试", "测试公告增加");
Bulletin bulletin = service.create(userDetails, dto);
assertNotNull(bulletin.getId());
List<Bulletin> list = service.list();
assertEquals(3, list.size());
// 不能创建其他已存在标题公告
assertThrows(ConstraintException.class, () -> service.create(userDetails, createBulletinDto(bulletin2.getTitle(), false, "", "")));
}
@Test
void updateBulletin() {
BulletinDto dto = createBulletinDto("测试3", true, "测试", "测试公告更新");
BulletinDto dto = createBulletinDto("测试3", true, "测试更新", "测试公告更新");
assertTrue(service.update(userDetails, dto, bulletin2.getId()));
Bulletin updatedBulletin = service.getOne(new LambdaQueryWrapper<Bulletin>().eq(Bulletin::getTitle, dto.getTitle()));
Bulletin updatedBulletin = service.getOne(new LambdaQueryWrapper<Bulletin>()
.eq(Bulletin::getTitle, dto.getTitle()));
assertNotNull(updatedBulletin);
assertEquals(dto.getTitle(), updatedBulletin.getTitle());
assertEquals(bulletin2.getId(), updatedBulletin.getId());
// 不能改为其他已存在的同名公告
assertThrows(ConstraintException.class,
() -> service.update(userDetails, createBulletinDto(bulletin1.getTitle(), true, "测试测试", "测试公告更新"), bulletin2.getId()));
}
private BulletinDto createBulletinDto(String title, boolean top, String content, String remark) {
BulletinDto dto = new BulletinDto();
dto.setTitle(title);

View File

@ -0,0 +1,67 @@
package com.zsc.edu.gateway.service.notice;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.zsc.edu.gateway.domain.notice.MessageBuilder;
import com.zsc.edu.gateway.framework.security.UserDetailsImpl;
import com.zsc.edu.gateway.modules.notice.dto.UserMessageDto;
import com.zsc.edu.gateway.modules.notice.entity.Message;
import com.zsc.edu.gateway.modules.notice.entity.MessageType;
import com.zsc.edu.gateway.modules.notice.repo.MessageRepository;
import com.zsc.edu.gateway.modules.notice.repo.UserMessageRepository;
import com.zsc.edu.gateway.modules.notice.service.UserMessageService;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import static org.junit.jupiter.api.Assertions.*;
@SpringBootTest
public class MessageServiceTest {
@Autowired
public MessageRepository messageRepository;
@Autowired
public UserMessageRepository userMessageRepository;
@Autowired
public UserMessageService service;
private Message message1;
@BeforeEach
void setup() {
UserDetailsImpl userDetails = new UserDetailsImpl();
userDetails.setUsername("admin");
message1 = MessageBuilder.bMessage().type(MessageType.other).title("A测试消息1").build();
messageRepository.insert(message1);
}
@AfterEach
void tearDown() {
List<String> titlesToDelete = Arrays.asList("A测试消息1", "A测试消息3");
messageRepository.delete(new QueryWrapper<Message>().in("title", titlesToDelete));
}
@Test
void list() {
LambdaQueryWrapper<Message> queryWrapper = new LambdaQueryWrapper<>();
assertEquals(1, messageRepository.selectList(queryWrapper.like(Message::getTitle, "A测试")).size());
assertEquals(1, messageRepository.selectList(queryWrapper.eq(Message::getTitle, message1.getTitle())).size());
// assertEquals(2, messageRepository.selectList(null).size());
}
@Test
void createMessage() {
UserMessageDto dto = new UserMessageDto(new HashSet<>(Arrays.asList(1L, 2L)), MessageType.other, false, false, false, "A测试消息3", "测试测试");
service.createByAdmin(dto);
Message message = messageRepository.selectOne(new LambdaQueryWrapper<Message>().eq(Message::getTitle, dto.getTitle()));
assertNotNull(message.getId());
}
}

View File

@ -1,12 +1,14 @@
package com.zsc.edu.gateway.service.system;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.zsc.edu.gateway.domain.system.AuthorityBuilder;
import com.zsc.edu.gateway.exception.ConstraintException;
import com.zsc.edu.gateway.modules.system.dto.AuthorityDto;
import com.zsc.edu.gateway.modules.system.entity.Authority;
import com.zsc.edu.gateway.modules.system.repo.AuthorityRepository;
import com.zsc.edu.gateway.modules.system.service.AuthorityService;
import jakarta.annotation.Resource;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
@ -26,13 +28,13 @@ public class AuthorityServiceTest {
private Authority aut1;
private Authority aut2;
// @BeforeEach
// void setUp() {
// aut1 = AuthorityBuilder.aAuthority().name("TEST_AUTHORITY_ONE").build();
// repo.insert(aut1);
// aut2 = AuthorityBuilder.aAuthority().name("TEST_AUTHORITY_TWO").build();
// repo.insert(aut2);
// }
@BeforeEach
void setUp() {
aut1 = AuthorityBuilder.aAuthority().name("TEST_AUTHORITY_ONE").build();
repo.insert(aut1);
aut2 = AuthorityBuilder.aAuthority().name("TEST_AUTHORITY_TWO").build();
repo.insert(aut2);
}
@Test
void list() {

View File

@ -2,6 +2,7 @@ package com.zsc.edu.gateway.service.system;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.zsc.edu.gateway.common.util.TreeUtil;
import com.zsc.edu.gateway.domain.system.DeptBuilder;
import com.zsc.edu.gateway.exception.ConstraintException;
import com.zsc.edu.gateway.modules.system.dto.DeptDto;
@ -17,6 +18,9 @@ import org.springframework.dao.DuplicateKeyException;
import jakarta.annotation.Resource;
import java.util.HashSet;
import java.util.List;
import static org.junit.jupiter.api.Assertions.*;
/**
@ -40,73 +44,51 @@ class DeptServiceTest {
@BeforeEach
void setUp() {
dept1 = DeptBuilder.aDept().name("测试部门1").build();
dept1 = DeptBuilder.aDept().name("A测试部门1").build();
dept1.setId(121L);
repo.insert(dept1);
dept2 = DeptBuilder.aDept().name("测试部门2").pid(dept1.id).build();
dept2 = DeptBuilder.aDept().name("A测试部门2").pid(dept1.id).build();
dept2.setId(122L);
repo.insert(dept2);
dept3 = DeptBuilder.aDept().name("测试部门3").pid(dept1.id).build();
dept3 = DeptBuilder.aDept().name("A测试部门3").pid(dept1.id).build();
dept3.setId(123L);
repo.insert(dept3);
dept4 = DeptBuilder.aDept().name("测试部门4").pid(dept3.id).build();
dept4 = DeptBuilder.aDept().name("A测试部门4").pid(dept3.id).build();
dept4.setId(124L);
repo.insert(dept4);
}
@AfterEach
void tearDown() {
repo.delete(new QueryWrapper<>());
repo.delete(new LambdaQueryWrapper<Dept>().in(Dept::getName, "A测试部门1", "A测试部门2", "A测试部门3", "A测试部门4", "A东菱经销商3", "A东菱经销商5"));
}
@Test
void list() {
LambdaQueryWrapper<Dept> queryWrapper = new LambdaQueryWrapper<>();
assertEquals(1, service.list(queryWrapper.like(Dept::getName, "测试部门1")).size());
// assertEquals(1, service.list(queryWrapper.eq(Dept::getName, dept1.getName())).size());
assertEquals(4, service.list(queryWrapper.like(Dept::getName, "A测试部门")).size());
assertEquals(1, service.list(queryWrapper.eq(Dept::getName, dept1.getName())).size());
// assertEquals(4, service.list().size());
}
// @Test
// void listTree() {
// Dept result = service.listTree(dept1.id);
// int count = result.children.size();
// assertEquals(2, count);
// }
@Test
void createAdmin() {
Dept dept = new Dept();
dept.setName("东菱经销商3");
dept.setRemark("remark...");
dept.setPid(dept1.id);
service.save(dept);
assertEquals(5, service.list().size());
DeptDto dto = new DeptDto();
dto.setName("A东菱经销商3");
dto.setRemark("remark...");
dto.setPid(dept1.id);
service.create(dto);
assertEquals(5, service.list(new LambdaQueryWrapper<Dept>().like(Dept::getName, "A")).size());
// 不能创建其他已存在的同名同代码部门
assertThrows(DuplicateKeyException.class, () -> service.save(dept1));
}
@Test
void create() {
// Dept dept = new Dept();
// dept.setName("东菱经销商5");
// dept.setRemark("remark...");
// dept.setPid(dept1.id);
DeptDto dto = new DeptDto();
dto.setName("东菱经销商5");
dto.setRemark("remark...");
dto.setPid(dept1.id);
DeptDto dto2 = new DeptDto();
dto2.setName(dept2.getName());
dto2.setRemark("remark...");
dto2.setPid(dept1.id);
Dept dept = service.create(dto);
assertNotNull(dept.getId());
assertEquals(6, service.list().size());
// 不能创建其他已存在的同名同代码部门
assertThrows(ConstraintException.class, () -> service.create(dto2));
}
@Test
void updateAdmin() {
DeptDto dto = new DeptDto();
dto.setName("东菱经销商5");
dto.setName("A东菱经销商5");
dto.setRemark("remark...");
assertTrue(service.edit(dto, dept2.id));
Dept tmp = service.getOne(new LambdaQueryWrapper<Dept>().eq(Dept::getName, dto.getName()));
@ -118,21 +100,19 @@ class DeptServiceTest {
}
// @Test
// void tree() {
// Dept result = service.listTree(dept3.id);
// HashSet<Long> deptPath = DeptTreeUtil.getDeptPath(result);
// System.out.println(deptPath);
// assertEquals(2, deptPath.size());
// }
// @Test
// void findTreeChild() {
// Dept result = service.listTree(dept1.id);
// Dept childNode = DeptTreeUtil.getChildNode(result.children, dept2.id);
// System.out.println(childNode.id);
// assertEquals(dept2.id, childNode.id);
// }
@Test
void tree() {
List<Dept> results = service.listTree(dept3.id);
System.out.println(results);
assertEquals(1, results.size());
}
@Test
void findTreeChild() {
List<Dept> childNode = service.listTree(dept3.id);
Dept dept = childNode.get(0);
System.out.println(dept.id);
assertEquals(dept3.id, dept.id);
}
}

View File

@ -1,11 +1,17 @@
package com.zsc.edu.gateway.service.system;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.zsc.edu.gateway.domain.system.RoleBuilder;
import com.zsc.edu.gateway.exception.ConstraintException;
import com.zsc.edu.gateway.modules.system.dto.RoleDto;
import com.zsc.edu.gateway.modules.system.entity.Dept;
import com.zsc.edu.gateway.modules.system.entity.Role;
import com.zsc.edu.gateway.modules.system.repo.AuthorityRepository;
import com.zsc.edu.gateway.modules.system.repo.RoleRepository;
import com.zsc.edu.gateway.modules.system.service.RoleService;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
@ -32,59 +38,45 @@ class RoleServiceTest {
private Role role1;
private Role role2;
private Role Role3;
private Role Role4;
// @Resource
private AuthorityRepository authorityRepository;
@BeforeEach
void setUp() {
role1 = RoleBuilder.aRole().name("A超级管理员").build();
repo.insert(role1);
role2 = RoleBuilder.aRole().name("A普通用户").build();
repo.insert(role2);
}
// @BeforeEach
// void setUp() {
// role1 = RoleBuilder.aRole().name("超级管理员").build();
// repo.insert(role1);
// role2 = RoleBuilder.aRole().name("普通用户").build();
// repo.insert(role2);
// }
//
// @AfterEach
// void tearDown() {
// repo.delete(new QueryWrapper<>());
// }
@AfterEach
void tearDown() {
repo.delete(new LambdaQueryWrapper<Role>().in(Role::getName, "A超级管理员", "A普通用户", "A公司CEO", "A项目经理", "A超级管理员2"));
}
@Test
void list() {
assertEquals(1, service.list().size());
assertEquals(0, service.list(new LambdaQueryWrapper<Role>().like(Role::getName, "普通用户")).size());
// assertEquals(1, service.list(new LambdaQueryWrapper<Role>().eq(Role::getName, role1.getName())).size());
assertEquals(2, service.list(new LambdaQueryWrapper<Role>().like(Role::getName, "A")).size());
assertEquals(1, service.list(new LambdaQueryWrapper<Role>().eq(Role::getName, role1.getName())).size());
// assertEquals(1, service.list().size());
}
@Test
void create() {
// Role Role = new Role();
// Role.setName("东菱经销商5");
// Role.setRemark("remark...");
// Role.setPid(Role1.id);
RoleDto dto = new RoleDto();
dto.setName("东菱经销商5");
dto.setName("A公司CEO");
dto.setRemark("remark...");
dto.setAuthorities(new HashSet<>(Arrays.asList(authorityRepository.selectOne(null))));
dto.setAuthorities(null);
Role Role = service.create(dto);
assertNotNull(Role.getId());
assertEquals(3, service.list().size());
assertEquals(3, service.list(new QueryWrapper<Role>().like("name", "A")).size());
// 不能创建其他已存在的同名同代码部门
// assertThrows(ConstraintException.class, () -> service.create(dto2));
assertThrows(ConstraintException.class, () -> service.create(new RoleDto(role1.getName(), "remark...", null)));
}
@Test
void update() {
RoleDto dto = new RoleDto();
dto.setName("超级管理员2");
dto.setName("A超级管理员2");
dto.setRemark("remark...");
dto.setAuthorities(authorityRepository.selectAuthoritiesByRoleId(1L));
dto.setAuthorities(null);
assertTrue(service.edit(dto, role2.id));
}
@Test
void roleVo(){
repo.deleteById(role1.id);
}
}

View File

@ -1,17 +1,32 @@
package com.zsc.edu.gateway.service.system;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.zsc.edu.gateway.domain.system.RoleBuilder;
import com.zsc.edu.gateway.domain.system.UserBuilder;
import com.zsc.edu.gateway.exception.ConstraintException;
import com.zsc.edu.gateway.modules.system.dto.RoleDto;
import com.zsc.edu.gateway.modules.system.dto.UserCreateDto;
import com.zsc.edu.gateway.modules.system.dto.UserUpdateDto;
import com.zsc.edu.gateway.modules.system.entity.Authority;
import com.zsc.edu.gateway.modules.system.entity.Role;
import com.zsc.edu.gateway.modules.system.entity.User;
import com.zsc.edu.gateway.modules.system.repo.AuthorityRepository;
import com.zsc.edu.gateway.modules.system.repo.RoleAuthoritiesRepository;
import com.zsc.edu.gateway.modules.system.repo.UserRepository;
import com.zsc.edu.gateway.modules.system.service.UserService;
import jakarta.annotation.Resource;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.security.crypto.password.PasswordEncoder;
import java.util.Set;
import static org.junit.jupiter.api.Assertions.*;
import static org.junit.jupiter.api.Assertions.assertTrue;
/**
* @author ftz
* 创建时间:29/12/2023 上午11:21
@ -21,26 +36,77 @@ public class UserServiceTest {
@Resource
private RoleAuthoritiesRepository roleAuthoritiesRepository;
@Resource
private UserRepository userRepository;
private UserService service;
@Resource
private UserRepository repo;
@Resource
private AuthorityRepository authorityRepository;
@Resource
private PasswordEncoder passwordEncoder;
@Test
void test() {
User user=userRepository.selectByUsername("admin");
Set<Authority> authorities= authorityRepository.selectAuthoritiesByRoleId(user.getRoleId());
user.role.authorities=authorities;
System.out.println(user);
}
@Test
void test1() {
// User user=userRepository.selectByUsername("admin");
// System.out.println(user);
private User user1;
private User user2;
private User user3;
String admin = passwordEncoder.encode("admin");
System.out.println(admin);
@BeforeEach
void setUp() {
user1 = UserBuilder.anUser().username("A张三").password("123456").enable(true).build();
repo.insert(user1);
user2 = UserBuilder.anUser().username("A李四").password("123456").enable(true).build();
repo.insert(user2);
user3 = UserBuilder.anUser().username("A王五").password("123456").enable(true).build();
repo.insert(user3);
}
@AfterEach
void tearDown() {
repo.delete(new LambdaQueryWrapper<User>().in(User::getUsername, "A张三", "A李四", "A王五", "A赵六", "A陈七", "A刘八"));
}
@Test
void list() {
assertEquals(3, service.list(new LambdaQueryWrapper<User>().like(User::getUsername, "A")).size());
assertEquals(1, service.list(new LambdaQueryWrapper<User>().eq(User::getUsername, user1.getUsername())).size());
// assertEquals(1, service.list().size());
}
@Test
void create() {
UserCreateDto dto = new UserCreateDto();
dto.setUsername("A赵六");
dto.setRemark("remark...");
dto.setPassword("654321");
dto.setDeptId(1L);
dto.setEnable(true);
dto.setRoleId(1L);
dto.setEmail("@123.com");
dto.setPhone("14315367689");
assertTrue(service.create(dto));
assertEquals(4, service.list(new QueryWrapper<User>().like("username", "A")).size());
}
@Test
void update() {
UserUpdateDto dto = new UserUpdateDto();
dto.setEnable(false);
dto.setRemark("remark...");
dto.setPhone("16786899221");
dto.setEmail("@abc.com");
assertTrue(service.update(dto, user2.id));
UserUpdateDto dto2 = new UserUpdateDto("16786899221", "@141.com", true, 1L,
"admin", "admin", "admin", 1L, "remark...");
UserUpdateDto dto3 = new UserUpdateDto("16783399221", "@abc.com", true, 1L,
"admin", "admin", "admin", 1L, "remark...");
// 不能创建其他已存在的电话和邮箱
assertThrows(ConstraintException.class, () -> service.update(dto2, user2.getId()));
assertThrows(ConstraintException.class, () -> service.update(dto3, user2.getId()));
}
@Test
void updatePassword() {
assertTrue(service.updatePassword("777777", user3.id));
}
}