mirror of
https://gitee.com/hhyykk/ipms-sjy.git
synced 2025-07-17 20:45:06 +08:00
Merge branch 'master' of https://gitee.com/zhijiantianya/ruoyi-vue-pro into sms_temp_zzf_0127
This commit is contained in:
@ -9,6 +9,7 @@ import com.baomidou.mybatisplus.autoconfigure.MybatisPlusAutoConfiguration;
|
||||
import org.redisson.spring.starter.RedissonAutoConfiguration;
|
||||
import org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration;
|
||||
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
|
||||
import org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration;
|
||||
import org.springframework.boot.test.context.SpringBootTest;
|
||||
import org.springframework.context.annotation.Import;
|
||||
import org.springframework.test.context.ActiveProfiles;
|
||||
@ -30,6 +31,7 @@ public class BaseDbAndRedisUnitTest {
|
||||
// DB 配置类
|
||||
DataSourceConfiguration.class, // 自己的 DB 配置类
|
||||
DataSourceAutoConfiguration.class, // Spring DB 自动配置类
|
||||
DataSourceTransactionManagerAutoConfiguration.class, // Spring 事务自动配置类
|
||||
DruidDataSourceAutoConfigure.class, // Druid 自动配置类
|
||||
// MyBatis 配置类
|
||||
MybatisConfiguration.class, // 自己的 MyBatis 配置类
|
||||
|
@ -5,6 +5,7 @@ import cn.iocoder.dashboard.framework.mybatis.config.MybatisConfiguration;
|
||||
import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure;
|
||||
import com.baomidou.mybatisplus.autoconfigure.MybatisPlusAutoConfiguration;
|
||||
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
|
||||
import org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration;
|
||||
import org.springframework.boot.test.context.SpringBootTest;
|
||||
import org.springframework.context.annotation.Import;
|
||||
import org.springframework.test.context.ActiveProfiles;
|
||||
@ -26,6 +27,7 @@ public class BaseDbUnitTest {
|
||||
// DB 配置类
|
||||
DataSourceConfiguration.class, // 自己的 DB 配置类
|
||||
DataSourceAutoConfiguration.class, // Spring DB 自动配置类
|
||||
DataSourceTransactionManagerAutoConfiguration.class, // Spring 事务自动配置类
|
||||
DruidDataSourceAutoConfigure.class, // Druid 自动配置类
|
||||
// MyBatis 配置类
|
||||
MybatisConfiguration.class, // 自己的 MyBatis 配置类
|
||||
|
@ -17,7 +17,7 @@ public class RedisTestConfiguration {
|
||||
/**
|
||||
* 创建模拟的 Redis Server 服务器
|
||||
*/
|
||||
@Bean(destroyMethod = "stop")
|
||||
@Bean
|
||||
public RedisServer redisServer(RedisProperties properties) throws IOException {
|
||||
RedisServer redisServer = new RedisServer(properties.getPort());
|
||||
// TODO 芋艿:一次执行多个单元测试时,貌似创建多个 spring 容器,导致不进行 stop。这样,就导致端口被占用,无法启动。。。
|
||||
|
@ -1,52 +0,0 @@
|
||||
package cn.iocoder.dashboard.framework.quartz.core.scheduler;
|
||||
|
||||
import cn.hutool.core.util.StrUtil;
|
||||
import cn.iocoder.dashboard.BaseDbUnitTest;
|
||||
import cn.iocoder.dashboard.modules.system.job.auth.SysUserSessionTimeoutJob;
|
||||
import org.junit.jupiter.api.Test;
|
||||
import org.quartz.SchedulerException;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
|
||||
class SchedulerManagerTest extends BaseDbUnitTest {
|
||||
|
||||
@Resource
|
||||
private SchedulerManager schedulerManager;
|
||||
|
||||
@Test
|
||||
public void testAddJob() throws SchedulerException {
|
||||
String jobHandlerName = StrUtil.lowerFirst(SysUserSessionTimeoutJob.class.getSimpleName());
|
||||
schedulerManager.addJob(1L, jobHandlerName, "test", "0/10 * * * * ? *", 0, 0);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testUpdateJob() throws SchedulerException {
|
||||
String jobHandlerName = StrUtil.lowerFirst(SysUserSessionTimeoutJob.class.getSimpleName());
|
||||
schedulerManager.updateJob(jobHandlerName, "hahaha", "0/20 * * * * ? *", 0, 0);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testDeleteJob() throws SchedulerException {
|
||||
String jobHandlerName = StrUtil.lowerFirst(SysUserSessionTimeoutJob.class.getSimpleName());
|
||||
schedulerManager.deleteJob(jobHandlerName);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testPauseJob() throws SchedulerException {
|
||||
String jobHandlerName = StrUtil.lowerFirst(SysUserSessionTimeoutJob.class.getSimpleName());
|
||||
schedulerManager.pauseJob(jobHandlerName);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testResumeJob() throws SchedulerException {
|
||||
String jobHandlerName = StrUtil.lowerFirst(SysUserSessionTimeoutJob.class.getSimpleName());
|
||||
schedulerManager.resumeJob(jobHandlerName);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testTriggerJob() throws SchedulerException {
|
||||
String jobHandlerName = StrUtil.lowerFirst(SysUserSessionTimeoutJob.class.getSimpleName());
|
||||
schedulerManager.triggerJob(1L, jobHandlerName, "niubi!!!");
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,173 @@
|
||||
package cn.iocoder.dashboard.modules.infra.service.job;
|
||||
|
||||
import static cn.hutool.core.util.RandomUtil.randomEle;
|
||||
import static cn.iocoder.dashboard.util.AssertUtils.assertPojoEquals;
|
||||
import static cn.iocoder.dashboard.util.RandomUtils.randomLongId;
|
||||
import static cn.iocoder.dashboard.util.RandomUtils.randomPojo;
|
||||
import static cn.iocoder.dashboard.util.RandomUtils.randomString;
|
||||
import static cn.iocoder.dashboard.util.date.DateUtils.buildTime;
|
||||
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||
import static org.junit.jupiter.api.Assertions.assertNotNull;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
|
||||
import org.junit.jupiter.api.Test;
|
||||
import org.springframework.context.annotation.Import;
|
||||
|
||||
import cn.iocoder.dashboard.BaseDbUnitTest;
|
||||
import cn.iocoder.dashboard.common.pojo.PageResult;
|
||||
import cn.iocoder.dashboard.modules.infra.controller.job.vo.log.InfJobLogExportReqVO;
|
||||
import cn.iocoder.dashboard.modules.infra.controller.job.vo.log.InfJobLogPageReqVO;
|
||||
import cn.iocoder.dashboard.modules.infra.dal.dataobject.job.InfJobLogDO;
|
||||
import cn.iocoder.dashboard.modules.infra.dal.mysql.job.InfJobLogMapper;
|
||||
import cn.iocoder.dashboard.modules.infra.enums.job.InfJobLogStatusEnum;
|
||||
import cn.iocoder.dashboard.modules.infra.service.job.impl.InfJobLogServiceImpl;
|
||||
import cn.iocoder.dashboard.util.object.ObjectUtils;
|
||||
|
||||
/**
|
||||
* {@link InfJobLogServiceImpl} 的单元测试
|
||||
*
|
||||
* @author neilz
|
||||
*/
|
||||
@Import(InfJobLogServiceImpl.class)
|
||||
public class InfJobLogServiceTest extends BaseDbUnitTest {
|
||||
|
||||
@Resource
|
||||
private InfJobLogServiceImpl jobLogService;
|
||||
@Resource
|
||||
private InfJobLogMapper jobLogMapper;
|
||||
|
||||
@Test
|
||||
public void testCreateJobLog_success() {
|
||||
// 准备参数
|
||||
InfJobLogDO reqVO = randomPojo(InfJobLogDO.class, o -> {
|
||||
o.setExecuteIndex(1);
|
||||
});
|
||||
// 调用
|
||||
Long jobLogId = jobLogService.createJobLog(reqVO.getJobId(), reqVO.getBeginTime(), reqVO.getHandlerName(), reqVO.getHandlerParam(), reqVO.getExecuteIndex());
|
||||
// 断言
|
||||
assertNotNull(jobLogId);
|
||||
// 校验记录的属性是否正确
|
||||
InfJobLogDO job = jobLogMapper.selectById(jobLogId);
|
||||
assertEquals(InfJobLogStatusEnum.RUNNING.getStatus(), job.getStatus());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testUpdateJobLogResultAsync_success() {
|
||||
// 准备参数
|
||||
InfJobLogDO reqVO = randomPojo(InfJobLogDO.class, o -> {
|
||||
o.setExecuteIndex(1);
|
||||
});
|
||||
InfJobLogDO log = InfJobLogDO.builder().jobId(reqVO.getJobId()).handlerName(reqVO.getHandlerName()).handlerParam(reqVO.getHandlerParam()).executeIndex(reqVO.getExecuteIndex())
|
||||
.beginTime(reqVO.getBeginTime()).status(InfJobLogStatusEnum.RUNNING.getStatus()).build();
|
||||
jobLogMapper.insert(log);
|
||||
// 调用
|
||||
jobLogService.updateJobLogResultAsync(log.getId(), reqVO.getBeginTime(), reqVO.getDuration(), true,reqVO.getResult());
|
||||
// 校验记录的属性是否正确
|
||||
InfJobLogDO job = jobLogMapper.selectById(log.getId());
|
||||
assertEquals(InfJobLogStatusEnum.SUCCESS.getStatus(), job.getStatus());
|
||||
|
||||
// 调用
|
||||
jobLogService.updateJobLogResultAsync(log.getId(), reqVO.getBeginTime(), reqVO.getDuration(), false,reqVO.getResult());
|
||||
// 校验记录的属性是否正确
|
||||
InfJobLogDO job2 = jobLogMapper.selectById(log.getId());
|
||||
assertEquals(InfJobLogStatusEnum.FAILURE.getStatus(), job2.getStatus());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testGetJobLogListByIds_success() {
|
||||
// mock 数据
|
||||
InfJobLogDO dbJobLog = randomPojo(InfJobLogDO.class, o -> {
|
||||
o.setExecuteIndex(1);
|
||||
o.setStatus(randomEle(InfJobLogStatusEnum.values()).getStatus()); // 保证 status 的范围
|
||||
});
|
||||
InfJobLogDO cloneJobLog = ObjectUtils.clone(dbJobLog, o -> o.setHandlerName(randomString()));
|
||||
jobLogMapper.insert(dbJobLog);
|
||||
// 测试 handlerName 不匹配
|
||||
jobLogMapper.insert(cloneJobLog);
|
||||
// 准备参数
|
||||
ArrayList ids = new ArrayList<>();
|
||||
ids.add(dbJobLog.getId());
|
||||
ids.add(cloneJobLog.getId());
|
||||
// 调用
|
||||
List<InfJobLogDO> list = jobLogService.getJobLogList(ids);
|
||||
// 断言
|
||||
assertEquals(2, list.size());
|
||||
assertPojoEquals(dbJobLog, list.get(0));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testGetJobPage_success() {
|
||||
// mock 数据
|
||||
InfJobLogDO dbJobLog = randomPojo(InfJobLogDO.class, o -> {
|
||||
o.setExecuteIndex(1);
|
||||
o.setHandlerName("handlerName 单元测试");
|
||||
o.setStatus(InfJobLogStatusEnum.SUCCESS.getStatus());
|
||||
o.setBeginTime(buildTime(2021, 1, 8));
|
||||
o.setEndTime(buildTime(2021, 1, 8));
|
||||
});
|
||||
jobLogMapper.insert(dbJobLog);
|
||||
// 测试 jobId 不匹配
|
||||
jobLogMapper.insert(ObjectUtils.clone(dbJobLog, o -> o.setJobId(randomLongId())));
|
||||
// 测试 handlerName 不匹配
|
||||
jobLogMapper.insert(ObjectUtils.clone(dbJobLog, o -> o.setHandlerName(randomString())));
|
||||
// 测试 beginTime 不匹配
|
||||
jobLogMapper.insert(ObjectUtils.clone(dbJobLog, o -> o.setBeginTime(buildTime(2021, 1, 7))));
|
||||
// 测试 endTime 不匹配
|
||||
jobLogMapper.insert(ObjectUtils.clone(dbJobLog, o -> o.setEndTime(buildTime(2021, 1, 9))));
|
||||
// 测试 status 不匹配
|
||||
jobLogMapper.insert(ObjectUtils.clone(dbJobLog, o -> o.setStatus(InfJobLogStatusEnum.FAILURE.getStatus())));
|
||||
// 准备参数
|
||||
InfJobLogPageReqVO reqVo = new InfJobLogPageReqVO();
|
||||
reqVo.setJobId(dbJobLog.getJobId());
|
||||
reqVo.setHandlerName("单元");
|
||||
reqVo.setBeginTime(dbJobLog.getBeginTime());
|
||||
reqVo.setEndTime(dbJobLog.getEndTime());
|
||||
reqVo.setStatus(InfJobLogStatusEnum.SUCCESS.getStatus());
|
||||
// 调用
|
||||
PageResult<InfJobLogDO> pageResult = jobLogService.getJobLogPage(reqVo);
|
||||
// 断言
|
||||
assertEquals(1, pageResult.getTotal());
|
||||
assertEquals(1, pageResult.getList().size());
|
||||
assertPojoEquals(dbJobLog, pageResult.getList().get(0));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testGetJobListForExport_success() {
|
||||
// mock 数据
|
||||
InfJobLogDO dbJobLog = randomPojo(InfJobLogDO.class, o -> {
|
||||
o.setExecuteIndex(1);
|
||||
o.setHandlerName("handlerName 单元测试");
|
||||
o.setStatus(InfJobLogStatusEnum.SUCCESS.getStatus());
|
||||
o.setBeginTime(buildTime(2021, 1, 8));
|
||||
o.setEndTime(buildTime(2021, 1, 8));
|
||||
});
|
||||
jobLogMapper.insert(dbJobLog);
|
||||
// 测试 jobId 不匹配
|
||||
jobLogMapper.insert(ObjectUtils.clone(dbJobLog, o -> o.setJobId(randomLongId())));
|
||||
// 测试 handlerName 不匹配
|
||||
jobLogMapper.insert(ObjectUtils.clone(dbJobLog, o -> o.setHandlerName(randomString())));
|
||||
// 测试 beginTime 不匹配
|
||||
jobLogMapper.insert(ObjectUtils.clone(dbJobLog, o -> o.setBeginTime(buildTime(2021, 1, 7))));
|
||||
// 测试 endTime 不匹配
|
||||
jobLogMapper.insert(ObjectUtils.clone(dbJobLog, o -> o.setEndTime(buildTime(2021, 1, 9))));
|
||||
// 测试 status 不匹配
|
||||
jobLogMapper.insert(ObjectUtils.clone(dbJobLog, o -> o.setStatus(InfJobLogStatusEnum.FAILURE.getStatus())));
|
||||
// 准备参数
|
||||
InfJobLogExportReqVO reqVo = new InfJobLogExportReqVO();
|
||||
reqVo.setJobId(dbJobLog.getJobId());
|
||||
reqVo.setHandlerName("单元");
|
||||
reqVo.setBeginTime(dbJobLog.getBeginTime());
|
||||
reqVo.setEndTime(dbJobLog.getEndTime());
|
||||
reqVo.setStatus(InfJobLogStatusEnum.SUCCESS.getStatus());
|
||||
// 调用
|
||||
List<InfJobLogDO> list = jobLogService.getJobLogList(reqVo);
|
||||
// 断言
|
||||
assertEquals(1, list.size());
|
||||
assertPojoEquals(dbJobLog, list.get(0));
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,309 @@
|
||||
package cn.iocoder.dashboard.modules.infra.service.job;
|
||||
|
||||
import static cn.hutool.core.util.RandomUtil.randomEle;
|
||||
import static cn.iocoder.dashboard.modules.infra.enums.InfErrorCodeConstants.JOB_CHANGE_STATUS_EQUALS;
|
||||
import static cn.iocoder.dashboard.modules.infra.enums.InfErrorCodeConstants.JOB_CHANGE_STATUS_INVALID;
|
||||
import static cn.iocoder.dashboard.modules.infra.enums.InfErrorCodeConstants.JOB_CRON_EXPRESSION_VALID;
|
||||
import static cn.iocoder.dashboard.modules.infra.enums.InfErrorCodeConstants.JOB_HANDLER_EXISTS;
|
||||
import static cn.iocoder.dashboard.modules.infra.enums.InfErrorCodeConstants.JOB_NOT_EXISTS;
|
||||
import static cn.iocoder.dashboard.modules.infra.enums.InfErrorCodeConstants.JOB_UPDATE_ONLY_NORMAL_STATUS;
|
||||
import static cn.iocoder.dashboard.util.AssertUtils.assertPojoEquals;
|
||||
import static cn.iocoder.dashboard.util.AssertUtils.assertServiceException;
|
||||
import static cn.iocoder.dashboard.util.RandomUtils.randomPojo;
|
||||
import static cn.iocoder.dashboard.util.RandomUtils.randomString;
|
||||
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||
import static org.junit.jupiter.api.Assertions.assertNotNull;
|
||||
import static org.junit.jupiter.api.Assertions.assertNull;
|
||||
import static org.mockito.ArgumentMatchers.eq;
|
||||
import static org.mockito.Mockito.times;
|
||||
import static org.mockito.Mockito.verify;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
|
||||
import org.junit.jupiter.api.Test;
|
||||
import org.quartz.SchedulerException;
|
||||
import org.springframework.boot.test.mock.mockito.MockBean;
|
||||
import org.springframework.context.annotation.Import;
|
||||
|
||||
import cn.iocoder.dashboard.BaseDbUnitTest;
|
||||
import cn.iocoder.dashboard.common.pojo.PageResult;
|
||||
import cn.iocoder.dashboard.framework.quartz.core.scheduler.SchedulerManager;
|
||||
import cn.iocoder.dashboard.modules.infra.controller.job.vo.job.InfJobCreateReqVO;
|
||||
import cn.iocoder.dashboard.modules.infra.controller.job.vo.job.InfJobExportReqVO;
|
||||
import cn.iocoder.dashboard.modules.infra.controller.job.vo.job.InfJobPageReqVO;
|
||||
import cn.iocoder.dashboard.modules.infra.controller.job.vo.job.InfJobUpdateReqVO;
|
||||
import cn.iocoder.dashboard.modules.infra.convert.job.InfJobConvert;
|
||||
import cn.iocoder.dashboard.modules.infra.dal.dataobject.job.InfJobDO;
|
||||
import cn.iocoder.dashboard.modules.infra.dal.mysql.job.InfJobMapper;
|
||||
import cn.iocoder.dashboard.modules.infra.enums.job.InfJobStatusEnum;
|
||||
import cn.iocoder.dashboard.modules.infra.service.job.impl.InfJobServiceImpl;
|
||||
import cn.iocoder.dashboard.util.object.ObjectUtils;
|
||||
|
||||
/**
|
||||
* {@link InfJobServiceImpl} 的单元测试
|
||||
*
|
||||
* @author neilz
|
||||
*/
|
||||
@Import(InfJobServiceImpl.class)
|
||||
public class InfJobServiceTest extends BaseDbUnitTest {
|
||||
|
||||
@Resource
|
||||
private InfJobServiceImpl jobService;
|
||||
@Resource
|
||||
private InfJobMapper jobMapper;
|
||||
@MockBean
|
||||
private SchedulerManager schedulerManager;
|
||||
|
||||
@Test
|
||||
public void testCreateJob_cronExpressionValid() {
|
||||
// 准备参数。Cron 表达式为 String 类型,默认随机字符串。
|
||||
InfJobCreateReqVO reqVO = randomPojo(InfJobCreateReqVO.class);
|
||||
// 调用,并断言异常
|
||||
assertServiceException(() -> jobService.createJob(reqVO), JOB_CRON_EXPRESSION_VALID);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testCreateJob_jobHandlerExists() throws SchedulerException {
|
||||
// 准备参数 指定 Cron 表达式
|
||||
InfJobCreateReqVO reqVO = randomPojo(InfJobCreateReqVO.class, o -> o.setCronExpression("0 0/1 * * * ? *"));
|
||||
// 调用
|
||||
jobService.createJob(reqVO);
|
||||
// 调用,并断言异常
|
||||
assertServiceException(() -> jobService.createJob(reqVO), JOB_HANDLER_EXISTS);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testCreateJob_success() throws SchedulerException {
|
||||
// 准备参数 指定 Cron 表达式
|
||||
InfJobCreateReqVO reqVO = randomPojo(InfJobCreateReqVO.class, o -> o.setCronExpression("0 0/1 * * * ? *"));
|
||||
// 调用
|
||||
Long jobId = jobService.createJob(reqVO);
|
||||
// 断言
|
||||
assertNotNull(jobId);
|
||||
// 校验记录的属性是否正确
|
||||
InfJobDO job = jobMapper.selectById(jobId);
|
||||
assertPojoEquals(reqVO, job);
|
||||
assertEquals(InfJobStatusEnum.NORMAL.getStatus(), job.getStatus());
|
||||
// 校验调用
|
||||
verify(schedulerManager, times(1)).addJob(eq(job.getId()), eq(job.getHandlerName()), eq(job.getHandlerParam()), eq(job.getCronExpression()),
|
||||
eq(reqVO.getRetryCount()), eq(reqVO.getRetryInterval()));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testUpdateJob_jobNotExists(){
|
||||
// 准备参数
|
||||
InfJobUpdateReqVO reqVO = randomPojo(InfJobUpdateReqVO.class, o -> o.setCronExpression("0 0/1 * * * ? *"));
|
||||
// 调用,并断言异常
|
||||
assertServiceException(() -> jobService.updateJob(reqVO), JOB_NOT_EXISTS);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testUpdateJob_onlyNormalStatus(){
|
||||
// mock 数据
|
||||
InfJobCreateReqVO createReqVO = randomPojo(InfJobCreateReqVO.class, o -> o.setCronExpression("0 0/1 * * * ? *"));
|
||||
InfJobDO job = InfJobConvert.INSTANCE.convert(createReqVO);
|
||||
job.setStatus(InfJobStatusEnum.INIT.getStatus());
|
||||
fillJobMonitorTimeoutEmpty(job);
|
||||
jobMapper.insert(job);
|
||||
// 准备参数
|
||||
InfJobUpdateReqVO updateReqVO = randomPojo(InfJobUpdateReqVO.class, o -> {
|
||||
o.setId(job.getId());
|
||||
o.setName(createReqVO.getName());
|
||||
o.setCronExpression(createReqVO.getCronExpression());
|
||||
});
|
||||
// 调用,并断言异常
|
||||
assertServiceException(() -> jobService.updateJob(updateReqVO), JOB_UPDATE_ONLY_NORMAL_STATUS);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testUpdateJob_success() throws SchedulerException {
|
||||
// mock 数据
|
||||
InfJobCreateReqVO createReqVO = randomPojo(InfJobCreateReqVO.class, o -> o.setCronExpression("0 0/1 * * * ? *"));
|
||||
InfJobDO job = InfJobConvert.INSTANCE.convert(createReqVO);
|
||||
job.setStatus(InfJobStatusEnum.NORMAL.getStatus());
|
||||
fillJobMonitorTimeoutEmpty(job);
|
||||
jobMapper.insert(job);
|
||||
// 准备参数
|
||||
InfJobUpdateReqVO updateReqVO = randomPojo(InfJobUpdateReqVO.class, o -> {
|
||||
o.setId(job.getId());
|
||||
o.setName(createReqVO.getName());
|
||||
o.setCronExpression(createReqVO.getCronExpression());
|
||||
});
|
||||
// 调用
|
||||
jobService.updateJob(updateReqVO);
|
||||
// 校验记录的属性是否正确
|
||||
InfJobDO updateJob = jobMapper.selectById(updateReqVO.getId());
|
||||
assertPojoEquals(updateReqVO, updateJob);
|
||||
// 校验调用
|
||||
verify(schedulerManager, times(1)).updateJob(eq(job.getHandlerName()), eq(updateReqVO.getHandlerParam()), eq(updateReqVO.getCronExpression()),
|
||||
eq(updateReqVO.getRetryCount()), eq(updateReqVO.getRetryInterval()));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testUpdateJobStatus_changeStatusInvalid() {
|
||||
// 调用,并断言异常
|
||||
assertServiceException(() -> jobService.updateJobStatus(1l, InfJobStatusEnum.INIT.getStatus()), JOB_CHANGE_STATUS_INVALID);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testUpdateJobStatus_changeStatusEquals() {
|
||||
// mock 数据
|
||||
InfJobCreateReqVO createReqVO = randomPojo(InfJobCreateReqVO.class, o -> o.setCronExpression("0 0/1 * * * ? *"));
|
||||
InfJobDO job = InfJobConvert.INSTANCE.convert(createReqVO);
|
||||
job.setStatus(InfJobStatusEnum.NORMAL.getStatus());
|
||||
fillJobMonitorTimeoutEmpty(job);
|
||||
jobMapper.insert(job);
|
||||
// 调用,并断言异常
|
||||
assertServiceException(() -> jobService.updateJobStatus(job.getId(), job.getStatus()), JOB_CHANGE_STATUS_EQUALS);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testUpdateJobStatus_NormalToStop_success() throws SchedulerException {
|
||||
// mock 数据
|
||||
InfJobCreateReqVO createReqVO = randomPojo(InfJobCreateReqVO.class, o -> o.setCronExpression("0 0/1 * * * ? *"));
|
||||
InfJobDO job = InfJobConvert.INSTANCE.convert(createReqVO);
|
||||
job.setStatus(InfJobStatusEnum.NORMAL.getStatus());
|
||||
fillJobMonitorTimeoutEmpty(job);
|
||||
jobMapper.insert(job);
|
||||
// 调用
|
||||
jobService.updateJobStatus(job.getId(), InfJobStatusEnum.STOP.getStatus());
|
||||
// 校验记录的属性是否正确
|
||||
InfJobDO updateJob = jobMapper.selectById(job.getId());
|
||||
assertEquals(InfJobStatusEnum.STOP.getStatus(), updateJob.getStatus());
|
||||
// 校验调用
|
||||
verify(schedulerManager, times(1)).pauseJob(eq(job.getHandlerName()));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testUpdateJobStatus_StopToNormal_success() throws SchedulerException {
|
||||
// mock 数据
|
||||
InfJobCreateReqVO createReqVO = randomPojo(InfJobCreateReqVO.class, o -> o.setCronExpression("0 0/1 * * * ? *"));
|
||||
InfJobDO job = InfJobConvert.INSTANCE.convert(createReqVO);
|
||||
job.setStatus(InfJobStatusEnum.STOP.getStatus());
|
||||
fillJobMonitorTimeoutEmpty(job);
|
||||
jobMapper.insert(job);
|
||||
// 调用
|
||||
jobService.updateJobStatus(job.getId(), InfJobStatusEnum.NORMAL.getStatus());
|
||||
// 校验记录的属性是否正确
|
||||
InfJobDO updateJob = jobMapper.selectById(job.getId());
|
||||
assertEquals(InfJobStatusEnum.NORMAL.getStatus(), updateJob.getStatus());
|
||||
// 校验调用
|
||||
verify(schedulerManager, times(1)).resumeJob(eq(job.getHandlerName()));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testTriggerJob_success() throws SchedulerException {
|
||||
// mock 数据
|
||||
InfJobCreateReqVO createReqVO = randomPojo(InfJobCreateReqVO.class, o -> o.setCronExpression("0 0/1 * * * ? *"));
|
||||
InfJobDO job = InfJobConvert.INSTANCE.convert(createReqVO);
|
||||
job.setStatus(InfJobStatusEnum.NORMAL.getStatus());
|
||||
fillJobMonitorTimeoutEmpty(job);
|
||||
jobMapper.insert(job);
|
||||
// 调用
|
||||
jobService.triggerJob(job.getId());
|
||||
// 校验调用
|
||||
verify(schedulerManager, times(1)).triggerJob(eq(job.getId()), eq(job.getHandlerName()), eq(job.getHandlerParam()));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testDeleteJob_success() throws SchedulerException {
|
||||
// mock 数据
|
||||
InfJobCreateReqVO createReqVO = randomPojo(InfJobCreateReqVO.class, o -> o.setCronExpression("0 0/1 * * * ? *"));
|
||||
InfJobDO job = InfJobConvert.INSTANCE.convert(createReqVO);
|
||||
job.setStatus(InfJobStatusEnum.NORMAL.getStatus());
|
||||
fillJobMonitorTimeoutEmpty(job);
|
||||
jobMapper.insert(job);
|
||||
// 调用 UPDATE inf_job SET deleted=1 WHERE id=? AND deleted=0
|
||||
jobService.deleteJob(job.getId());
|
||||
// 校验数据不存在了 WHERE id=? AND deleted=0 查询为空正常
|
||||
assertNull(jobMapper.selectById(job.getId()));
|
||||
// 校验调用
|
||||
verify(schedulerManager, times(1)).deleteJob(eq(job.getHandlerName()));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testGetJobListByIds_success() {
|
||||
// mock 数据
|
||||
InfJobDO dbJob = randomPojo(InfJobDO.class, o -> {
|
||||
o.setStatus(randomEle(InfJobStatusEnum.values()).getStatus()); // 保证 status 的范围
|
||||
});
|
||||
InfJobDO cloneJob = ObjectUtils.clone(dbJob, o -> o.setHandlerName(randomString()));
|
||||
jobMapper.insert(dbJob);
|
||||
// 测试 handlerName 不匹配
|
||||
jobMapper.insert(cloneJob);
|
||||
// 准备参数
|
||||
ArrayList ids = new ArrayList<>();
|
||||
ids.add(dbJob.getId());
|
||||
ids.add(cloneJob.getId());
|
||||
// 调用
|
||||
List<InfJobDO> list = jobService.getJobList(ids);
|
||||
// 断言
|
||||
assertEquals(2, list.size());
|
||||
assertPojoEquals(dbJob, list.get(0));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testGetJobPage_success() {
|
||||
// mock 数据
|
||||
InfJobDO dbJob = randomPojo(InfJobDO.class, o -> {
|
||||
o.setName("定时任务测试");
|
||||
o.setHandlerName("handlerName 单元测试");
|
||||
o.setStatus(InfJobStatusEnum.INIT.getStatus());
|
||||
});
|
||||
jobMapper.insert(dbJob);
|
||||
// 测试 name 不匹配
|
||||
jobMapper.insert(ObjectUtils.clone(dbJob, o -> o.setName("土豆")));
|
||||
// 测试 status 不匹配
|
||||
jobMapper.insert(ObjectUtils.clone(dbJob, o -> o.setStatus(InfJobStatusEnum.NORMAL.getStatus())));
|
||||
// 测试 handlerName 不匹配
|
||||
jobMapper.insert(ObjectUtils.clone(dbJob, o -> o.setHandlerName(randomString())));
|
||||
// 准备参数
|
||||
InfJobPageReqVO reqVo = new InfJobPageReqVO();
|
||||
reqVo.setName("定时");
|
||||
reqVo.setStatus(InfJobStatusEnum.INIT.getStatus());
|
||||
reqVo.setHandlerName("单元");
|
||||
// 调用
|
||||
PageResult<InfJobDO> pageResult = jobService.getJobPage(reqVo);
|
||||
// 断言
|
||||
assertEquals(1, pageResult.getTotal());
|
||||
assertEquals(1, pageResult.getList().size());
|
||||
assertPojoEquals(dbJob, pageResult.getList().get(0));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testGetJobListForExport_success() {
|
||||
// mock 数据
|
||||
InfJobDO dbJob = randomPojo(InfJobDO.class, o -> {
|
||||
o.setName("定时任务测试");
|
||||
o.setHandlerName("handlerName 单元测试");
|
||||
o.setStatus(InfJobStatusEnum.INIT.getStatus());
|
||||
});
|
||||
jobMapper.insert(dbJob);
|
||||
// 测试 name 不匹配
|
||||
jobMapper.insert(ObjectUtils.clone(dbJob, o -> o.setName("土豆")));
|
||||
// 测试 status 不匹配
|
||||
jobMapper.insert(ObjectUtils.clone(dbJob, o -> o.setStatus(InfJobStatusEnum.NORMAL.getStatus())));
|
||||
// 测试 handlerName 不匹配
|
||||
jobMapper.insert(ObjectUtils.clone(dbJob, o -> o.setHandlerName(randomString())));
|
||||
// 准备参数
|
||||
InfJobExportReqVO reqVo = new InfJobExportReqVO();
|
||||
reqVo.setName("定时");
|
||||
reqVo.setStatus(InfJobStatusEnum.INIT.getStatus());
|
||||
reqVo.setHandlerName("单元");
|
||||
// 调用
|
||||
List<InfJobDO> list = jobService.getJobList(reqVo);
|
||||
// 断言
|
||||
assertEquals(1, list.size());
|
||||
assertPojoEquals(dbJob, list.get(0));
|
||||
}
|
||||
|
||||
private static void fillJobMonitorTimeoutEmpty(InfJobDO job) {
|
||||
if (job.getMonitorTimeout() == null) {
|
||||
job.setMonitorTimeout(0);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
@ -38,7 +38,6 @@ public class InfApiAccessLogServiceImplTest extends BaseDbUnitTest {
|
||||
@Resource
|
||||
private InfApiAccessLogMapper infApiAccessLogMapper;
|
||||
|
||||
|
||||
@Test
|
||||
public void testCreateApiAccessLogAsync() throws Exception {
|
||||
ApiAccessLogCreateDTO createDTO = RandomUtils.randomPojo(
|
||||
@ -59,13 +58,12 @@ public class InfApiAccessLogServiceImplTest extends BaseDbUnitTest {
|
||||
assertPojoEquals(createDTO, infApiAccessLogDO);
|
||||
}
|
||||
|
||||
|
||||
@Test
|
||||
public void testGetApiAccessLogPage() {
|
||||
// 构造测试数据
|
||||
long userId = 2233L;
|
||||
int userType = UserTypeEnum.ADMIN.getValue();
|
||||
String applicationName = "ruoyi-test";
|
||||
String applicationName = "yudao-test";
|
||||
String requestUrl = "foo";
|
||||
Date beginTime = buildTime(2021, 3, 13);
|
||||
int duration = 1000;
|
||||
@ -123,7 +121,7 @@ public class InfApiAccessLogServiceImplTest extends BaseDbUnitTest {
|
||||
// 构造测试数据
|
||||
long userId = 2233L;
|
||||
int userType = UserTypeEnum.ADMIN.getValue();
|
||||
String applicationName = "ruoyi-test";
|
||||
String applicationName = "yudao-test";
|
||||
String requestUrl = "foo";
|
||||
Date beginTime = buildTime(2021, 3, 13);
|
||||
int duration = 1000;
|
||||
@ -174,4 +172,5 @@ public class InfApiAccessLogServiceImplTest extends BaseDbUnitTest {
|
||||
assertEquals(1, list.size());
|
||||
assertPojoEquals(infApiAccessLogDO, list.get(0));
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -68,7 +68,7 @@ public class InfApiErrorLogServiceImplTest extends BaseDbUnitTest {
|
||||
// 构造测试数据
|
||||
long userId = 2233L;
|
||||
int userType = UserTypeEnum.ADMIN.getValue();
|
||||
String applicationName = "ruoyi-test";
|
||||
String applicationName = "yudao-test";
|
||||
String requestUrl = "foo";
|
||||
Date beginTime = buildTime(2021, 3, 13);
|
||||
int progressStatus = InfApiErrorLogProcessStatusEnum.INIT.getStatus();
|
||||
@ -121,7 +121,7 @@ public class InfApiErrorLogServiceImplTest extends BaseDbUnitTest {
|
||||
// 构造测试数据
|
||||
long userId = 2233L;
|
||||
int userType = UserTypeEnum.ADMIN.getValue();
|
||||
String applicationName = "ruoyi-test";
|
||||
String applicationName = "yudao-test";
|
||||
String requestUrl = "foo";
|
||||
Date beginTime = buildTime(2021, 3, 13);
|
||||
int progressStatus = InfApiErrorLogProcessStatusEnum.INIT.getStatus();
|
||||
|
@ -1,110 +1,269 @@
|
||||
package cn.iocoder.dashboard.modules.system.service.auth;
|
||||
|
||||
import cn.iocoder.dashboard.BaseDbUnitTest;
|
||||
import cn.iocoder.dashboard.common.enums.CommonStatusEnum;
|
||||
import cn.iocoder.dashboard.framework.security.core.LoginUser;
|
||||
import cn.iocoder.dashboard.modules.system.dal.dataobject.user.SysUserDO;
|
||||
import cn.iocoder.dashboard.modules.system.service.auth.impl.SysAuthServiceImpl;
|
||||
import cn.iocoder.dashboard.modules.system.service.common.SysCaptchaService;
|
||||
import cn.iocoder.dashboard.modules.system.service.logger.SysLoginLogService;
|
||||
import cn.iocoder.dashboard.modules.system.service.permission.SysPermissionService;
|
||||
import cn.iocoder.dashboard.modules.system.service.user.SysUserService;
|
||||
import cn.iocoder.dashboard.util.AssertUtils;
|
||||
import org.junit.jupiter.api.Test;
|
||||
import org.springframework.boot.test.mock.mockito.MockBean;
|
||||
import org.springframework.context.annotation.Import;
|
||||
import org.springframework.security.authentication.AuthenticationManager;
|
||||
import org.springframework.security.core.userdetails.UsernameNotFoundException;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import java.util.Set;
|
||||
|
||||
import static cn.iocoder.dashboard.util.RandomUtils.*;
|
||||
import static java.util.Collections.singleton;
|
||||
import static org.junit.jupiter.api.Assertions.*;
|
||||
import static org.mockito.ArgumentMatchers.eq;
|
||||
import static org.mockito.Mockito.when;
|
||||
|
||||
/**
|
||||
* {@link SysAuthServiceImpl} 的单元测试
|
||||
*
|
||||
* @author 芋道源码
|
||||
*/
|
||||
@Import(SysAuthServiceImpl.class)
|
||||
public class SysAuthServiceImplTest extends BaseDbUnitTest {
|
||||
|
||||
@Resource
|
||||
private SysAuthServiceImpl authService;
|
||||
|
||||
@MockBean
|
||||
private SysUserService userService;
|
||||
@MockBean
|
||||
private SysPermissionService permissionService;
|
||||
@MockBean
|
||||
private AuthenticationManager authenticationManager;
|
||||
@MockBean
|
||||
private SysCaptchaService captchaService;
|
||||
@MockBean
|
||||
private SysLoginLogService loginLogService;
|
||||
@MockBean
|
||||
private SysUserSessionService userSessionService;
|
||||
|
||||
@Test
|
||||
public void testLoadUserByUsername_success() {
|
||||
// 准备参数
|
||||
String username = randomString();
|
||||
// mock 方法
|
||||
SysUserDO user = randomUserDO(o -> o.setUsername(username));
|
||||
when(userService.getUserByUserName(eq(username))).thenReturn(user);
|
||||
|
||||
// 调用
|
||||
LoginUser loginUser = (LoginUser) authService.loadUserByUsername(username);
|
||||
// 校验
|
||||
AssertUtils.assertPojoEquals(user, loginUser, "updateTime");
|
||||
assertNull(loginUser.getRoleIds()); // 此时不会加载角色,所以是空的
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testLoadUserByUsername_userNotFound() {
|
||||
// 准备参数
|
||||
String username = randomString();
|
||||
// mock 方法
|
||||
|
||||
// 调用, 并断言异常
|
||||
assertThrows(UsernameNotFoundException.class, // 抛出 UsernameNotFoundException 异常
|
||||
() -> authService.loadUserByUsername(username),
|
||||
username); // 异常提示为 username
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testMockLogin_success() {
|
||||
// 准备参数
|
||||
Long userId = randomLongId();
|
||||
// mock 方法 01
|
||||
SysUserDO user = randomUserDO(o -> o.setId(userId));
|
||||
when(userService.getUser(eq(userId))).thenReturn(user);
|
||||
// mock 方法 02
|
||||
Set<Long> roleIds = randomSet(Long.class);
|
||||
when(permissionService.getUserRoleIds(eq(userId), eq(singleton(CommonStatusEnum.ENABLE.getStatus()))))
|
||||
.thenReturn(roleIds);
|
||||
|
||||
// 调用
|
||||
LoginUser loginUser = authService.mockLogin(userId);
|
||||
// 断言
|
||||
AssertUtils.assertPojoEquals(user, loginUser, "updateTime");
|
||||
assertEquals(roleIds, loginUser.getRoleIds());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testMockLogin_userNotFound() {
|
||||
// 准备参数
|
||||
Long userId = randomLongId();
|
||||
// mock 方法
|
||||
|
||||
// 调用, 并断言异常
|
||||
assertThrows(UsernameNotFoundException.class, // 抛出 UsernameNotFoundException 异常
|
||||
() -> authService.mockLogin(userId),
|
||||
String.valueOf(userId)); // 异常提示为 userId
|
||||
}
|
||||
|
||||
}
|
||||
package cn.iocoder.dashboard.modules.system.service.auth;
|
||||
|
||||
import cn.iocoder.dashboard.BaseDbUnitTest;
|
||||
import cn.iocoder.dashboard.common.enums.CommonStatusEnum;
|
||||
import cn.iocoder.dashboard.framework.security.core.LoginUser;
|
||||
import cn.iocoder.dashboard.modules.system.controller.auth.vo.auth.SysAuthLoginReqVO;
|
||||
import cn.iocoder.dashboard.modules.system.dal.dataobject.user.SysUserDO;
|
||||
import cn.iocoder.dashboard.modules.system.enums.logger.SysLoginLogTypeEnum;
|
||||
import cn.iocoder.dashboard.modules.system.enums.logger.SysLoginResultEnum;
|
||||
import cn.iocoder.dashboard.modules.system.service.auth.impl.SysAuthServiceImpl;
|
||||
import cn.iocoder.dashboard.modules.system.service.common.SysCaptchaService;
|
||||
import cn.iocoder.dashboard.modules.system.service.logger.SysLoginLogService;
|
||||
import cn.iocoder.dashboard.modules.system.service.permission.SysPermissionService;
|
||||
import cn.iocoder.dashboard.modules.system.service.user.SysUserService;
|
||||
import cn.iocoder.dashboard.util.AssertUtils;
|
||||
import org.junit.jupiter.api.Test;
|
||||
import org.springframework.boot.test.mock.mockito.MockBean;
|
||||
import org.springframework.context.annotation.Import;
|
||||
import org.springframework.security.authentication.AuthenticationManager;
|
||||
import org.springframework.security.authentication.BadCredentialsException;
|
||||
import org.springframework.security.authentication.DisabledException;
|
||||
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
|
||||
import org.springframework.security.core.Authentication;
|
||||
import org.springframework.security.core.AuthenticationException;
|
||||
import org.springframework.security.core.userdetails.UsernameNotFoundException;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import java.util.Set;
|
||||
|
||||
import static cn.iocoder.dashboard.modules.system.enums.SysErrorCodeConstants.*;
|
||||
import static cn.iocoder.dashboard.util.AssertUtils.assertServiceException;
|
||||
import static cn.iocoder.dashboard.util.RandomUtils.*;
|
||||
import static java.util.Collections.singleton;
|
||||
import static org.junit.jupiter.api.Assertions.*;
|
||||
import static org.mockito.ArgumentMatchers.eq;
|
||||
import static org.mockito.Mockito.*;
|
||||
|
||||
/**
|
||||
* {@link SysAuthServiceImpl} 的单元测试
|
||||
*
|
||||
* @author 芋道源码
|
||||
*/
|
||||
@Import(SysAuthServiceImpl.class)
|
||||
public class SysAuthServiceImplTest extends BaseDbUnitTest {
|
||||
|
||||
@Resource
|
||||
private SysAuthServiceImpl authService;
|
||||
|
||||
@MockBean
|
||||
private SysUserService userService;
|
||||
@MockBean
|
||||
private SysPermissionService permissionService;
|
||||
@MockBean
|
||||
private AuthenticationManager authenticationManager;
|
||||
@MockBean
|
||||
private Authentication authentication;
|
||||
@MockBean
|
||||
private SysCaptchaService captchaService;
|
||||
@MockBean
|
||||
private SysLoginLogService loginLogService;
|
||||
@MockBean
|
||||
private SysUserSessionService userSessionService;
|
||||
|
||||
@Test
|
||||
public void testLoadUserByUsername_success() {
|
||||
// 准备参数
|
||||
String username = randomString();
|
||||
// mock 方法
|
||||
SysUserDO user = randomUserDO(o -> o.setUsername(username));
|
||||
when(userService.getUserByUsername(eq(username))).thenReturn(user);
|
||||
|
||||
// 调用
|
||||
LoginUser loginUser = (LoginUser) authService.loadUserByUsername(username);
|
||||
// 校验
|
||||
AssertUtils.assertPojoEquals(user, loginUser, "updateTime");
|
||||
assertNull(loginUser.getRoleIds()); // 此时不会加载角色,所以是空的
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testLoadUserByUsername_userNotFound() {
|
||||
// 准备参数
|
||||
String username = randomString();
|
||||
// mock 方法
|
||||
|
||||
// 调用, 并断言异常
|
||||
assertThrows(UsernameNotFoundException.class, // 抛出 UsernameNotFoundException 异常
|
||||
() -> authService.loadUserByUsername(username),
|
||||
username); // 异常提示为 username
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testMockLogin_success() {
|
||||
// 准备参数
|
||||
Long userId = randomLongId();
|
||||
// mock 方法 01
|
||||
SysUserDO user = randomUserDO(o -> o.setId(userId));
|
||||
when(userService.getUser(eq(userId))).thenReturn(user);
|
||||
// mock 方法 02
|
||||
Set<Long> roleIds = randomSet(Long.class);
|
||||
when(permissionService.getUserRoleIds(eq(userId), eq(singleton(CommonStatusEnum.ENABLE.getStatus()))))
|
||||
.thenReturn(roleIds);
|
||||
|
||||
// 调用
|
||||
LoginUser loginUser = authService.mockLogin(userId);
|
||||
// 断言
|
||||
AssertUtils.assertPojoEquals(user, loginUser, "updateTime");
|
||||
assertEquals(roleIds, loginUser.getRoleIds());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testMockLogin_userNotFound() {
|
||||
// 准备参数
|
||||
Long userId = randomLongId();
|
||||
// mock 方法
|
||||
|
||||
// 调用, 并断言异常
|
||||
assertThrows(UsernameNotFoundException.class, // 抛出 UsernameNotFoundException 异常
|
||||
() -> authService.mockLogin(userId),
|
||||
String.valueOf(userId)); // 异常提示为 userId
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testLogin_captchaNotFound() {
|
||||
// 准备参数
|
||||
SysAuthLoginReqVO reqVO = randomPojo(SysAuthLoginReqVO.class);
|
||||
String userIp = randomString();
|
||||
String userAgent = randomString();
|
||||
// 调用, 并断言异常
|
||||
assertServiceException(() -> authService.login(reqVO, userIp, userAgent), AUTH_LOGIN_CAPTCHA_NOT_FOUND);
|
||||
// 校验调用参数
|
||||
verify(loginLogService, times(1)).createLoginLog(
|
||||
argThat(o -> o.getLogType().equals(SysLoginLogTypeEnum.LOGIN_USERNAME.getType())
|
||||
&& o.getResult().equals(SysLoginResultEnum.CAPTCHA_NOT_FOUND.getResult()))
|
||||
);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testLogin_captchaCodeError() {
|
||||
// 准备参数
|
||||
String userIp = randomString();
|
||||
String userAgent = randomString();
|
||||
String code = randomString();
|
||||
SysAuthLoginReqVO reqVO = randomPojo(SysAuthLoginReqVO.class);
|
||||
// mock 验证码不正确
|
||||
when(captchaService.getCaptchaCode(reqVO.getUuid())).thenReturn(code);
|
||||
// 调用, 并断言异常
|
||||
assertServiceException(() -> authService.login(reqVO, userIp, userAgent), AUTH_LOGIN_CAPTCHA_CODE_ERROR);
|
||||
// 校验调用参数
|
||||
verify(loginLogService, times(1)).createLoginLog(
|
||||
argThat(o -> o.getLogType().equals(SysLoginLogTypeEnum.LOGIN_USERNAME.getType())
|
||||
&& o.getResult().equals(SysLoginResultEnum.CAPTCHA_CODE_ERROR.getResult()))
|
||||
);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testLogin_badCredentials() {
|
||||
// 准备参数
|
||||
String userIp = randomString();
|
||||
String userAgent = randomString();
|
||||
SysAuthLoginReqVO reqVO = randomPojo(SysAuthLoginReqVO.class);
|
||||
// mock 验证码正确
|
||||
when(captchaService.getCaptchaCode(reqVO.getUuid())).thenReturn(reqVO.getCode());
|
||||
// mock 抛出异常
|
||||
when(authenticationManager.authenticate(new UsernamePasswordAuthenticationToken(reqVO.getUsername(), reqVO.getPassword())))
|
||||
.thenThrow(new BadCredentialsException("测试账号或密码不正确"));
|
||||
// 调用, 并断言异常
|
||||
assertServiceException(() -> authService.login(reqVO, userIp, userAgent), AUTH_LOGIN_BAD_CREDENTIALS);
|
||||
// 校验调用参数
|
||||
verify(captchaService, times(1)).deleteCaptchaCode(reqVO.getUuid());
|
||||
verify(loginLogService, times(1)).createLoginLog(
|
||||
argThat(o -> o.getLogType().equals(SysLoginLogTypeEnum.LOGIN_USERNAME.getType())
|
||||
&& o.getResult().equals(SysLoginResultEnum.BAD_CREDENTIALS.getResult()))
|
||||
);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testLogin_userDisabled() {
|
||||
// 准备参数
|
||||
String userIp = randomString();
|
||||
String userAgent = randomString();
|
||||
SysAuthLoginReqVO reqVO = randomPojo(SysAuthLoginReqVO.class);
|
||||
// mock 验证码正确
|
||||
when(captchaService.getCaptchaCode(reqVO.getUuid())).thenReturn(reqVO.getCode());
|
||||
// mock 抛出异常
|
||||
when(authenticationManager.authenticate(new UsernamePasswordAuthenticationToken(reqVO.getUsername(), reqVO.getPassword())))
|
||||
.thenThrow(new DisabledException("测试用户被禁用"));
|
||||
// 调用, 并断言异常
|
||||
assertServiceException(() -> authService.login(reqVO, userIp, userAgent), AUTH_LOGIN_USER_DISABLED);
|
||||
// 校验调用参数
|
||||
verify(captchaService, times(1)).deleteCaptchaCode(reqVO.getUuid());
|
||||
verify(loginLogService, times(1)).createLoginLog(
|
||||
argThat(o -> o.getLogType().equals(SysLoginLogTypeEnum.LOGIN_USERNAME.getType())
|
||||
&& o.getResult().equals(SysLoginResultEnum.USER_DISABLED.getResult()))
|
||||
);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testLogin_unknownError() {
|
||||
// 准备参数
|
||||
String userIp = randomString();
|
||||
String userAgent = randomString();
|
||||
SysAuthLoginReqVO reqVO = randomPojo(SysAuthLoginReqVO.class);
|
||||
// mock 验证码正确
|
||||
when(captchaService.getCaptchaCode(reqVO.getUuid())).thenReturn(reqVO.getCode());
|
||||
// mock 抛出异常
|
||||
when(authenticationManager.authenticate(new UsernamePasswordAuthenticationToken(reqVO.getUsername(), reqVO.getPassword())))
|
||||
.thenThrow(new AuthenticationException("测试未知异常") {});
|
||||
// 调用, 并断言异常
|
||||
assertServiceException(() -> authService.login(reqVO, userIp, userAgent), AUTH_LOGIN_FAIL_UNKNOWN);
|
||||
// 校验调用参数
|
||||
verify(captchaService, times(1)).deleteCaptchaCode(reqVO.getUuid());
|
||||
verify(loginLogService, times(1)).createLoginLog(
|
||||
argThat(o -> o.getLogType().equals(SysLoginLogTypeEnum.LOGIN_USERNAME.getType())
|
||||
&& o.getResult().equals(SysLoginResultEnum.UNKNOWN_ERROR.getResult()))
|
||||
);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testLogin_success() {
|
||||
// 准备参数
|
||||
String userIp = randomString();
|
||||
String userAgent = randomString();
|
||||
Long userId = randomLongId();
|
||||
Set<Long> userRoleIds = randomSet(Long.class);
|
||||
String sessionId = randomString();
|
||||
SysAuthLoginReqVO reqVO = randomPojo(SysAuthLoginReqVO.class);
|
||||
LoginUser loginUser = randomPojo(LoginUser.class, o -> {
|
||||
o.setId(userId);
|
||||
o.setRoleIds(userRoleIds);
|
||||
});
|
||||
// mock 验证码正确
|
||||
when(captchaService.getCaptchaCode(reqVO.getUuid())).thenReturn(reqVO.getCode());
|
||||
// mock authentication
|
||||
when(authenticationManager.authenticate(new UsernamePasswordAuthenticationToken(reqVO.getUsername(), reqVO.getPassword())))
|
||||
.thenReturn(authentication);
|
||||
when(authentication.getPrincipal()).thenReturn(loginUser);
|
||||
// mock 获得 User 拥有的角色编号数组
|
||||
when(permissionService.getUserRoleIds(userId, singleton(CommonStatusEnum.ENABLE.getStatus()))).thenReturn(userRoleIds);
|
||||
// mock 缓存登陆用户到 Redis
|
||||
when(userSessionService.createUserSession(loginUser, userIp, userAgent)).thenReturn(sessionId);
|
||||
// 调用, 并断言异常
|
||||
String login = authService.login(reqVO, userIp, userAgent);
|
||||
assertEquals(sessionId, login);
|
||||
// 校验调用参数
|
||||
verify(captchaService, times(1)).deleteCaptchaCode(reqVO.getUuid());
|
||||
verify(loginLogService, times(1)).createLoginLog(
|
||||
argThat(o -> o.getLogType().equals(SysLoginLogTypeEnum.LOGIN_USERNAME.getType())
|
||||
&& o.getResult().equals(SysLoginResultEnum.SUCCESS.getResult()))
|
||||
);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testLogout_success() {
|
||||
// 准备参数
|
||||
String token = randomString();
|
||||
LoginUser loginUser = randomPojo(LoginUser.class);
|
||||
// mock
|
||||
when(userSessionService.getLoginUser(token)).thenReturn(loginUser);
|
||||
// 调用
|
||||
authService.logout(token);
|
||||
// 校验调用参数
|
||||
verify(userSessionService, times(1)).deleteUserSession(token);
|
||||
verify(loginLogService, times(1)).createLoginLog(
|
||||
argThat(o -> o.getLogType().equals(SysLoginLogTypeEnum.LOGOUT_SELF.getType())
|
||||
&& o.getResult().equals(SysLoginResultEnum.SUCCESS.getResult()))
|
||||
);
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -1,28 +1,57 @@
|
||||
package cn.iocoder.dashboard.modules.system.service.auth;
|
||||
|
||||
import static cn.hutool.core.util.RandomUtil.randomEle;
|
||||
import static cn.iocoder.dashboard.modules.system.dal.redis.SysRedisKeyConstants.LOGIN_USER;
|
||||
import static cn.iocoder.dashboard.util.AssertUtils.assertPojoEquals;
|
||||
import static cn.iocoder.dashboard.util.RandomUtils.randomDate;
|
||||
import static cn.iocoder.dashboard.util.RandomUtils.randomLongId;
|
||||
import static cn.iocoder.dashboard.util.RandomUtils.randomPojo;
|
||||
import static cn.iocoder.dashboard.util.RandomUtils.randomString;
|
||||
import static cn.iocoder.dashboard.util.date.DateUtils.addTime;
|
||||
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||
import static org.junit.jupiter.api.Assertions.assertNotEquals;
|
||||
import static org.junit.jupiter.api.Assertions.assertNotNull;
|
||||
import static org.junit.jupiter.api.Assertions.assertNull;
|
||||
import static org.mockito.Mockito.when;
|
||||
|
||||
import java.time.Duration;
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
import java.util.stream.Collectors;
|
||||
import java.util.stream.Stream;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
|
||||
import org.junit.jupiter.api.Test;
|
||||
import org.springframework.boot.test.mock.mockito.MockBean;
|
||||
import org.springframework.context.annotation.Import;
|
||||
import org.springframework.data.redis.core.StringRedisTemplate;
|
||||
|
||||
import cn.hutool.core.date.DateUtil;
|
||||
import cn.iocoder.dashboard.BaseDbAndRedisUnitTest;
|
||||
import cn.iocoder.dashboard.common.enums.CommonStatusEnum;
|
||||
import cn.iocoder.dashboard.common.pojo.PageResult;
|
||||
import cn.iocoder.dashboard.framework.security.config.SecurityProperties;
|
||||
import cn.iocoder.dashboard.framework.security.core.LoginUser;
|
||||
import cn.iocoder.dashboard.modules.infra.controller.job.vo.job.InfJobPageReqVO;
|
||||
import cn.iocoder.dashboard.modules.infra.dal.dataobject.job.InfJobDO;
|
||||
import cn.iocoder.dashboard.modules.infra.enums.config.InfConfigTypeEnum;
|
||||
import cn.iocoder.dashboard.modules.infra.enums.job.InfJobStatusEnum;
|
||||
import cn.iocoder.dashboard.modules.system.controller.auth.vo.session.SysUserSessionPageReqVO;
|
||||
import cn.iocoder.dashboard.modules.system.dal.dataobject.auth.SysUserSessionDO;
|
||||
import cn.iocoder.dashboard.modules.system.dal.dataobject.user.SysUserDO;
|
||||
import cn.iocoder.dashboard.modules.system.dal.mysql.auth.SysUserSessionMapper;
|
||||
import cn.iocoder.dashboard.modules.system.dal.mysql.user.SysUserMapper;
|
||||
import cn.iocoder.dashboard.modules.system.dal.redis.auth.SysLoginUserRedisDAO;
|
||||
import cn.iocoder.dashboard.modules.system.enums.common.SysSexEnum;
|
||||
import cn.iocoder.dashboard.modules.system.service.auth.impl.SysUserSessionServiceImpl;
|
||||
import cn.iocoder.dashboard.modules.system.service.dept.impl.SysDeptServiceImpl;
|
||||
import cn.iocoder.dashboard.modules.system.service.logger.impl.SysLoginLogServiceImpl;
|
||||
import cn.iocoder.dashboard.modules.system.service.user.SysUserServiceImpl;
|
||||
import cn.iocoder.dashboard.util.AssertUtils;
|
||||
import cn.iocoder.dashboard.util.RandomUtils;
|
||||
import org.junit.jupiter.api.Test;
|
||||
import org.springframework.boot.test.mock.mockito.MockBean;
|
||||
import org.springframework.context.annotation.Import;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
import java.util.stream.Collectors;
|
||||
import java.util.stream.Stream;
|
||||
|
||||
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||
import cn.iocoder.dashboard.util.json.JsonUtils;
|
||||
import cn.iocoder.dashboard.util.object.ObjectUtils;
|
||||
|
||||
/**
|
||||
* SysUserSessionServiceImpl Tester.
|
||||
@ -31,13 +60,17 @@ import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||
* @version 1.0
|
||||
* @since <pre>3月 8, 2021</pre>
|
||||
*/
|
||||
@Import(SysUserSessionServiceImpl.class)
|
||||
@Import({SysUserSessionServiceImpl.class, SysLoginUserRedisDAO.class})
|
||||
public class SysUserSessionServiceImplTest extends BaseDbAndRedisUnitTest {
|
||||
|
||||
@Resource
|
||||
private SysUserSessionServiceImpl sysUserSessionService;
|
||||
@Resource
|
||||
private SysUserSessionMapper sysUserSessionMapper;
|
||||
@Resource
|
||||
private SysLoginUserRedisDAO sysLoginUserRedisDAO;
|
||||
@Resource
|
||||
private SysUserMapper sysUserMapper;
|
||||
|
||||
@MockBean
|
||||
private SecurityProperties securityProperties;
|
||||
@ -47,8 +80,132 @@ public class SysUserSessionServiceImplTest extends BaseDbAndRedisUnitTest {
|
||||
private SysUserServiceImpl sysUserService;
|
||||
@MockBean
|
||||
private SysLoginLogServiceImpl sysLoginLogService;
|
||||
@MockBean
|
||||
private SysLoginUserRedisDAO sysLoginUserRedisDAO;
|
||||
|
||||
@Test
|
||||
public void testCreateUserSession_success() {
|
||||
// 准备参数
|
||||
String userIp = randomString();
|
||||
String userAgent = randomString();
|
||||
LoginUser loginUser = randomPojo(LoginUser.class);
|
||||
// mock
|
||||
when(securityProperties.getSessionTimeout()).thenReturn(Duration.ofDays(1));
|
||||
// 调用
|
||||
String sessionId = sysUserSessionService.createUserSession(loginUser, userIp, userAgent);
|
||||
// 校验记录的属性是否正确
|
||||
SysUserSessionDO sysUserSessionDO = sysUserSessionMapper.selectById(sessionId);
|
||||
assertEquals(sysUserSessionDO.getId(), sessionId);
|
||||
assertEquals(sysUserSessionDO.getUserId(), loginUser.getId());
|
||||
assertEquals(sysUserSessionDO.getUserIp(), userIp);
|
||||
assertEquals(sysUserSessionDO.getUserAgent(), userAgent);
|
||||
assertEquals(sysUserSessionDO.getUsername(), loginUser.getUsername());
|
||||
LoginUser redisLoginUser = sysLoginUserRedisDAO.get(sessionId);
|
||||
AssertUtils.assertPojoEquals(redisLoginUser, loginUser, "username","password");
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testCreateRefreshUserSession_success() {
|
||||
// 准备参数
|
||||
String sessionId = randomString();
|
||||
String userIp = randomString();
|
||||
String userAgent = randomString();
|
||||
Long timeLong = randomLongId();
|
||||
String userName = randomString();
|
||||
Date date = randomDate();
|
||||
LoginUser loginUser = randomPojo(LoginUser.class);
|
||||
// mock
|
||||
when(securityProperties.getSessionTimeout()).thenReturn(Duration.ofDays(1));
|
||||
loginUser.setUpdateTime(date);
|
||||
sysLoginUserRedisDAO.set(sessionId, loginUser);
|
||||
SysUserSessionDO userSession = SysUserSessionDO.builder().id(sessionId)
|
||||
.userId(loginUser.getId()).userIp(userIp).userAgent(userAgent).username(userName)
|
||||
.sessionTimeout(addTime(Duration.ofMillis(timeLong)))
|
||||
.build();
|
||||
sysUserSessionMapper.insert(userSession);
|
||||
SysUserSessionDO insertDO = sysUserSessionMapper.selectById(sessionId);
|
||||
// 调用
|
||||
sysUserSessionService.refreshUserSession(sessionId, loginUser);
|
||||
// 校验记录 redis
|
||||
LoginUser redisLoginUser = sysLoginUserRedisDAO.get(sessionId);
|
||||
assertNotEquals(redisLoginUser.getUpdateTime(), date);
|
||||
// 校验记录 SysUserSessionDO
|
||||
SysUserSessionDO updateDO = sysUserSessionMapper.selectById(sessionId);
|
||||
assertEquals(updateDO.getUsername(), loginUser.getUsername());
|
||||
assertNotEquals(updateDO.getUpdateTime(), insertDO.getUpdateTime());
|
||||
assertNotEquals(updateDO.getSessionTimeout(), addTime(Duration.ofMillis(timeLong)));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testDeleteUserSession_success() {
|
||||
// 准备参数
|
||||
String sessionId = randomString();
|
||||
String userIp = randomString();
|
||||
String userAgent = randomString();
|
||||
Long timeLong = randomLongId();
|
||||
LoginUser loginUser = randomPojo(LoginUser.class);
|
||||
// mock 存入 Redis
|
||||
when(securityProperties.getSessionTimeout()).thenReturn(Duration.ofDays(1));
|
||||
sysLoginUserRedisDAO.set(sessionId, loginUser);
|
||||
// mock 存入 db
|
||||
SysUserSessionDO userSession = SysUserSessionDO.builder().id(sessionId)
|
||||
.userId(loginUser.getId()).userIp(userIp).userAgent(userAgent).username(loginUser.getUsername())
|
||||
.sessionTimeout(addTime(Duration.ofMillis(timeLong)))
|
||||
.build();
|
||||
sysUserSessionMapper.insert(userSession);
|
||||
// 校验数据存在
|
||||
assertNotNull(sysLoginUserRedisDAO.get(sessionId));
|
||||
assertNotNull(sysUserSessionMapper.selectById(sessionId));
|
||||
// 调用
|
||||
sysUserSessionService.deleteUserSession(sessionId);
|
||||
// 校验数据不存在了
|
||||
assertNull(sysLoginUserRedisDAO.get(sessionId));
|
||||
assertNull(sysUserSessionMapper.selectById(sessionId));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testGetUserSessionPage_success() {
|
||||
// mock 数据
|
||||
String userIp = randomString();
|
||||
SysUserDO dbUser1 = randomPojo(SysUserDO.class, o -> {
|
||||
o.setUsername("testUsername1");
|
||||
o.setSex(randomEle(SysSexEnum.values()).getSEX());
|
||||
o.setStatus(CommonStatusEnum.ENABLE.getStatus());
|
||||
});
|
||||
SysUserDO dbUser2 = randomPojo(SysUserDO.class, o -> {
|
||||
o.setUsername("testUsername2");
|
||||
o.setSex(randomEle(SysSexEnum.values()).getSEX());
|
||||
o.setStatus(CommonStatusEnum.ENABLE.getStatus());
|
||||
});
|
||||
SysUserSessionDO dbSession = randomPojo(SysUserSessionDO.class, o -> {
|
||||
o.setUserId(dbUser1.getId());
|
||||
o.setUserIp(userIp);
|
||||
});
|
||||
sysUserMapper.insert(dbUser1);
|
||||
sysUserMapper.insert(dbUser2);
|
||||
sysUserSessionMapper.insert(dbSession);
|
||||
sysUserSessionMapper.insert(ObjectUtils.clone(dbSession, o -> {
|
||||
o.setId(randomString());
|
||||
o.setUserId(dbUser2.getId());
|
||||
}));
|
||||
// 测试 userId 不匹配
|
||||
sysUserSessionMapper.insert(ObjectUtils.clone(dbSession, o -> {
|
||||
o.setId(randomString());
|
||||
o.setUserId(123456l);
|
||||
}));
|
||||
// 测试 userIp 不匹配
|
||||
sysUserSessionMapper.insert(ObjectUtils.clone(dbSession, o -> {
|
||||
o.setId(randomString());
|
||||
o.setUserIp("testUserIp");
|
||||
}));
|
||||
// 准备参数
|
||||
SysUserSessionPageReqVO reqVo = new SysUserSessionPageReqVO();
|
||||
reqVo.setUserIp(userIp);
|
||||
// 调用
|
||||
PageResult<SysUserSessionDO> pageResult = sysUserSessionService.getUserSessionPage(reqVo);
|
||||
// 断言
|
||||
assertEquals(3, pageResult.getTotal());
|
||||
assertEquals(3, pageResult.getList().size());
|
||||
assertPojoEquals(dbSession, pageResult.getList().get(0));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testClearSessionTimeout_success() throws Exception {
|
||||
|
@ -72,7 +72,6 @@ class SysDeptServiceTest extends BaseDbUnitTest {
|
||||
// 断言 maxUpdateTime 缓存
|
||||
Date maxUpdateTime = (Date) getFieldValue(deptService, "maxUpdateTime");
|
||||
assertEquals(ObjectUtils.max(deptDO1.getUpdateTime(), deptDO2.getUpdateTime()), maxUpdateTime);
|
||||
|
||||
}
|
||||
|
||||
@Test
|
||||
@ -92,7 +91,7 @@ class SysDeptServiceTest extends BaseDbUnitTest {
|
||||
reqVO.setName("开");
|
||||
reqVO.setStatus(CommonStatusEnum.ENABLE.getStatus());
|
||||
// 调用
|
||||
List<SysDeptDO> sysDeptDOS = deptService.listDepts(reqVO);
|
||||
List<SysDeptDO> sysDeptDOS = deptService.getSimpleDepts(reqVO);
|
||||
// 断言
|
||||
assertEquals(1, sysDeptDOS.size());
|
||||
assertPojoEquals(dept, sysDeptDOS.get(0));
|
||||
|
@ -59,7 +59,7 @@ class SysPostServiceTest extends BaseDbUnitTest {
|
||||
reqVO.setStatus(CommonStatusEnum.ENABLE.getStatus());
|
||||
|
||||
// 调用
|
||||
PageResult<SysPostDO> pageResult = postService.pagePosts(reqVO);
|
||||
PageResult<SysPostDO> pageResult = postService.getPostPage(reqVO);
|
||||
|
||||
// 断言
|
||||
assertEquals(1, pageResult.getTotal());
|
||||
@ -85,7 +85,7 @@ class SysPostServiceTest extends BaseDbUnitTest {
|
||||
reqVO.setStatus(CommonStatusEnum.ENABLE.getStatus());
|
||||
|
||||
// 调用
|
||||
List<SysPostDO> list = postService.listPosts(reqVO);
|
||||
List<SysPostDO> list = postService.getPosts(reqVO);
|
||||
// 断言
|
||||
assertEquals(1, list.size());
|
||||
assertPojoEquals(postDO, list.get(0));
|
||||
|
@ -133,7 +133,7 @@ public class SysDictDataServiceTest extends BaseDbUnitTest {
|
||||
reqVO.setStatus(CommonStatusEnum.ENABLE.getStatus());
|
||||
|
||||
// 调用
|
||||
List<SysDictDataDO> list = dictDataService.getDictDataList(reqVO);
|
||||
List<SysDictDataDO> list = dictDataService.getDictDatas(reqVO);
|
||||
// 断言
|
||||
assertEquals(1, list.size());
|
||||
assertPojoEquals(dbDictData, list.get(0));
|
||||
|
@ -1,15 +1,11 @@
|
||||
package cn.iocoder.dashboard.modules.system.service.logger;
|
||||
|
||||
import cn.hutool.core.map.MapUtil;
|
||||
import cn.hutool.core.util.ArrayUtil;
|
||||
import cn.hutool.core.util.RandomUtil;
|
||||
import cn.hutool.core.util.ReflectUtil;
|
||||
import cn.iocoder.dashboard.BaseDbUnitTest;
|
||||
import cn.iocoder.dashboard.common.enums.CommonStatusEnum;
|
||||
import cn.iocoder.dashboard.common.exception.enums.GlobalErrorCodeConstants;
|
||||
import cn.iocoder.dashboard.common.pojo.PageResult;
|
||||
import cn.iocoder.dashboard.framework.logger.operatelog.core.enums.OperateTypeEnum;
|
||||
import cn.iocoder.dashboard.framework.mybatis.core.dataobject.BaseDO;
|
||||
import cn.iocoder.dashboard.framework.tracer.core.util.TracerUtils;
|
||||
import cn.iocoder.dashboard.modules.system.controller.logger.vo.operatelog.SysOperateLogCreateReqVO;
|
||||
import cn.iocoder.dashboard.modules.system.controller.logger.vo.operatelog.SysOperateLogExportReqVO;
|
||||
@ -17,7 +13,6 @@ import cn.iocoder.dashboard.modules.system.controller.logger.vo.operatelog.SysOp
|
||||
import cn.iocoder.dashboard.modules.system.dal.dataobject.logger.SysOperateLogDO;
|
||||
import cn.iocoder.dashboard.modules.system.dal.dataobject.user.SysUserDO;
|
||||
import cn.iocoder.dashboard.modules.system.dal.mysql.logger.SysOperateLogMapper;
|
||||
import cn.iocoder.dashboard.modules.system.dal.mysql.user.SysUserMapper;
|
||||
import cn.iocoder.dashboard.modules.system.enums.common.SysSexEnum;
|
||||
import cn.iocoder.dashboard.modules.system.service.logger.impl.SysOperateLogServiceImpl;
|
||||
import cn.iocoder.dashboard.modules.system.service.user.SysUserService;
|
||||
@ -28,105 +23,78 @@ import org.springframework.boot.test.mock.mockito.MockBean;
|
||||
import org.springframework.context.annotation.Import;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import java.lang.reflect.Field;
|
||||
import java.util.Arrays;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.*;
|
||||
import java.util.concurrent.ExecutionException;
|
||||
import java.util.concurrent.Future;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import static cn.iocoder.dashboard.util.AssertUtils.assertPojoEquals;
|
||||
import static cn.iocoder.dashboard.util.RandomUtils.randomLongId;
|
||||
import static cn.iocoder.dashboard.util.date.DateUtils.buildTime;
|
||||
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||
import static org.junit.jupiter.api.Assertions.assertNotNull;
|
||||
import static org.mockito.Mockito.when;
|
||||
|
||||
@Import({SysOperateLogServiceImpl.class})
|
||||
public class SysOperateLogServiceImplTest extends BaseDbUnitTest {
|
||||
|
||||
@Resource
|
||||
private SysOperateLogService sysOperateLogServiceImpl;
|
||||
private SysOperateLogService operateLogServiceImpl;
|
||||
|
||||
@Resource
|
||||
private SysOperateLogMapper sysOperateLogMapper;
|
||||
|
||||
@Resource
|
||||
private SysUserMapper sysUserMapper;
|
||||
private SysOperateLogMapper operateLogMapper;
|
||||
|
||||
@MockBean
|
||||
private SysUserService sysUserService;
|
||||
private SysUserService userService;
|
||||
|
||||
@Test
|
||||
public void testCreateOperateLogAsync() throws InterruptedException, ExecutionException {
|
||||
|
||||
String traceId = TracerUtils.getTraceId();
|
||||
SysOperateLogCreateReqVO reqVO = RandomUtils.randomPojo(SysOperateLogCreateReqVO.class, vo -> {
|
||||
vo.setTraceId(traceId);
|
||||
vo.setUserId(RandomUtil.randomLong(1, Long.MAX_VALUE));
|
||||
|
||||
Map<String, Object> map = MapUtil.builder("orderId", (Object) 1).build();
|
||||
vo.setExts(map);
|
||||
SysOperateLogCreateReqVO reqVO = RandomUtils.randomPojo(SysOperateLogCreateReqVO.class, o -> {
|
||||
o.setTraceId(traceId);
|
||||
o.setUserId(randomLongId());
|
||||
o.setExts(MapUtil.<String, Object>builder("orderId", randomLongId()).build());
|
||||
});
|
||||
|
||||
// 执行service方法
|
||||
Future<Boolean> future = sysOperateLogServiceImpl.createOperateLogAsync(reqVO);
|
||||
|
||||
// 等异步执行完
|
||||
Future<Boolean> future = operateLogServiceImpl.createOperateLogAsync(reqVO);
|
||||
future.get();
|
||||
|
||||
// 查询插入的数据
|
||||
SysOperateLogDO sysOperateLogDO = sysOperateLogMapper.selectOne("trace_id", traceId);
|
||||
|
||||
// 断言
|
||||
assertNotNull(sysOperateLogDO);
|
||||
// 断言,忽略基本字段
|
||||
// 断言插入是否正确
|
||||
SysOperateLogDO sysOperateLogDO = operateLogMapper.selectOne("trace_id", traceId);
|
||||
assertPojoEquals(reqVO, sysOperateLogDO);
|
||||
}
|
||||
|
||||
|
||||
@Test
|
||||
public void testPageOperateLog() {
|
||||
|
||||
public void testGetOperateLogPage() {
|
||||
// 构造测试数据
|
||||
|
||||
// 先构造用户
|
||||
SysUserDO user = RandomUtils.randomPojo(SysUserDO.class, sysUserDO -> {
|
||||
sysUserDO.setNickname("wangkai");
|
||||
sysUserDO.setSex(SysSexEnum.MALE.getSEX());
|
||||
sysUserDO.setStatus(CommonStatusEnum.ENABLE.getStatus());
|
||||
SysUserDO user = RandomUtils.randomPojo(SysUserDO.class, o -> {
|
||||
o.setNickname("wangkai");
|
||||
o.setSex(SysSexEnum.MALE.getSEX());
|
||||
o.setStatus(CommonStatusEnum.ENABLE.getStatus());
|
||||
});
|
||||
sysUserMapper.insert(user);
|
||||
when(userService.getUsersByNickname("wangkai")).thenReturn(Collections.singletonList(user));
|
||||
Long userId = user.getId();
|
||||
|
||||
|
||||
// 构造操作日志
|
||||
SysOperateLogDO sysOperateLogDO = RandomUtils.randomPojo(SysOperateLogDO.class, entity -> {
|
||||
entity.setTraceId(TracerUtils.getTraceId());
|
||||
entity.setUserId(userId);
|
||||
entity.setModule("order");
|
||||
entity.setType(OperateTypeEnum.CREATE.getType());
|
||||
entity.setStartTime(buildTime(2021, 3, 6));
|
||||
entity.setResultCode(GlobalErrorCodeConstants.SUCCESS.getCode());
|
||||
|
||||
Map<String, Object> map = new HashMap<>();
|
||||
map.put("orderId", 1);
|
||||
entity.setExts(map);
|
||||
SysOperateLogDO sysOperateLogDO = RandomUtils.randomPojo(SysOperateLogDO.class, o -> {
|
||||
o.setUserId(userId);
|
||||
o.setModule("order");
|
||||
o.setType(OperateTypeEnum.CREATE.getType());
|
||||
o.setStartTime(buildTime(2021, 3, 6));
|
||||
o.setResultCode(GlobalErrorCodeConstants.SUCCESS.getCode());
|
||||
o.setExts(MapUtil.<String, Object>builder("orderId", randomLongId()).build());
|
||||
});
|
||||
|
||||
sysOperateLogMapper.insert(sysOperateLogDO);
|
||||
operateLogMapper.insert(sysOperateLogDO);
|
||||
|
||||
// 下面几个是不匹配的数据
|
||||
// 随机userId
|
||||
sysOperateLogMapper.insert(ObjectUtils.clone(sysOperateLogDO, logDO -> logDO.setUserId(userId + 1)));
|
||||
// module不同
|
||||
sysOperateLogMapper.insert(ObjectUtils.clone(sysOperateLogDO, logDO -> logDO.setModule("user")));
|
||||
// type不同
|
||||
sysOperateLogMapper.insert(ObjectUtils.clone(sysOperateLogDO, logDO -> logDO.setType(OperateTypeEnum.IMPORT.getType())));
|
||||
// createTime不同
|
||||
sysOperateLogMapper.insert(ObjectUtils.clone(sysOperateLogDO, logDO -> logDO.setStartTime(buildTime(2021, 2, 6))));
|
||||
// resultCode不同
|
||||
sysOperateLogMapper.insert(ObjectUtils.clone(sysOperateLogDO, logDO -> logDO.setResultCode(GlobalErrorCodeConstants.BAD_REQUEST.getCode())));
|
||||
// 随机 userId
|
||||
operateLogMapper.insert(ObjectUtils.clone(sysOperateLogDO, logDO -> logDO.setUserId(userId + 1)));
|
||||
// module 不同
|
||||
operateLogMapper.insert(ObjectUtils.clone(sysOperateLogDO, logDO -> logDO.setModule("user")));
|
||||
// type 不同
|
||||
operateLogMapper.insert(ObjectUtils.clone(sysOperateLogDO, logDO -> logDO.setType(OperateTypeEnum.IMPORT.getType())));
|
||||
// createTime 不同
|
||||
operateLogMapper.insert(ObjectUtils.clone(sysOperateLogDO, logDO -> logDO.setStartTime(buildTime(2021, 2, 6))));
|
||||
// resultCode 不同
|
||||
operateLogMapper.insert(ObjectUtils.clone(sysOperateLogDO, logDO -> logDO.setResultCode(GlobalErrorCodeConstants.BAD_REQUEST.getCode())));
|
||||
|
||||
// 构造调用参数
|
||||
SysOperateLogPageReqVO reqVO = new SysOperateLogPageReqVO();
|
||||
@ -138,8 +106,7 @@ public class SysOperateLogServiceImplTest extends BaseDbUnitTest {
|
||||
reqVO.setSuccess(true);
|
||||
|
||||
// 调用service方法
|
||||
PageResult<SysOperateLogDO> pageResult = sysOperateLogServiceImpl.pageOperateLog(reqVO);
|
||||
|
||||
PageResult<SysOperateLogDO> pageResult = operateLogServiceImpl.getOperateLogPage(reqVO);
|
||||
// 断言,只查到了一条符合条件的
|
||||
assertEquals(1, pageResult.getTotal());
|
||||
assertEquals(1, pageResult.getList().size());
|
||||
@ -147,47 +114,38 @@ public class SysOperateLogServiceImplTest extends BaseDbUnitTest {
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testListOperateLogs() {
|
||||
|
||||
public void testGetOperateLogs() {
|
||||
// 构造测试数据
|
||||
|
||||
// 先构造用户
|
||||
SysUserDO user = RandomUtils.randomPojo(SysUserDO.class, sysUserDO -> {
|
||||
sysUserDO.setNickname("wangkai");
|
||||
sysUserDO.setSex(SysSexEnum.MALE.getSEX());
|
||||
sysUserDO.setStatus(CommonStatusEnum.ENABLE.getStatus());
|
||||
SysUserDO user = RandomUtils.randomPojo(SysUserDO.class, o -> {
|
||||
o.setNickname("wangkai");
|
||||
o.setSex(SysSexEnum.MALE.getSEX());
|
||||
o.setStatus(CommonStatusEnum.ENABLE.getStatus());
|
||||
});
|
||||
sysUserMapper.insert(user);
|
||||
when(userService.getUsersByNickname("wangkai")).thenReturn(Collections.singletonList(user));
|
||||
Long userId = user.getId();
|
||||
|
||||
|
||||
// 构造操作日志
|
||||
SysOperateLogDO sysOperateLogDO = RandomUtils.randomPojo(SysOperateLogDO.class, entity -> {
|
||||
entity.setTraceId(TracerUtils.getTraceId());
|
||||
entity.setUserId(userId);
|
||||
entity.setModule("order");
|
||||
entity.setType(OperateTypeEnum.CREATE.getType());
|
||||
entity.setStartTime(buildTime(2021, 3, 6));
|
||||
entity.setResultCode(GlobalErrorCodeConstants.SUCCESS.getCode());
|
||||
|
||||
|
||||
Map<String, Object> map = MapUtil.builder("orderId", (Object) 1).build();
|
||||
entity.setExts(map);
|
||||
SysOperateLogDO sysOperateLogDO = RandomUtils.randomPojo(SysOperateLogDO.class, o -> {
|
||||
o.setUserId(userId);
|
||||
o.setModule("order");
|
||||
o.setType(OperateTypeEnum.CREATE.getType());
|
||||
o.setStartTime(buildTime(2021, 3, 6));
|
||||
o.setResultCode(GlobalErrorCodeConstants.SUCCESS.getCode());
|
||||
o.setExts(MapUtil.<String, Object>builder("orderId", randomLongId()).build());
|
||||
});
|
||||
|
||||
sysOperateLogMapper.insert(sysOperateLogDO);
|
||||
operateLogMapper.insert(sysOperateLogDO);
|
||||
|
||||
// 下面几个是不匹配的数据
|
||||
// 随机userId
|
||||
sysOperateLogMapper.insert(ObjectUtils.clone(sysOperateLogDO, logDO -> logDO.setUserId(userId + 1)));
|
||||
// module不同
|
||||
sysOperateLogMapper.insert(ObjectUtils.clone(sysOperateLogDO, logDO -> logDO.setModule("user")));
|
||||
// type不同
|
||||
sysOperateLogMapper.insert(ObjectUtils.clone(sysOperateLogDO, logDO -> logDO.setType(OperateTypeEnum.IMPORT.getType())));
|
||||
// createTime不同
|
||||
sysOperateLogMapper.insert(ObjectUtils.clone(sysOperateLogDO, logDO -> logDO.setStartTime(buildTime(2021, 2, 6))));
|
||||
// resultCode不同
|
||||
sysOperateLogMapper.insert(ObjectUtils.clone(sysOperateLogDO, logDO -> logDO.setResultCode(GlobalErrorCodeConstants.BAD_REQUEST.getCode())));
|
||||
// 随机 userId
|
||||
operateLogMapper.insert(ObjectUtils.clone(sysOperateLogDO, logDO -> logDO.setUserId(userId + 1)));
|
||||
// module 不同
|
||||
operateLogMapper.insert(ObjectUtils.clone(sysOperateLogDO, logDO -> logDO.setModule("user")));
|
||||
// type 不同
|
||||
operateLogMapper.insert(ObjectUtils.clone(sysOperateLogDO, logDO -> logDO.setType(OperateTypeEnum.IMPORT.getType())));
|
||||
// createTime 不同
|
||||
operateLogMapper.insert(ObjectUtils.clone(sysOperateLogDO, logDO -> logDO.setStartTime(buildTime(2021, 2, 6))));
|
||||
// resultCode 不同
|
||||
operateLogMapper.insert(ObjectUtils.clone(sysOperateLogDO, logDO -> logDO.setResultCode(GlobalErrorCodeConstants.BAD_REQUEST.getCode())));
|
||||
|
||||
// 构造调用参数
|
||||
SysOperateLogExportReqVO reqVO = new SysOperateLogExportReqVO();
|
||||
@ -198,11 +156,11 @@ public class SysOperateLogServiceImplTest extends BaseDbUnitTest {
|
||||
reqVO.setEndTime(buildTime(2021, 3, 7));
|
||||
reqVO.setSuccess(true);
|
||||
|
||||
// 调用service方法
|
||||
List<SysOperateLogDO> list = sysOperateLogServiceImpl.listOperateLogs(reqVO);
|
||||
|
||||
// 调用 service 方法
|
||||
List<SysOperateLogDO> list = operateLogServiceImpl.getOperateLogs(reqVO);
|
||||
// 断言,只查到了一条符合条件的
|
||||
assertEquals(1, list.size());
|
||||
assertPojoEquals(sysOperateLogDO, list.get(0));
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -0,0 +1,368 @@
|
||||
package cn.iocoder.dashboard.modules.system.service.permission;
|
||||
|
||||
import cn.hutool.core.bean.BeanUtil;
|
||||
import cn.hutool.core.lang.Assert;
|
||||
import cn.iocoder.dashboard.BaseDbUnitTest;
|
||||
import cn.iocoder.dashboard.modules.system.controller.permission.vo.menu.SysMenuCreateReqVO;
|
||||
import cn.iocoder.dashboard.modules.system.controller.permission.vo.menu.SysMenuListReqVO;
|
||||
import cn.iocoder.dashboard.modules.system.controller.permission.vo.menu.SysMenuUpdateReqVO;
|
||||
import cn.iocoder.dashboard.modules.system.dal.dataobject.permission.SysMenuDO;
|
||||
import cn.iocoder.dashboard.modules.system.dal.mysql.permission.SysMenuMapper;
|
||||
import cn.iocoder.dashboard.modules.system.enums.permission.MenuTypeEnum;
|
||||
import cn.iocoder.dashboard.modules.system.mq.producer.permission.SysMenuProducer;
|
||||
import cn.iocoder.dashboard.modules.system.service.permission.impl.SysMenuServiceImpl;
|
||||
import cn.iocoder.dashboard.util.AopTargetUtils;
|
||||
import cn.iocoder.dashboard.util.AssertUtils;
|
||||
import cn.iocoder.dashboard.util.RandomUtils;
|
||||
import cn.iocoder.dashboard.util.object.ObjectUtils;
|
||||
import com.google.common.collect.Multimap;
|
||||
import org.junit.jupiter.api.Assertions;
|
||||
import org.junit.jupiter.api.Test;
|
||||
import org.springframework.boot.test.mock.mockito.MockBean;
|
||||
import org.springframework.context.annotation.Import;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
|
||||
import java.util.*;
|
||||
|
||||
import static cn.iocoder.dashboard.modules.system.enums.SysErrorCodeConstants.*;
|
||||
import static cn.iocoder.dashboard.util.AssertUtils.assertPojoEquals;
|
||||
import static cn.iocoder.dashboard.util.AssertUtils.assertServiceException;
|
||||
import static cn.iocoder.dashboard.util.RandomUtils.*;
|
||||
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||
import static org.mockito.Mockito.verify;
|
||||
|
||||
@Import(SysMenuServiceImpl.class)
|
||||
public class SysMenuServiceTest extends BaseDbUnitTest {
|
||||
|
||||
@Resource
|
||||
private SysMenuServiceImpl sysMenuService;
|
||||
|
||||
@MockBean
|
||||
private SysPermissionService sysPermissionService;
|
||||
|
||||
@MockBean
|
||||
private SysMenuProducer sysMenuProducer;
|
||||
|
||||
@Resource
|
||||
private SysMenuMapper menuMapper;
|
||||
|
||||
@Test
|
||||
public void testInitLocalCache_success() throws Exception {
|
||||
SysMenuDO menuDO1 = createMenuDO(MenuTypeEnum.MENU, "xxxx", 0L);
|
||||
menuMapper.insert(menuDO1);
|
||||
SysMenuDO menuDO2 = createMenuDO(MenuTypeEnum.MENU, "xxxx", 0L);
|
||||
menuMapper.insert(menuDO2);
|
||||
|
||||
//调用
|
||||
sysMenuService.initLocalCache();
|
||||
|
||||
// 获取代理对象
|
||||
SysMenuServiceImpl target = (SysMenuServiceImpl) AopTargetUtils.getTarget(sysMenuService);
|
||||
|
||||
Map<Long, SysMenuDO> menuCache = (Map<Long, SysMenuDO>) BeanUtil.getFieldValue(target, "menuCache");
|
||||
Assert.isTrue(menuCache.size() == 2);
|
||||
assertPojoEquals(menuDO1, menuCache.get(menuDO1.getId()));
|
||||
assertPojoEquals(menuDO2, menuCache.get(menuDO2.getId()));
|
||||
|
||||
Multimap<String, SysMenuDO> permissionMenuCache = (Multimap<String, SysMenuDO>) BeanUtil.getFieldValue(target, "permissionMenuCache");
|
||||
Assert.isTrue(permissionMenuCache.size() == 2);
|
||||
assertPojoEquals(menuDO1, permissionMenuCache.get(menuDO1.getPermission()));
|
||||
assertPojoEquals(menuDO2, permissionMenuCache.get(menuDO2.getPermission()));
|
||||
|
||||
Date maxUpdateTime = (Date) BeanUtil.getFieldValue(target, "maxUpdateTime");
|
||||
assertEquals(ObjectUtils.max(menuDO1.getUpdateTime(), menuDO2.getUpdateTime()), maxUpdateTime);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testCreateMenu_success() {
|
||||
//构造父目录
|
||||
SysMenuDO menuDO = createMenuDO(MenuTypeEnum.MENU, "parent", 0L);
|
||||
menuMapper.insert(menuDO);
|
||||
Long parentId = menuDO.getId();
|
||||
|
||||
//调用
|
||||
SysMenuCreateReqVO vo = randomPojo(SysMenuCreateReqVO.class, o -> {
|
||||
o.setParentId(parentId);
|
||||
o.setName("testSonName");
|
||||
o.setType(MenuTypeEnum.MENU.getType());
|
||||
o.setStatus(RandomUtils.randomCommonStatus());
|
||||
});
|
||||
Long menuId = sysMenuService.createMenu(vo);
|
||||
|
||||
//断言
|
||||
Assertions.assertNotNull(menuId);
|
||||
// 校验记录的属性是否正确
|
||||
SysMenuDO ret = menuMapper.selectById(menuId);
|
||||
assertPojoEquals(vo, ret);
|
||||
// 校验调用
|
||||
verify(sysMenuProducer).sendMenuRefreshMessage();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testUpdateMenu_success() {
|
||||
//构造父子目录
|
||||
SysMenuDO sonMenuDO = initParentAndSonMenuDO();
|
||||
Long sonId = sonMenuDO.getId();
|
||||
Long parentId = sonMenuDO.getParentId();
|
||||
|
||||
//调用
|
||||
SysMenuUpdateReqVO vo = RandomUtils.randomPojo(SysMenuUpdateReqVO.class, o -> {
|
||||
o.setId(sonId);
|
||||
o.setParentId(parentId);
|
||||
o.setType(MenuTypeEnum.MENU.getType());
|
||||
o.setStatus(RandomUtils.randomCommonStatus());
|
||||
o.setName("pppppp"); //修改名字
|
||||
});
|
||||
sysMenuService.updateMenu(vo);
|
||||
|
||||
//断言
|
||||
// 校验记录的属性是否正确
|
||||
SysMenuDO ret = menuMapper.selectById(sonId);
|
||||
assertPojoEquals(vo, ret);
|
||||
// 校验调用
|
||||
verify(sysMenuProducer).sendMenuRefreshMessage();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testUpdateMenu_sonIdNotExist() {
|
||||
Long sonId = 99999L;
|
||||
Long parentId = 10000L;
|
||||
|
||||
//调用
|
||||
SysMenuUpdateReqVO vo = RandomUtils.randomPojo(SysMenuUpdateReqVO.class, o -> {
|
||||
o.setId(sonId);
|
||||
o.setParentId(parentId);
|
||||
o.setType(MenuTypeEnum.MENU.getType());
|
||||
o.setStatus(RandomUtils.randomCommonStatus());
|
||||
});
|
||||
//断言
|
||||
assertServiceException(() -> sysMenuService.updateMenu(vo), MENU_NOT_EXISTS);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testDeleteMenu_success() {
|
||||
SysMenuDO sonMenuDO = initParentAndSonMenuDO();
|
||||
Long sonId = sonMenuDO.getId();
|
||||
|
||||
//调用
|
||||
sysMenuService.deleteMenu(sonId);
|
||||
|
||||
//断言
|
||||
SysMenuDO menuDO = menuMapper.selectById(sonId);
|
||||
Assert.isNull(menuDO);
|
||||
verify(sysPermissionService).processMenuDeleted(sonId);
|
||||
verify(sysMenuProducer).sendMenuRefreshMessage();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testDeleteMenu_menuNotExist() {
|
||||
Long sonId = 99999L;
|
||||
|
||||
assertServiceException(() -> sysMenuService.deleteMenu(sonId), MENU_NOT_EXISTS);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testDeleteMenu_existChildren() {
|
||||
SysMenuDO sonMenu = initParentAndSonMenuDO();
|
||||
Long parentId = sonMenu.getParentId();
|
||||
|
||||
assertServiceException(() -> sysMenuService.deleteMenu(parentId), MENU_EXISTS_CHILDREN);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testGetMenus_success() {
|
||||
Map<Long, SysMenuDO> idMenuMap = new HashMap<>();
|
||||
SysMenuDO menuDO = createMenuDO(MenuTypeEnum.MENU, "parent", 0L);
|
||||
menuMapper.insert(menuDO);
|
||||
idMenuMap.put(menuDO.getId(), menuDO);
|
||||
|
||||
SysMenuDO sonMenu = createMenuDO(MenuTypeEnum.MENU, "son", menuDO.getId());
|
||||
menuMapper.insert(sonMenu);
|
||||
idMenuMap.put(sonMenu.getId(), sonMenu);
|
||||
|
||||
//调用
|
||||
List<SysMenuDO> menuDOS = sysMenuService.getMenus();
|
||||
|
||||
//断言
|
||||
Assert.isTrue(menuDOS.size() == idMenuMap.size());
|
||||
menuDOS.stream().forEach(m -> assertPojoEquals(idMenuMap.get(m.getId()), m));
|
||||
}
|
||||
|
||||
|
||||
@Test
|
||||
public void testGetMenusReqVo_success() {
|
||||
Map<Long, SysMenuDO> idMenuMap = new HashMap<>();
|
||||
//用于验证可以模糊搜索名称包含"name",状态为1的menu
|
||||
SysMenuDO menu = createMenuDO(MenuTypeEnum.MENU, "name2", 0L, 1);
|
||||
menuMapper.insert(menu);
|
||||
idMenuMap.put(menu.getId(), menu);
|
||||
|
||||
menu = createMenuDO(MenuTypeEnum.MENU, "11name111", 0L, 1);
|
||||
menuMapper.insert(menu);
|
||||
idMenuMap.put(menu.getId(), menu);
|
||||
|
||||
menu = createMenuDO(MenuTypeEnum.MENU, "name", 0L, 1);
|
||||
menuMapper.insert(menu);
|
||||
idMenuMap.put(menu.getId(), menu);
|
||||
|
||||
//以下是不符合搜索条件的的menu
|
||||
menu = createMenuDO(MenuTypeEnum.MENU, "xxxxxx", 0L, 1);
|
||||
menuMapper.insert(menu);
|
||||
menu = createMenuDO(MenuTypeEnum.MENU, "name", 0L, 2);
|
||||
menuMapper.insert(menu);
|
||||
|
||||
//调用
|
||||
SysMenuListReqVO reqVO = new SysMenuListReqVO();
|
||||
reqVO.setStatus(1);
|
||||
reqVO.setName("name");
|
||||
List<SysMenuDO> menuDOS = sysMenuService.getMenus(reqVO);
|
||||
|
||||
//断言
|
||||
Assert.isTrue(menuDOS.size() == idMenuMap.size());
|
||||
menuDOS.stream().forEach(m -> assertPojoEquals(idMenuMap.get(m.getId()), m));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testListMenusFromCache_success() throws Exception {
|
||||
Map<Long, SysMenuDO> mockCacheMap = new HashMap<>();
|
||||
//获取代理对象
|
||||
SysMenuServiceImpl target = (SysMenuServiceImpl) AopTargetUtils.getTarget(sysMenuService);
|
||||
BeanUtil.setFieldValue(target, "menuCache", mockCacheMap);
|
||||
|
||||
Map<Long, SysMenuDO> idMenuMap = new HashMap<>();
|
||||
//用于验证搜索类型为MENU,状态为1的menu
|
||||
SysMenuDO menuDO = createMenuDO(1L, MenuTypeEnum.MENU, "name", 0L, 1);
|
||||
mockCacheMap.put(menuDO.getId(), menuDO);
|
||||
idMenuMap.put(menuDO.getId(), menuDO);
|
||||
|
||||
menuDO = createMenuDO(2L, MenuTypeEnum.MENU, "name", 0L, 1);
|
||||
mockCacheMap.put(menuDO.getId(), menuDO);
|
||||
idMenuMap.put(menuDO.getId(), menuDO);
|
||||
|
||||
//以下是不符合搜索条件的menu
|
||||
menuDO = createMenuDO(3L, MenuTypeEnum.BUTTON, "name", 0L, 1);
|
||||
mockCacheMap.put(menuDO.getId(), menuDO);
|
||||
menuDO = createMenuDO(4L, MenuTypeEnum.MENU, "name", 0L, 2);
|
||||
mockCacheMap.put(menuDO.getId(), menuDO);
|
||||
|
||||
List<SysMenuDO> menuDOS = sysMenuService.listMenusFromCache(Arrays.asList(MenuTypeEnum.MENU.getType()), Arrays.asList(1));
|
||||
Assert.isTrue(menuDOS.size() == idMenuMap.size());
|
||||
menuDOS.stream().forEach(m -> assertPojoEquals(idMenuMap.get(m.getId()), m));
|
||||
}
|
||||
|
||||
|
||||
@Test
|
||||
public void testListMenusFromCache2_success() throws Exception {
|
||||
Map<Long, SysMenuDO> mockCacheMap = new HashMap<>();
|
||||
//获取代理对象
|
||||
SysMenuServiceImpl target = (SysMenuServiceImpl) AopTargetUtils.getTarget(sysMenuService);
|
||||
BeanUtil.setFieldValue(target, "menuCache", mockCacheMap);
|
||||
|
||||
Map<Long, SysMenuDO> idMenuMap = new HashMap<>();
|
||||
//验证搜索id为1, 类型为MENU, 状态为1 的menu
|
||||
SysMenuDO menuDO = createMenuDO(1L, MenuTypeEnum.MENU, "name", 0L, 1);
|
||||
mockCacheMap.put(menuDO.getId(), menuDO);
|
||||
idMenuMap.put(menuDO.getId(), menuDO);
|
||||
|
||||
//以下是不符合搜索条件的menu
|
||||
menuDO = createMenuDO(2L, MenuTypeEnum.MENU, "name", 0L, 1);
|
||||
mockCacheMap.put(menuDO.getId(), menuDO);
|
||||
menuDO = createMenuDO(3L, MenuTypeEnum.BUTTON, "name", 0L, 1);
|
||||
mockCacheMap.put(menuDO.getId(), menuDO);
|
||||
menuDO = createMenuDO(4L, MenuTypeEnum.MENU, "name", 0L, 2);
|
||||
mockCacheMap.put(menuDO.getId(), menuDO);
|
||||
|
||||
List<SysMenuDO> menuDOS = sysMenuService.listMenusFromCache(Arrays.asList(1L),
|
||||
Arrays.asList(MenuTypeEnum.MENU.getType()), Arrays.asList(1));
|
||||
Assert.isTrue(menuDOS.size() == idMenuMap.size());
|
||||
menuDOS.stream().forEach(menu -> assertPojoEquals(idMenuMap.get(menu.getId()), menu));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testCheckParentResource_success() {
|
||||
SysMenuDO menuDO = createMenuDO(MenuTypeEnum.MENU, "parent", 0L);
|
||||
menuMapper.insert(menuDO);
|
||||
Long parentId = menuDO.getId();
|
||||
|
||||
sysMenuService.checkParentResource(parentId, null);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testCheckParentResource_canNotSetSelfToBeParent() {
|
||||
assertServiceException(() -> sysMenuService.checkParentResource(1L, 1L), MENU_PARENT_ERROR);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testCheckParentResource_parentNotExist() {
|
||||
assertServiceException(() -> sysMenuService.checkParentResource(randomLongId(), null), MENU_PARENT_NOT_EXISTS);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testCheckParentResource_parentTypeError() {
|
||||
SysMenuDO menuDO = createMenuDO(MenuTypeEnum.BUTTON, "parent", 0L);
|
||||
menuMapper.insert(menuDO);
|
||||
Long parentId = menuDO.getId();
|
||||
|
||||
assertServiceException(() -> sysMenuService.checkParentResource(parentId, null), MENU_PARENT_NOT_DIR_OR_MENU);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testCheckResource_success(){
|
||||
SysMenuDO sonMenu=initParentAndSonMenuDO();
|
||||
Long parentId=sonMenu.getParentId();
|
||||
|
||||
Long otherSonMenuId=randomLongId();
|
||||
String otherSonMenuName=randomString();
|
||||
|
||||
sysMenuService.checkResource(parentId,otherSonMenuName,otherSonMenuId);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testCheckResource_sonMenuNameDuplicate(){
|
||||
SysMenuDO sonMenu=initParentAndSonMenuDO();
|
||||
Long parentId=sonMenu.getParentId();
|
||||
|
||||
Long otherSonMenuId=randomLongId();
|
||||
String otherSonMenuName=sonMenu.getName(); //相同名称
|
||||
|
||||
assertServiceException(()->sysMenuService.checkResource(parentId,otherSonMenuName,otherSonMenuId), MENU_NAME_DUPLICATE);
|
||||
}
|
||||
|
||||
/**
|
||||
* 构造父子目录,返回子目录
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
private SysMenuDO initParentAndSonMenuDO() {
|
||||
//构造父子目录
|
||||
SysMenuDO menuDO = createMenuDO(MenuTypeEnum.MENU, "parent", 0L);
|
||||
menuMapper.insert(menuDO);
|
||||
Long parentId = menuDO.getId();
|
||||
|
||||
SysMenuDO sonMenuDO = createMenuDO(MenuTypeEnum.MENU, "testSonName", parentId);
|
||||
menuMapper.insert(sonMenuDO);
|
||||
return sonMenuDO;
|
||||
}
|
||||
|
||||
private SysMenuDO createMenuDO(MenuTypeEnum typeEnum, String menuName, Long parentId) {
|
||||
return createMenuDO(typeEnum, menuName, parentId, RandomUtils.randomCommonStatus());
|
||||
}
|
||||
|
||||
private SysMenuDO createMenuDO(MenuTypeEnum typeEnum, String menuName, Long parentId, Integer status) {
|
||||
return createMenuDO(null, typeEnum, menuName, parentId, status);
|
||||
}
|
||||
|
||||
private SysMenuDO createMenuDO(Long id, MenuTypeEnum typeEnum, String menuName, Long parentId, Integer status) {
|
||||
SysMenuDO sonMenuDO = RandomUtils.randomPojo(SysMenuDO.class, o -> {
|
||||
o.setId(id);
|
||||
o.setParentId(parentId);
|
||||
o.setType(typeEnum.getType());
|
||||
o.setStatus(status);
|
||||
o.setName(menuName);
|
||||
});
|
||||
return sonMenuDO;
|
||||
}
|
||||
|
||||
|
||||
}
|
@ -0,0 +1,109 @@
|
||||
package cn.iocoder.dashboard.modules.system.service.permission;
|
||||
|
||||
import cn.iocoder.dashboard.BaseDbUnitTest;
|
||||
import cn.iocoder.dashboard.modules.system.dal.dataobject.permission.SysRoleMenuDO;
|
||||
import cn.iocoder.dashboard.modules.system.dal.dataobject.permission.SysUserRoleDO;
|
||||
import cn.iocoder.dashboard.modules.system.dal.mysql.permission.SysRoleMenuMapper;
|
||||
import cn.iocoder.dashboard.modules.system.dal.mysql.permission.SysUserRoleMapper;
|
||||
import cn.iocoder.dashboard.modules.system.mq.producer.permission.SysPermissionProducer;
|
||||
import cn.iocoder.dashboard.modules.system.service.permission.impl.SysPermissionServiceImpl;
|
||||
import org.junit.jupiter.api.Test;
|
||||
import org.springframework.boot.test.mock.mockito.MockBean;
|
||||
import org.springframework.context.annotation.Import;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import java.util.List;
|
||||
|
||||
import static cn.iocoder.dashboard.util.AssertUtils.assertPojoEquals;
|
||||
import static cn.iocoder.dashboard.util.RandomUtils.randomLongId;
|
||||
import static cn.iocoder.dashboard.util.RandomUtils.randomPojo;
|
||||
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||
import static org.mockito.Mockito.verify;
|
||||
|
||||
@Import(SysPermissionServiceImpl.class)
|
||||
public class SysPermissionServiceTest extends BaseDbUnitTest {
|
||||
|
||||
@Resource
|
||||
private SysPermissionServiceImpl permissionService;
|
||||
|
||||
@Resource
|
||||
private SysRoleMenuMapper roleMenuMapper;
|
||||
@Resource
|
||||
private SysUserRoleMapper userRoleMapper;
|
||||
|
||||
@MockBean
|
||||
private SysRoleService roleService;
|
||||
@MockBean
|
||||
private SysMenuService menuService;
|
||||
|
||||
@MockBean
|
||||
private SysPermissionProducer permissionProducer;
|
||||
|
||||
@Test
|
||||
public void testProcessRoleDeleted() {
|
||||
// 准备参数
|
||||
Long roleId = randomLongId();
|
||||
// mock 数据 UserRole
|
||||
SysUserRoleDO userRoleDO01 = randomPojo(SysUserRoleDO.class, o -> o.setRoleId(roleId)); // 被删除
|
||||
userRoleMapper.insert(userRoleDO01);
|
||||
SysUserRoleDO userRoleDO02 = randomPojo(SysUserRoleDO.class); // 不被删除
|
||||
userRoleMapper.insert(userRoleDO02);
|
||||
// mock 数据 RoleMenu
|
||||
SysRoleMenuDO roleMenuDO01 = randomPojo(SysRoleMenuDO.class, o -> o.setRoleId(roleId)); // 被删除
|
||||
roleMenuMapper.insert(roleMenuDO01);
|
||||
SysRoleMenuDO roleMenuDO02 = randomPojo(SysRoleMenuDO.class); // 不被删除
|
||||
roleMenuMapper.insert(roleMenuDO02);
|
||||
|
||||
// 调用
|
||||
permissionService.processRoleDeleted(roleId);
|
||||
// 断言数据 RoleMenuDO
|
||||
List<SysRoleMenuDO> dbRoleMenus = roleMenuMapper.selectList();
|
||||
assertEquals(1, dbRoleMenus.size());
|
||||
assertPojoEquals(dbRoleMenus.get(0), roleMenuDO02);
|
||||
// 断言数据 UserRoleDO
|
||||
List<SysUserRoleDO> dbUserRoles = userRoleMapper.selectList();
|
||||
assertEquals(1, dbUserRoles.size());
|
||||
assertPojoEquals(dbUserRoles.get(0), userRoleDO02);
|
||||
// 断言调用
|
||||
verify(permissionProducer).sendRoleMenuRefreshMessage();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testProcessMenuDeleted() {
|
||||
// 准备参数
|
||||
Long menuId = randomLongId();
|
||||
// mock 数据
|
||||
SysRoleMenuDO roleMenuDO01 = randomPojo(SysRoleMenuDO.class, o -> o.setMenuId(menuId)); // 被删除
|
||||
roleMenuMapper.insert(roleMenuDO01);
|
||||
SysRoleMenuDO roleMenuDO02 = randomPojo(SysRoleMenuDO.class); // 不被删除
|
||||
roleMenuMapper.insert(roleMenuDO02);
|
||||
|
||||
// 调用
|
||||
permissionService.processMenuDeleted(menuId);
|
||||
// 断言数据
|
||||
List<SysRoleMenuDO> dbRoleMenus = roleMenuMapper.selectList();
|
||||
assertEquals(1, dbRoleMenus.size());
|
||||
assertPojoEquals(dbRoleMenus.get(0), roleMenuDO02);
|
||||
// 断言调用
|
||||
verify(permissionProducer).sendRoleMenuRefreshMessage();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testProcessUserDeleted() {
|
||||
// 准备参数
|
||||
Long userId = randomLongId();
|
||||
// mock 数据
|
||||
SysUserRoleDO userRoleDO01 = randomPojo(SysUserRoleDO.class, o -> o.setUserId(userId)); // 被删除
|
||||
userRoleMapper.insert(userRoleDO01);
|
||||
SysUserRoleDO userRoleDO02 = randomPojo(SysUserRoleDO.class); // 不被删除
|
||||
userRoleMapper.insert(userRoleDO02);
|
||||
|
||||
// 调用
|
||||
permissionService.processUserDeleted(userId);
|
||||
// 断言数据
|
||||
List<SysUserRoleDO> dbUserRoles = userRoleMapper.selectList();
|
||||
assertEquals(1, dbUserRoles.size());
|
||||
assertPojoEquals(dbUserRoles.get(0), userRoleDO02);
|
||||
}
|
||||
|
||||
}
|
@ -1,24 +0,0 @@
|
||||
package cn.iocoder.dashboard.modules.tool.dal.mysql.codegen;
|
||||
|
||||
import cn.iocoder.dashboard.BaseDbUnitTest;
|
||||
import cn.iocoder.dashboard.modules.tool.dal.dataobject.codegen.ToolSchemaColumnDO;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import java.util.List;
|
||||
|
||||
import static org.junit.jupiter.api.Assertions.assertTrue;
|
||||
|
||||
public class ToolInformationSchemaColumnMapperTest extends BaseDbUnitTest {
|
||||
|
||||
@Resource
|
||||
private ToolSchemaColumnMapper toolInformationSchemaColumnMapper;
|
||||
|
||||
@Test
|
||||
public void testSelectListByTableName() {
|
||||
List<ToolSchemaColumnDO> columns = toolInformationSchemaColumnMapper
|
||||
.selectListByTableName("inf_config");
|
||||
assertTrue(columns.size() > 0);
|
||||
}
|
||||
|
||||
}
|
@ -1,24 +0,0 @@
|
||||
package cn.iocoder.dashboard.modules.tool.dal.mysql.codegen;
|
||||
|
||||
import cn.iocoder.dashboard.BaseDbUnitTest;
|
||||
import cn.iocoder.dashboard.modules.tool.dal.dataobject.codegen.ToolSchemaTableDO;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import java.util.List;
|
||||
|
||||
import static org.junit.jupiter.api.Assertions.assertTrue;
|
||||
|
||||
class ToolInformationSchemaTableMapperTest extends BaseDbUnitTest {
|
||||
|
||||
@Resource
|
||||
private ToolSchemaTableMapper toolInformationSchemaTableMapper;
|
||||
|
||||
@Test
|
||||
public void tstSelectListByTableSchema() {
|
||||
List<ToolSchemaTableDO> tables = toolInformationSchemaTableMapper
|
||||
.selectListByTableSchema("ruoyi-vue-pro");
|
||||
assertTrue(tables.size() > 0);
|
||||
}
|
||||
|
||||
}
|
@ -1,33 +0,0 @@
|
||||
package cn.iocoder.dashboard.modules.tool.service.codegen.impl;
|
||||
|
||||
import cn.iocoder.dashboard.BaseDbUnitTest;
|
||||
import cn.iocoder.dashboard.modules.tool.dal.dataobject.codegen.ToolCodegenColumnDO;
|
||||
import cn.iocoder.dashboard.modules.tool.dal.dataobject.codegen.ToolCodegenTableDO;
|
||||
import cn.iocoder.dashboard.modules.tool.dal.mysql.codegen.ToolCodegenColumnMapper;
|
||||
import cn.iocoder.dashboard.modules.tool.dal.mysql.codegen.ToolCodegenTableMapper;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
public class ToolCodegenEngineTest extends BaseDbUnitTest {
|
||||
|
||||
@Resource
|
||||
private ToolCodegenTableMapper codegenTableMapper;
|
||||
@Resource
|
||||
private ToolCodegenColumnMapper codegenColumnMapper;
|
||||
|
||||
@Resource
|
||||
private ToolCodegenEngine codegenEngine;
|
||||
|
||||
@Test
|
||||
public void testExecute() {
|
||||
ToolCodegenTableDO table = codegenTableMapper.selectById(20);
|
||||
List<ToolCodegenColumnDO> columns = codegenColumnMapper.selectListByTableId(table.getId());
|
||||
Map<String, String> result = codegenEngine.execute(table, columns);
|
||||
result.forEach((s, s2) -> System.out.println(s2));
|
||||
// System.out.println(result.get("vue/views/system/test/index.vue"));
|
||||
}
|
||||
|
||||
}
|
@ -1,28 +0,0 @@
|
||||
package cn.iocoder.dashboard.modules.tool.service.codegen.impl;
|
||||
|
||||
import cn.iocoder.dashboard.BaseDbUnitTest;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
public class ToolCodegenSQLParserTest extends BaseDbUnitTest {
|
||||
|
||||
@Test
|
||||
public void testParse() {
|
||||
String sql = "CREATE TABLE `tool_test_demo` (\n" +
|
||||
" `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '编号',\n" +
|
||||
" `name` varchar(100) NOT NULL DEFAULT '' COMMENT '名字',\n" +
|
||||
" `status` tinyint(4) NOT NULL DEFAULT '0' COMMENT '状态',\n" +
|
||||
" `type` tinyint(4) NOT NULL COMMENT '类型',\n" +
|
||||
" `category` tinyint(4) NOT NULL COMMENT '分类',\n" +
|
||||
" `remark` varchar(500) DEFAULT NULL COMMENT '备注',\n" +
|
||||
" `create_by` varchar(64) DEFAULT '' COMMENT '创建者',\n" +
|
||||
" `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',\n" +
|
||||
" `update_by` varchar(64) DEFAULT '' COMMENT '更新者',\n" +
|
||||
" `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',\n" +
|
||||
" `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',\n" +
|
||||
" PRIMARY KEY (`id`) USING BTREE\n" +
|
||||
") ENGINE=InnoDB AUTO_INCREMENT=108 DEFAULT CHARSET=utf8mb4 COMMENT='字典类型表';";
|
||||
ToolCodegenSQLParser.parse(sql);
|
||||
// TODO 芋艿:后续完善断言
|
||||
}
|
||||
|
||||
}
|
@ -1,20 +0,0 @@
|
||||
package cn.iocoder.dashboard.modules.tool.service.codegen.impl;
|
||||
|
||||
import cn.iocoder.dashboard.BaseDbUnitTest;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
|
||||
class ToolCodegenServiceImplTest extends BaseDbUnitTest {
|
||||
|
||||
@Resource
|
||||
private ToolCodegenServiceImpl toolCodegenService;
|
||||
|
||||
@Test
|
||||
public void tetCreateCodegenTable() {
|
||||
toolCodegenService.createCodegen("tool_test_demo");
|
||||
// toolCodegenService.createCodegenTable("tool_codegen_table");
|
||||
// toolCodegenService.createCodegen("tool_codegen_column");
|
||||
}
|
||||
|
||||
}
|
47
src/test/java/cn/iocoder/dashboard/util/AopTargetUtils.java
Normal file
47
src/test/java/cn/iocoder/dashboard/util/AopTargetUtils.java
Normal file
@ -0,0 +1,47 @@
|
||||
package cn.iocoder.dashboard.util;
|
||||
|
||||
import cn.hutool.core.bean.BeanUtil;
|
||||
import org.springframework.aop.framework.AdvisedSupport;
|
||||
import org.springframework.aop.framework.AopProxy;
|
||||
import org.springframework.aop.support.AopUtils;
|
||||
|
||||
import java.lang.reflect.Field;
|
||||
|
||||
/**
|
||||
* http://www.bubuko.com/infodetail-3471885.html
|
||||
*/
|
||||
public class AopTargetUtils {
|
||||
|
||||
/**
|
||||
* 获取 目标对象
|
||||
*
|
||||
* @param proxy 代理对象
|
||||
* @return
|
||||
* @throws Exception
|
||||
*/
|
||||
public static Object getTarget(Object proxy) throws Exception {
|
||||
if (!AopUtils.isAopProxy(proxy)) {
|
||||
return proxy; //不是代理对象
|
||||
}
|
||||
if (AopUtils.isJdkDynamicProxy(proxy)) {
|
||||
return getJdkDynamicProxyTargetObject(proxy);
|
||||
} else { //cglib
|
||||
return getCglibProxyTargetObject(proxy);
|
||||
}
|
||||
}
|
||||
|
||||
private static Object getCglibProxyTargetObject(Object proxy) throws Exception {
|
||||
Object dynamicAdvisedInterceptor = BeanUtil.getFieldValue(proxy, "CGLIB$CALLBACK_0");
|
||||
AdvisedSupport advisedSupport = (AdvisedSupport) BeanUtil.getFieldValue(dynamicAdvisedInterceptor, "advised");
|
||||
Object target = advisedSupport.getTargetSource().getTarget();
|
||||
return target;
|
||||
}
|
||||
|
||||
private static Object getJdkDynamicProxyTargetObject(Object proxy) throws Exception {
|
||||
AopProxy aopProxy = (AopProxy) BeanUtil.getFieldValue(proxy, "h");
|
||||
AdvisedSupport advisedSupport = (AdvisedSupport) BeanUtil.getFieldValue(aopProxy, "advised");
|
||||
Object target = advisedSupport.getTargetSource().getTarget();
|
||||
return target;
|
||||
}
|
||||
|
||||
}
|
@ -1,6 +1,10 @@
|
||||
-- inf 开头的 DB
|
||||
DELETE FROM "inf_config";
|
||||
DELETE FROM "inf_file";
|
||||
DELETE FROM "inf_job";
|
||||
DELETE FROM "inf_job_log";
|
||||
DELETE FROM "inf_api_access_log";
|
||||
DELETE FROM "inf_api_error_log";
|
||||
|
||||
-- sys 开头的 DB
|
||||
DELETE FROM "sys_dept";
|
||||
@ -8,6 +12,7 @@ DELETE FROM "sys_dict_data";
|
||||
DELETE FROM "sys_role";
|
||||
DELETE FROM "sys_role_menu";
|
||||
DELETE FROM "sys_menu";
|
||||
DELETE FROM "sys_user_role";
|
||||
DELETE FROM "sys_dict_type";
|
||||
DELETE FROM "sys_user_session";
|
||||
DELETE FROM "sys_post";
|
||||
|
@ -29,6 +29,44 @@ CREATE TABLE IF NOT EXISTS "inf_file" (
|
||||
PRIMARY KEY ("id")
|
||||
) COMMENT '文件表';
|
||||
|
||||
CREATE TABLE IF NOT EXISTS "inf_job" (
|
||||
"id" bigint(20) NOT NULL GENERATED BY DEFAULT AS IDENTITY COMMENT '任务编号',
|
||||
"name" varchar(32) NOT NULL COMMENT '任务名称',
|
||||
"status" tinyint(4) NOT NULL COMMENT '任务状态',
|
||||
"handler_name" varchar(64) NOT NULL COMMENT '处理器的名字',
|
||||
"handler_param" varchar(255) DEFAULT NULL COMMENT '处理器的参数',
|
||||
"cron_expression" varchar(32) NOT NULL COMMENT 'CRON 表达式',
|
||||
"retry_count" int(11) NOT NULL DEFAULT '0' COMMENT '重试次数',
|
||||
"retry_interval" int(11) NOT NULL DEFAULT '0' COMMENT '重试间隔',
|
||||
"monitor_timeout" int(11) NOT NULL DEFAULT '0' COMMENT '监控超时时间',
|
||||
"creator" varchar(64) DEFAULT '' COMMENT '创建者',
|
||||
"create_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||||
"updater" varchar(64) DEFAULT '' COMMENT '更新者',
|
||||
"update_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
||||
"deleted" bit NOT NULL DEFAULT FALSE COMMENT '是否删除',
|
||||
PRIMARY KEY ("id")
|
||||
) COMMENT='定时任务表';
|
||||
|
||||
DROP TABLE IF EXISTS "inf_job_log";
|
||||
CREATE TABLE "inf_job_log" (
|
||||
"id" bigint(20) NOT NULL GENERATED BY DEFAULT AS IDENTITY COMMENT '日志编号',
|
||||
"job_id" bigint(20) NOT NULL COMMENT '任务编号',
|
||||
"handler_name" varchar(64) NOT NULL COMMENT '处理器的名字',
|
||||
"handler_param" varchar(255) DEFAULT NULL COMMENT '处理器的参数',
|
||||
"execute_index" tinyint(4) NOT NULL DEFAULT '1' COMMENT '第几次执行',
|
||||
"begin_time" datetime NOT NULL COMMENT '开始执行时间',
|
||||
"end_time" datetime DEFAULT NULL COMMENT '结束执行时间',
|
||||
"duration" int(11) DEFAULT NULL COMMENT '执行时长',
|
||||
"status" tinyint(4) NOT NULL COMMENT '任务状态',
|
||||
"result" varchar(4000) DEFAULT '' COMMENT '结果数据',
|
||||
"creator" varchar(64) DEFAULT '' COMMENT '创建者',
|
||||
"create_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||||
"updater" varchar(64) DEFAULT '' COMMENT '更新者',
|
||||
"update_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
||||
"deleted" bit(1) NOT NULL DEFAULT FALSE COMMENT '是否删除',
|
||||
PRIMARY KEY ("id")
|
||||
)COMMENT='定时任务日志表';
|
||||
|
||||
-- sys 开头的 DB
|
||||
|
||||
CREATE TABLE IF NOT EXISTS "sys_dept" (
|
||||
@ -113,6 +151,18 @@ CREATE TABLE IF NOT EXISTS "sys_menu" (
|
||||
PRIMARY KEY ("id")
|
||||
) COMMENT '菜单权限表';
|
||||
|
||||
CREATE TABLE IF NOT EXISTS "sys_user_role" (
|
||||
"id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY,
|
||||
"user_id" bigint NOT NULL,
|
||||
"role_id" bigint NOT NULL,
|
||||
"creator" varchar(64) DEFAULT '',
|
||||
"create_time" timestamp DEFAULT NULL,
|
||||
"updater" varchar(64) DEFAULT '',
|
||||
"update_time" timestamp DEFAULT NULL,
|
||||
"deleted" bit DEFAULT FALSE,
|
||||
PRIMARY KEY ("id")
|
||||
) COMMENT '用户和角色关联表';
|
||||
|
||||
CREATE TABLE IF NOT EXISTS "sys_dict_type" (
|
||||
"id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY,
|
||||
"name" varchar(100) NOT NULL DEFAULT '',
|
||||
@ -219,7 +269,7 @@ CREATE TABLE IF NOT EXISTS `sys_operate_log` (
|
||||
PRIMARY KEY (`id`)
|
||||
) COMMENT ='操作日志记录';
|
||||
|
||||
create table IF NOT EXISTS "sys_user" (
|
||||
CREATE TABLE IF NOT EXISTS "sys_user" (
|
||||
"id" bigint not null GENERATED BY DEFAULT AS IDENTITY,
|
||||
"username" varchar(30) not null,
|
||||
"password" varchar(100) not null default '',
|
||||
@ -242,8 +292,7 @@ create table IF NOT EXISTS "sys_user" (
|
||||
primary key ("id")
|
||||
) comment '用户信息表';
|
||||
|
||||
|
||||
create table "inf_api_access_log" (
|
||||
CREATE TABLE IF NOT EXISTS "inf_api_access_log" (
|
||||
"id" bigint not null GENERATED BY DEFAULT AS IDENTITY,
|
||||
"trace_id" varchar(64) not null default '',
|
||||
"user_id" bigint not null default '0',
|
||||
@ -265,10 +314,9 @@ create table "inf_api_access_log" (
|
||||
"update_time" timestamp not null default current_timestamp,
|
||||
"deleted" bit not null default false,
|
||||
primary key ("id")
|
||||
) comment 'API 访问日志表';
|
||||
) COMMENT 'API 访问日志表';
|
||||
|
||||
|
||||
create table "inf_api_error_log" (
|
||||
CREATE TABLE IF NOT EXISTS "inf_api_error_log" (
|
||||
"id" integer not null GENERATED BY DEFAULT AS IDENTITY,
|
||||
"trace_id" varchar(64) not null,
|
||||
"user_id" bigint not null default '0',
|
||||
@ -297,4 +345,4 @@ create table "inf_api_error_log" (
|
||||
"update_time" timestamp not null default current_timestamp,
|
||||
"deleted" bit not null default false,
|
||||
primary key ("id")
|
||||
) comment '系统异常日志';
|
||||
) COMMENT '系统异常日志';
|
||||
|
Reference in New Issue
Block a user