Commit 4a40771057bf80e5260f0e139c0c569f5ab27d0b

Authored by YunaiV
1 parent fbbcd271

短信模板的单元测试

src/main/java/cn/iocoder/dashboard/modules/system/service/sms/impl/SysSmsTemplateServiceImpl.java
... ... @@ -82,8 +82,15 @@ public class SysSmsTemplateServiceImpl implements SysSmsTemplateService {
82 82 public void updateSmsTemplate(SysSmsTemplateUpdateReqVO updateReqVO) {
83 83 // 校验存在
84 84 this.validateSmsTemplateExists(updateReqVO.getId());
  85 + // 校验短信渠道
  86 + SysSmsChannelDO channelDO = checkSmsChannel(updateReqVO.getChannelId());
  87 + // 校验短信编码是否重复
  88 + checkSmsTemplateCodeDuplicate(updateReqVO.getId(), updateReqVO.getCode());
  89 +
85 90 // 更新
86 91 SysSmsTemplateDO updateObj = SysSmsTemplateConvert.INSTANCE.convert(updateReqVO);
  92 + updateObj.setParams(parseTemplateContentParams(updateObj.getContent()));
  93 + updateObj.setChannelCode(channelDO.getCode());
87 94 smsTemplateMapper.updateById(updateObj);
88 95 }
89 96  
... ... @@ -121,7 +128,8 @@ public class SysSmsTemplateServiceImpl implements SysSmsTemplateService {
121 128 return smsTemplateMapper.selectList(exportReqVO);
122 129 }
123 130  
124   - private SysSmsChannelDO checkSmsChannel(Long channelId) {
  131 + @VisibleForTesting
  132 + public SysSmsChannelDO checkSmsChannel(Long channelId) {
125 133 SysSmsChannelDO channelDO = smsChannelService.getSmsChannel(channelId);
126 134 if (channelDO == null) {
127 135 throw exception(SMS_CHANNEL_NOT_EXISTS);
... ... @@ -132,7 +140,8 @@ public class SysSmsTemplateServiceImpl implements SysSmsTemplateService {
132 140 return channelDO;
133 141 }
134 142  
135   - private void checkSmsTemplateCodeDuplicate(Long id, String code) {
  143 + @VisibleForTesting
  144 + public void checkSmsTemplateCodeDuplicate(Long id, String code) {
136 145 SysSmsTemplateDO template = smsTemplateMapper.selectByCode(code);
137 146 if (template == null) {
138 147 return;
... ...
src/test/java/cn/iocoder/dashboard/modules/system/service/permission/SysMenuServiceTest.java
... ... @@ -12,7 +12,6 @@ import cn.iocoder.dashboard.modules.system.enums.permission.MenuTypeEnum;
12 12 import cn.iocoder.dashboard.modules.system.mq.producer.permission.SysMenuProducer;
13 13 import cn.iocoder.dashboard.modules.system.service.permission.impl.SysMenuServiceImpl;
14 14 import cn.iocoder.dashboard.util.AopTargetUtils;
15   -import cn.iocoder.dashboard.util.AssertUtils;
16 15 import cn.iocoder.dashboard.util.RandomUtils;
17 16 import cn.iocoder.dashboard.util.object.ObjectUtils;
18 17 import com.google.common.collect.Multimap;
... ... @@ -22,7 +21,6 @@ import org.springframework.boot.test.mock.mockito.MockBean;
22 21 import org.springframework.context.annotation.Import;
23 22  
24 23 import javax.annotation.Resource;
25   -
26 24 import java.util.*;
27 25  
28 26 import static cn.iocoder.dashboard.modules.system.enums.SysErrorCodeConstants.*;
... ... @@ -273,10 +271,10 @@ public class SysMenuServiceTest extends BaseDbUnitTest {
273 271 menuDO = createMenuDO(4L, MenuTypeEnum.MENU, "name", 0L, 2);
274 272 mockCacheMap.put(menuDO.getId(), menuDO);
275 273  
276   - List<SysMenuDO> menuDOS = sysMenuService.listMenusFromCache(Arrays.asList(1L),
277   - Arrays.asList(MenuTypeEnum.MENU.getType()), Arrays.asList(1));
  274 + List<SysMenuDO> menuDOS = sysMenuService.listMenusFromCache(Collections.singletonList(1L),
  275 + Collections.singletonList(MenuTypeEnum.MENU.getType()), Collections.singletonList(1));
278 276 Assert.isTrue(menuDOS.size() == idMenuMap.size());
279   - menuDOS.stream().forEach(menu -> assertPojoEquals(idMenuMap.get(menu.getId()), menu));
  277 + menuDOS.forEach(menu -> assertPojoEquals(idMenuMap.get(menu.getId()), menu));
280 278 }
281 279  
282 280 @Test
... ... @@ -354,14 +352,13 @@ public class SysMenuServiceTest extends BaseDbUnitTest {
354 352 }
355 353  
356 354 private SysMenuDO createMenuDO(Long id, MenuTypeEnum typeEnum, String menuName, Long parentId, Integer status) {
357   - SysMenuDO sonMenuDO = RandomUtils.randomPojo(SysMenuDO.class, o -> {
  355 + return RandomUtils.randomPojo(SysMenuDO.class, o -> {
358 356 o.setId(id);
359 357 o.setParentId(parentId);
360 358 o.setType(typeEnum.getType());
361 359 o.setStatus(status);
362 360 o.setName(menuName);
363 361 });
364   - return sonMenuDO;
365 362 }
366 363  
367 364  
... ...
src/test/java/cn/iocoder/dashboard/modules/system/service/sms/SysSmsTemplateServiceTest.java
... ... @@ -3,10 +3,7 @@ package cn.iocoder.dashboard.modules.system.service.sms;
3 3 import cn.iocoder.dashboard.BaseDbUnitTest;
4 4 import cn.iocoder.dashboard.common.enums.CommonStatusEnum;
5 5 import cn.iocoder.dashboard.common.pojo.PageResult;
6   -import cn.iocoder.dashboard.modules.system.controller.sms.vo.template.SysSmsTemplateCreateReqVO;
7   -import cn.iocoder.dashboard.modules.system.controller.sms.vo.template.SysSmsTemplateExportReqVO;
8   -import cn.iocoder.dashboard.modules.system.controller.sms.vo.template.SysSmsTemplatePageReqVO;
9   -import cn.iocoder.dashboard.modules.system.controller.sms.vo.template.SysSmsTemplateUpdateReqVO;
  6 +import cn.iocoder.dashboard.modules.system.controller.sms.vo.template.*;
10 7 import cn.iocoder.dashboard.modules.system.dal.dataobject.sms.SysSmsChannelDO;
11 8 import cn.iocoder.dashboard.modules.system.dal.dataobject.sms.SysSmsTemplateDO;
12 9 import cn.iocoder.dashboard.modules.system.dal.mysql.sms.SysSmsTemplateMapper;
... ... @@ -24,11 +21,11 @@ import java.util.List;
24 21 import java.util.function.Consumer;
25 22  
26 23 import static cn.hutool.core.util.RandomUtil.randomEle;
27   -import static cn.iocoder.dashboard.modules.system.enums.SysErrorCodeConstants.SMS_TEMPLATE_NOT_EXISTS;
  24 +import static cn.iocoder.dashboard.modules.system.enums.SysErrorCodeConstants.*;
28 25 import static cn.iocoder.dashboard.util.AssertUtils.assertPojoEquals;
29 26 import static cn.iocoder.dashboard.util.AssertUtils.assertServiceException;
30   -import static cn.iocoder.dashboard.util.RandomUtils.randomLongId;
31   -import static cn.iocoder.dashboard.util.RandomUtils.randomPojo;
  27 +import static cn.iocoder.dashboard.util.RandomUtils.*;
  28 +import static cn.iocoder.dashboard.util.date.DateUtils.buildTime;
32 29 import static org.junit.jupiter.api.Assertions.*;
33 30 import static org.mockito.ArgumentMatchers.eq;
34 31 import static org.mockito.Mockito.when;
... ... @@ -91,18 +88,29 @@ public class SysSmsTemplateServiceTest extends BaseDbUnitTest {
91 88 @Test
92 89 public void testUpdateSmsTemplate_success() {
93 90 // mock 数据
94   - SysSmsTemplateDO dbSmsTemplate = randomPojo(SysSmsTemplateDO.class);
  91 + SysSmsTemplateDO dbSmsTemplate = randomSmsTemplateDO();
95 92 smsTemplateMapper.insert(dbSmsTemplate);// @Sql: 先插入出一条存在的数据
96 93 // 准备参数
97 94 SysSmsTemplateUpdateReqVO reqVO = randomPojo(SysSmsTemplateUpdateReqVO.class, o -> {
98 95 o.setId(dbSmsTemplate.getId()); // 设置更新的 ID
  96 + o.setContent("正在进行登录操作{operation},您的验证码是{code}");
  97 + o.setStatus(randomEle(CommonStatusEnum.values()).getStatus()); // 保证 status 的范围
  98 + o.setType(randomEle(SysSmsTemplateTypeEnum.values()).getType()); // 保证 type 的泛微
  99 + });
  100 + // mock 方法
  101 + SysSmsChannelDO channelDO = randomPojo(SysSmsChannelDO.class, o -> {
  102 + o.setId(reqVO.getChannelId());
  103 + o.setStatus(CommonStatusEnum.ENABLE.getStatus()); // 保证 status 开启,创建必须处于这个状态
99 104 });
  105 + when(smsChannelService.getSmsChannel(eq(channelDO.getId()))).thenReturn(channelDO);
100 106  
101 107 // 调用
102 108 smsTemplateService.updateSmsTemplate(reqVO);
103 109 // 校验是否更新正确
104 110 SysSmsTemplateDO smsTemplate = smsTemplateMapper.selectById(reqVO.getId()); // 获取最新的
105 111 assertPojoEquals(reqVO, smsTemplate);
  112 + assertEquals(Lists.newArrayList("operation", "code"), smsTemplate.getParams());
  113 + assertEquals(channelDO.getCode(), smsTemplate.getChannelCode());
106 114 }
107 115  
108 116 @Test
... ... @@ -137,43 +145,43 @@ public class SysSmsTemplateServiceTest extends BaseDbUnitTest {
137 145 assertServiceException(() -> smsTemplateService.deleteSmsTemplate(id), SMS_TEMPLATE_NOT_EXISTS);
138 146 }
139 147  
140   - @Test // TODO 请修改 null 为需要的值
  148 + @Test
141 149 public void testGetSmsTemplatePage() {
142 150 // mock 数据
143 151 SysSmsTemplateDO dbSmsTemplate = randomPojo(SysSmsTemplateDO.class, o -> { // 等会查询到
144   - o.setType(null);
145   - o.setStatus(null);
146   - o.setCode(null);
147   - o.setContent(null);
148   - o.setApiTemplateId(null);
149   - o.setChannelId(null);
150   - o.setCreateTime(null);
  152 + o.setType(SysSmsTemplateTypeEnum.PROMOTION.getType());
  153 + o.setStatus(CommonStatusEnum.ENABLE.getStatus());
  154 + o.setCode("yudaoyuanma");
  155 + o.setContent("芋道源码");
  156 + o.setApiTemplateId("yunai");
  157 + o.setChannelId(1L);
  158 + o.setCreateTime(buildTime(2021, 11, 11));
151 159 });
152 160 smsTemplateMapper.insert(dbSmsTemplate);
153 161 // 测试 type 不匹配
154   - smsTemplateMapper.insert(ObjectUtils.clone(dbSmsTemplate, o -> o.setType(null)));
  162 + smsTemplateMapper.insert(ObjectUtils.clone(dbSmsTemplate, o -> o.setType(SysSmsTemplateTypeEnum.VERIFICATION_CODE.getType())));
155 163 // 测试 status 不匹配
156   - smsTemplateMapper.insert(ObjectUtils.clone(dbSmsTemplate, o -> o.setStatus(null)));
  164 + smsTemplateMapper.insert(ObjectUtils.clone(dbSmsTemplate, o -> o.setStatus(CommonStatusEnum.DISABLE.getStatus())));
157 165 // 测试 code 不匹配
158   - smsTemplateMapper.insert(ObjectUtils.clone(dbSmsTemplate, o -> o.setCode(null)));
  166 + smsTemplateMapper.insert(ObjectUtils.clone(dbSmsTemplate, o -> o.setCode("yuanma")));
159 167 // 测试 content 不匹配
160   - smsTemplateMapper.insert(ObjectUtils.clone(dbSmsTemplate, o -> o.setContent(null)));
  168 + smsTemplateMapper.insert(ObjectUtils.clone(dbSmsTemplate, o -> o.setContent("源码")));
161 169 // 测试 apiTemplateId 不匹配
162   - smsTemplateMapper.insert(ObjectUtils.clone(dbSmsTemplate, o -> o.setApiTemplateId(null)));
  170 + smsTemplateMapper.insert(ObjectUtils.clone(dbSmsTemplate, o -> o.setApiTemplateId("nai")));
163 171 // 测试 channelId 不匹配
164   - smsTemplateMapper.insert(ObjectUtils.clone(dbSmsTemplate, o -> o.setChannelId(null)));
  172 + smsTemplateMapper.insert(ObjectUtils.clone(dbSmsTemplate, o -> o.setChannelId(2L)));
165 173 // 测试 createTime 不匹配
166   - smsTemplateMapper.insert(ObjectUtils.clone(dbSmsTemplate, o -> o.setCreateTime(null)));
  174 + smsTemplateMapper.insert(ObjectUtils.clone(dbSmsTemplate, o -> o.setCreateTime(buildTime(2021, 12, 12))));
167 175 // 准备参数
168 176 SysSmsTemplatePageReqVO reqVO = new SysSmsTemplatePageReqVO();
169   - reqVO.setType(null);
170   - reqVO.setStatus(null);
171   - reqVO.setCode(null);
172   - reqVO.setContent(null);
173   - reqVO.setApiTemplateId(null);
174   - reqVO.setChannelId(null);
175   - reqVO.setBeginCreateTime(null);
176   - reqVO.setEndCreateTime(null);
  177 + reqVO.setType(SysSmsTemplateTypeEnum.PROMOTION.getType());
  178 + reqVO.setStatus(CommonStatusEnum.ENABLE.getStatus());
  179 + reqVO.setCode("yudao");
  180 + reqVO.setContent("芋道");
  181 + reqVO.setApiTemplateId("yu");
  182 + reqVO.setChannelId(1L);
  183 + reqVO.setBeginCreateTime(buildTime(2021, 11, 1));
  184 + reqVO.setEndCreateTime(buildTime(2021, 12, 1));
177 185  
178 186 // 调用
179 187 PageResult<SysSmsTemplateDO> pageResult = smsTemplateService.getSmsTemplatePage(reqVO);
... ... @@ -183,43 +191,43 @@ public class SysSmsTemplateServiceTest extends BaseDbUnitTest {
183 191 assertPojoEquals(dbSmsTemplate, pageResult.getList().get(0));
184 192 }
185 193  
186   - @Test // TODO 请修改 null 为需要的值
  194 + @Test
187 195 public void testGetSmsTemplateList() {
188   - // mock 数据
189   - SysSmsTemplateDO dbSmsTemplate = randomPojo(SysSmsTemplateDO.class, o -> { // 等会查询到
190   - o.setType(null);
191   - o.setStatus(null);
192   - o.setCode(null);
193   - o.setContent(null);
194   - o.setApiTemplateId(null);
195   - o.setChannelId(null);
196   - o.setCreateTime(null);
197   - });
198   - smsTemplateMapper.insert(dbSmsTemplate);
199   - // 测试 type 不匹配
200   - smsTemplateMapper.insert(ObjectUtils.clone(dbSmsTemplate, o -> o.setType(null)));
201   - // 测试 status 不匹配
202   - smsTemplateMapper.insert(ObjectUtils.clone(dbSmsTemplate, o -> o.setStatus(null)));
203   - // 测试 code 不匹配
204   - smsTemplateMapper.insert(ObjectUtils.clone(dbSmsTemplate, o -> o.setCode(null)));
205   - // 测试 content 不匹配
206   - smsTemplateMapper.insert(ObjectUtils.clone(dbSmsTemplate, o -> o.setContent(null)));
207   - // 测试 apiTemplateId 不匹配
208   - smsTemplateMapper.insert(ObjectUtils.clone(dbSmsTemplate, o -> o.setApiTemplateId(null)));
209   - // 测试 channelId 不匹配
210   - smsTemplateMapper.insert(ObjectUtils.clone(dbSmsTemplate, o -> o.setChannelId(null)));
211   - // 测试 createTime 不匹配
212   - smsTemplateMapper.insert(ObjectUtils.clone(dbSmsTemplate, o -> o.setCreateTime(null)));
213   - // 准备参数
214   - SysSmsTemplateExportReqVO reqVO = new SysSmsTemplateExportReqVO();
215   - reqVO.setType(null);
216   - reqVO.setStatus(null);
217   - reqVO.setCode(null);
218   - reqVO.setContent(null);
219   - reqVO.setApiTemplateId(null);
220   - reqVO.setChannelId(null);
221   - reqVO.setBeginCreateTime(null);
222   - reqVO.setEndCreateTime(null);
  196 + // mock 数据
  197 + SysSmsTemplateDO dbSmsTemplate = randomPojo(SysSmsTemplateDO.class, o -> { // 等会查询到
  198 + o.setType(SysSmsTemplateTypeEnum.PROMOTION.getType());
  199 + o.setStatus(CommonStatusEnum.ENABLE.getStatus());
  200 + o.setCode("yudaoyuanma");
  201 + o.setContent("芋道源码");
  202 + o.setApiTemplateId("yunai");
  203 + o.setChannelId(1L);
  204 + o.setCreateTime(buildTime(2021, 11, 11));
  205 + });
  206 + smsTemplateMapper.insert(dbSmsTemplate);
  207 + // 测试 type 不匹配
  208 + smsTemplateMapper.insert(ObjectUtils.clone(dbSmsTemplate, o -> o.setType(SysSmsTemplateTypeEnum.VERIFICATION_CODE.getType())));
  209 + // 测试 status 不匹配
  210 + smsTemplateMapper.insert(ObjectUtils.clone(dbSmsTemplate, o -> o.setStatus(CommonStatusEnum.DISABLE.getStatus())));
  211 + // 测试 code 不匹配
  212 + smsTemplateMapper.insert(ObjectUtils.clone(dbSmsTemplate, o -> o.setCode("yuanma")));
  213 + // 测试 content 不匹配
  214 + smsTemplateMapper.insert(ObjectUtils.clone(dbSmsTemplate, o -> o.setContent("源码")));
  215 + // 测试 apiTemplateId 不匹配
  216 + smsTemplateMapper.insert(ObjectUtils.clone(dbSmsTemplate, o -> o.setApiTemplateId("nai")));
  217 + // 测试 channelId 不匹配
  218 + smsTemplateMapper.insert(ObjectUtils.clone(dbSmsTemplate, o -> o.setChannelId(2L)));
  219 + // 测试 createTime 不匹配
  220 + smsTemplateMapper.insert(ObjectUtils.clone(dbSmsTemplate, o -> o.setCreateTime(buildTime(2021, 12, 12))));
  221 + // 准备参数
  222 + SysSmsTemplateExportReqVO reqVO = new SysSmsTemplateExportReqVO();
  223 + reqVO.setType(SysSmsTemplateTypeEnum.PROMOTION.getType());
  224 + reqVO.setStatus(CommonStatusEnum.ENABLE.getStatus());
  225 + reqVO.setCode("yudao");
  226 + reqVO.setContent("芋道");
  227 + reqVO.setApiTemplateId("yu");
  228 + reqVO.setChannelId(1L);
  229 + reqVO.setBeginCreateTime(buildTime(2021, 11, 1));
  230 + reqVO.setEndCreateTime(buildTime(2021, 12, 1));
223 231  
224 232 // 调用
225 233 List<SysSmsTemplateDO> list = smsTemplateService.getSmsTemplateList(reqVO);
... ... @@ -228,6 +236,82 @@ public class SysSmsTemplateServiceTest extends BaseDbUnitTest {
228 236 assertPojoEquals(dbSmsTemplate, list.get(0));
229 237 }
230 238  
  239 + @Test
  240 + public void testCheckSmsChannel_success() {
  241 + // 准备参数
  242 + Long channelId = randomLongId();
  243 + // mock 方法
  244 + SysSmsChannelDO channelDO = randomPojo(SysSmsChannelDO.class, o -> {
  245 + o.setId(channelId);
  246 + o.setStatus(CommonStatusEnum.ENABLE.getStatus()); // 保证 status 开启,创建必须处于这个状态
  247 + });
  248 + when(smsChannelService.getSmsChannel(eq(channelId))).thenReturn(channelDO);
  249 +
  250 + // 调用
  251 + SysSmsChannelDO returnChannelDO = smsTemplateService.checkSmsChannel(channelId);
  252 + // 断言
  253 + assertPojoEquals(returnChannelDO, channelDO);
  254 + }
  255 +
  256 + @Test
  257 + public void testCheckSmsChannel_notExists() {
  258 + // 准备参数
  259 + Long channelId = randomLongId();
  260 +
  261 + // 调用,校验异常
  262 + assertServiceException(() -> smsTemplateService.checkSmsChannel(channelId),
  263 + SMS_CHANNEL_NOT_EXISTS);
  264 + }
  265 +
  266 + @Test
  267 + public void testCheckSmsChannel_disable() {
  268 + // 准备参数
  269 + Long channelId = randomLongId();
  270 + // mock 方法
  271 + SysSmsChannelDO channelDO = randomPojo(SysSmsChannelDO.class, o -> {
  272 + o.setId(channelId);
  273 + o.setStatus(CommonStatusEnum.DISABLE.getStatus()); // 保证 status 禁用,触发失败
  274 + });
  275 + when(smsChannelService.getSmsChannel(eq(channelId))).thenReturn(channelDO);
  276 +
  277 + // 调用,校验异常
  278 + assertServiceException(() -> smsTemplateService.checkSmsChannel(channelId),
  279 + SMS_CHANNEL_DISABLE);
  280 + }
  281 +
  282 + @Test
  283 + public void testCheckDictDataValueUnique_success() {
  284 + // 调用,成功
  285 + smsTemplateService.checkSmsTemplateCodeDuplicate(randomLongId(), randomString());
  286 + }
  287 +
  288 + @Test
  289 + public void testCheckDictDataValueUnique_valueDuplicateForCreate() {
  290 + // 准备参数
  291 + String code = randomString();
  292 + // mock 数据
  293 + smsTemplateMapper.insert(randomSmsTemplateDO(o -> o.setCode(code)));
  294 +
  295 + // 调用,校验异常
  296 + assertServiceException(() -> smsTemplateService.checkSmsTemplateCodeDuplicate(null, code),
  297 + SMS_TEMPLATE_CODE_DUPLICATE);
  298 + }
  299 +
  300 + @Test
  301 + public void testCheckDictDataValueUnique_valueDuplicateForUpdate() {
  302 + // 准备参数
  303 + Long id = randomLongId();
  304 + String code = randomString();
  305 + // mock 数据
  306 + smsTemplateMapper.insert(randomSmsTemplateDO(o -> o.setCode(code)));
  307 +
  308 + // 调用,校验异常
  309 + assertServiceException(() -> smsTemplateService.checkSmsTemplateCodeDuplicate(id, code),
  310 + SMS_TEMPLATE_CODE_DUPLICATE);
  311 + }
  312 +
  313 + // ========== 随机对象 ==========
  314 +
231 315 @SafeVarargs
232 316 private static SysSmsTemplateDO randomSmsTemplateDO(Consumer<SysSmsTemplateDO>... consumers) {
233 317 Consumer<SysSmsTemplateDO> consumer = (o) -> {
... ...
src/test/resources/sql/clean.sql
... ... @@ -20,3 +20,4 @@ DELETE FROM &quot;sys_login_log&quot;;
20 20 DELETE FROM "sys_operate_log";
21 21 DELETE FROM "sys_user";
22 22 DELETE FROM "sys_sms_channel";
  23 +DELETE FROM "sys_sms_template";
... ...