完善 SmsCodeServiceImpl 单元测试
parent
a332d5f893
commit
d897f8fb10
|
@ -1,7 +1,7 @@
|
||||||
package cn.iocoder.yudao.module.system.api.sms;
|
package cn.iocoder.yudao.module.system.api.sms;
|
||||||
|
|
||||||
import cn.iocoder.yudao.framework.common.exception.ServiceException;
|
import cn.iocoder.yudao.framework.common.exception.ServiceException;
|
||||||
import cn.iocoder.yudao.module.system.api.sms.dto.code.SmsCodeCheckReqDTO;
|
import cn.iocoder.yudao.module.system.api.sms.dto.code.SmsCodeValidateReqDTO;
|
||||||
import cn.iocoder.yudao.module.system.api.sms.dto.code.SmsCodeSendReqDTO;
|
import cn.iocoder.yudao.module.system.api.sms.dto.code.SmsCodeSendReqDTO;
|
||||||
import cn.iocoder.yudao.module.system.api.sms.dto.code.SmsCodeUseReqDTO;
|
import cn.iocoder.yudao.module.system.api.sms.dto.code.SmsCodeUseReqDTO;
|
||||||
|
|
||||||
|
@ -35,6 +35,6 @@ public interface SmsCodeApi {
|
||||||
*
|
*
|
||||||
* @param reqDTO 校验请求
|
* @param reqDTO 校验请求
|
||||||
*/
|
*/
|
||||||
void checkSmsCode(@Valid SmsCodeCheckReqDTO reqDTO);
|
void validateSmsCode(@Valid SmsCodeValidateReqDTO reqDTO);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -14,7 +14,7 @@ import javax.validation.constraints.NotNull;
|
||||||
* @author 芋道源码
|
* @author 芋道源码
|
||||||
*/
|
*/
|
||||||
@Data
|
@Data
|
||||||
public class SmsCodeCheckReqDTO {
|
public class SmsCodeValidateReqDTO {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 手机号
|
* 手机号
|
|
@ -1,6 +1,6 @@
|
||||||
package cn.iocoder.yudao.module.system.api.sms;
|
package cn.iocoder.yudao.module.system.api.sms;
|
||||||
|
|
||||||
import cn.iocoder.yudao.module.system.api.sms.dto.code.SmsCodeCheckReqDTO;
|
import cn.iocoder.yudao.module.system.api.sms.dto.code.SmsCodeValidateReqDTO;
|
||||||
import cn.iocoder.yudao.module.system.api.sms.dto.code.SmsCodeSendReqDTO;
|
import cn.iocoder.yudao.module.system.api.sms.dto.code.SmsCodeSendReqDTO;
|
||||||
import cn.iocoder.yudao.module.system.api.sms.dto.code.SmsCodeUseReqDTO;
|
import cn.iocoder.yudao.module.system.api.sms.dto.code.SmsCodeUseReqDTO;
|
||||||
import cn.iocoder.yudao.module.system.service.sms.SmsCodeService;
|
import cn.iocoder.yudao.module.system.service.sms.SmsCodeService;
|
||||||
|
@ -32,8 +32,8 @@ public class SmsCodeApiImpl implements SmsCodeApi {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void checkSmsCode(SmsCodeCheckReqDTO reqDTO) {
|
public void validateSmsCode(SmsCodeValidateReqDTO reqDTO) {
|
||||||
smsCodeService.checkSmsCode(reqDTO);
|
smsCodeService.validateSmsCode(reqDTO);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
package cn.iocoder.yudao.module.system.service.sms;
|
package cn.iocoder.yudao.module.system.service.sms;
|
||||||
|
|
||||||
import cn.iocoder.yudao.framework.common.exception.ServiceException;
|
import cn.iocoder.yudao.framework.common.exception.ServiceException;
|
||||||
import cn.iocoder.yudao.module.system.api.sms.dto.code.SmsCodeCheckReqDTO;
|
import cn.iocoder.yudao.module.system.api.sms.dto.code.SmsCodeValidateReqDTO;
|
||||||
import cn.iocoder.yudao.module.system.api.sms.dto.code.SmsCodeSendReqDTO;
|
import cn.iocoder.yudao.module.system.api.sms.dto.code.SmsCodeSendReqDTO;
|
||||||
import cn.iocoder.yudao.module.system.api.sms.dto.code.SmsCodeUseReqDTO;
|
import cn.iocoder.yudao.module.system.api.sms.dto.code.SmsCodeUseReqDTO;
|
||||||
|
|
||||||
|
@ -35,6 +35,6 @@ public interface SmsCodeService {
|
||||||
*
|
*
|
||||||
* @param reqDTO 校验请求
|
* @param reqDTO 校验请求
|
||||||
*/
|
*/
|
||||||
void checkSmsCode(@Valid SmsCodeCheckReqDTO reqDTO);
|
void validateSmsCode(@Valid SmsCodeValidateReqDTO reqDTO);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,11 +3,9 @@ package cn.iocoder.yudao.module.system.service.sms;
|
||||||
import cn.hutool.core.date.LocalDateTimeUtil;
|
import cn.hutool.core.date.LocalDateTimeUtil;
|
||||||
import cn.hutool.core.lang.Assert;
|
import cn.hutool.core.lang.Assert;
|
||||||
import cn.hutool.core.map.MapUtil;
|
import cn.hutool.core.map.MapUtil;
|
||||||
import cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil;
|
|
||||||
import cn.iocoder.yudao.framework.common.util.date.DateUtils;
|
|
||||||
import cn.iocoder.yudao.module.system.api.sms.dto.code.SmsCodeCheckReqDTO;
|
|
||||||
import cn.iocoder.yudao.module.system.api.sms.dto.code.SmsCodeSendReqDTO;
|
import cn.iocoder.yudao.module.system.api.sms.dto.code.SmsCodeSendReqDTO;
|
||||||
import cn.iocoder.yudao.module.system.api.sms.dto.code.SmsCodeUseReqDTO;
|
import cn.iocoder.yudao.module.system.api.sms.dto.code.SmsCodeUseReqDTO;
|
||||||
|
import cn.iocoder.yudao.module.system.api.sms.dto.code.SmsCodeValidateReqDTO;
|
||||||
import cn.iocoder.yudao.module.system.dal.dataobject.sms.SmsCodeDO;
|
import cn.iocoder.yudao.module.system.dal.dataobject.sms.SmsCodeDO;
|
||||||
import cn.iocoder.yudao.module.system.dal.mysql.sms.SmsCodeMapper;
|
import cn.iocoder.yudao.module.system.dal.mysql.sms.SmsCodeMapper;
|
||||||
import cn.iocoder.yudao.module.system.enums.sms.SmsSceneEnum;
|
import cn.iocoder.yudao.module.system.enums.sms.SmsSceneEnum;
|
||||||
|
@ -16,11 +14,11 @@ import org.springframework.stereotype.Service;
|
||||||
import org.springframework.validation.annotation.Validated;
|
import org.springframework.validation.annotation.Validated;
|
||||||
|
|
||||||
import javax.annotation.Resource;
|
import javax.annotation.Resource;
|
||||||
|
|
||||||
import java.time.LocalDateTime;
|
import java.time.LocalDateTime;
|
||||||
import java.time.temporal.ChronoUnit;
|
|
||||||
|
|
||||||
import static cn.hutool.core.util.RandomUtil.randomInt;
|
import static cn.hutool.core.util.RandomUtil.randomInt;
|
||||||
|
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
|
||||||
|
import static cn.iocoder.yudao.framework.common.util.date.DateUtils.isToday;
|
||||||
import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.*;
|
import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.*;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -58,11 +56,11 @@ public class SmsCodeServiceImpl implements SmsCodeService {
|
||||||
if (lastSmsCode != null) {
|
if (lastSmsCode != null) {
|
||||||
if (LocalDateTimeUtil.between(lastSmsCode.getCreateTime(), LocalDateTime.now()).toMillis()
|
if (LocalDateTimeUtil.between(lastSmsCode.getCreateTime(), LocalDateTime.now()).toMillis()
|
||||||
< smsCodeProperties.getSendFrequency().toMillis()) { // 发送过于频繁
|
< smsCodeProperties.getSendFrequency().toMillis()) { // 发送过于频繁
|
||||||
throw ServiceExceptionUtil.exception(SMS_CODE_SEND_TOO_FAST);
|
throw exception(SMS_CODE_SEND_TOO_FAST);
|
||||||
}
|
}
|
||||||
if (DateUtils.isToday(lastSmsCode.getCreateTime()) && // 必须是今天,才能计算超过当天的上限
|
if (isToday(lastSmsCode.getCreateTime()) && // 必须是今天,才能计算超过当天的上限
|
||||||
lastSmsCode.getTodayIndex() >= smsCodeProperties.getSendMaximumQuantityPerDay()) { // 超过当天发送的上限。
|
lastSmsCode.getTodayIndex() >= smsCodeProperties.getSendMaximumQuantityPerDay()) { // 超过当天发送的上限。
|
||||||
throw ServiceExceptionUtil.exception(SMS_CODE_EXCEED_SEND_MAXIMUM_QUANTITY_PER_DAY);
|
throw exception(SMS_CODE_EXCEED_SEND_MAXIMUM_QUANTITY_PER_DAY);
|
||||||
}
|
}
|
||||||
// TODO 芋艿:提升,每个 IP 每天可发送数量
|
// TODO 芋艿:提升,每个 IP 每天可发送数量
|
||||||
// TODO 芋艿:提升,每个 IP 每小时可发送数量
|
// TODO 芋艿:提升,每个 IP 每小时可发送数量
|
||||||
|
@ -71,7 +69,7 @@ public class SmsCodeServiceImpl implements SmsCodeService {
|
||||||
// 创建验证码记录
|
// 创建验证码记录
|
||||||
String code = String.valueOf(randomInt(smsCodeProperties.getBeginCode(), smsCodeProperties.getEndCode() + 1));
|
String code = String.valueOf(randomInt(smsCodeProperties.getBeginCode(), smsCodeProperties.getEndCode() + 1));
|
||||||
SmsCodeDO newSmsCode = SmsCodeDO.builder().mobile(mobile).code(code).scene(scene)
|
SmsCodeDO newSmsCode = SmsCodeDO.builder().mobile(mobile).code(code).scene(scene)
|
||||||
.todayIndex(lastSmsCode != null && DateUtils.isToday(lastSmsCode.getCreateTime()) ? lastSmsCode.getTodayIndex() + 1 : 1)
|
.todayIndex(lastSmsCode != null && isToday(lastSmsCode.getCreateTime()) ? lastSmsCode.getTodayIndex() + 1 : 1)
|
||||||
.createIp(ip).used(false).build();
|
.createIp(ip).used(false).build();
|
||||||
smsCodeMapper.insert(newSmsCode);
|
smsCodeMapper.insert(newSmsCode);
|
||||||
return code;
|
return code;
|
||||||
|
@ -80,32 +78,32 @@ public class SmsCodeServiceImpl implements SmsCodeService {
|
||||||
@Override
|
@Override
|
||||||
public void useSmsCode(SmsCodeUseReqDTO reqDTO) {
|
public void useSmsCode(SmsCodeUseReqDTO reqDTO) {
|
||||||
// 检测验证码是否有效
|
// 检测验证码是否有效
|
||||||
SmsCodeDO lastSmsCode = this.checkSmsCode0(reqDTO.getMobile(), reqDTO.getCode(), reqDTO.getScene());
|
SmsCodeDO lastSmsCode = validateSmsCode0(reqDTO.getMobile(), reqDTO.getCode(), reqDTO.getScene());
|
||||||
// 使用验证码
|
// 使用验证码
|
||||||
smsCodeMapper.updateById(SmsCodeDO.builder().id(lastSmsCode.getId())
|
smsCodeMapper.updateById(SmsCodeDO.builder().id(lastSmsCode.getId())
|
||||||
.used(true).usedTime(LocalDateTime.now()).usedIp(reqDTO.getUsedIp()).build());
|
.used(true).usedTime(LocalDateTime.now()).usedIp(reqDTO.getUsedIp()).build());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void checkSmsCode(SmsCodeCheckReqDTO reqDTO) {
|
public void validateSmsCode(SmsCodeValidateReqDTO reqDTO) {
|
||||||
checkSmsCode0(reqDTO.getMobile(), reqDTO.getCode(), reqDTO.getScene());
|
validateSmsCode0(reqDTO.getMobile(), reqDTO.getCode(), reqDTO.getScene());
|
||||||
}
|
}
|
||||||
|
|
||||||
public SmsCodeDO checkSmsCode0(String mobile, String code, Integer scene) {
|
private SmsCodeDO validateSmsCode0(String mobile, String code, Integer scene) {
|
||||||
// 校验验证码
|
// 校验验证码
|
||||||
SmsCodeDO lastSmsCode = smsCodeMapper.selectLastByMobile(mobile, code, scene);
|
SmsCodeDO lastSmsCode = smsCodeMapper.selectLastByMobile(mobile, code, scene);
|
||||||
// 若验证码不存在,抛出异常
|
// 若验证码不存在,抛出异常
|
||||||
if (lastSmsCode == null) {
|
if (lastSmsCode == null) {
|
||||||
throw ServiceExceptionUtil.exception(SMS_CODE_NOT_FOUND);
|
throw exception(SMS_CODE_NOT_FOUND);
|
||||||
}
|
}
|
||||||
// 超过时间
|
// 超过时间
|
||||||
if (LocalDateTimeUtil.between(lastSmsCode.getCreateTime(), LocalDateTime.now()).toMillis()
|
if (LocalDateTimeUtil.between(lastSmsCode.getCreateTime(), LocalDateTime.now()).toMillis()
|
||||||
>= smsCodeProperties.getExpireTimes().toMillis()) { // 验证码已过期
|
>= smsCodeProperties.getExpireTimes().toMillis()) { // 验证码已过期
|
||||||
throw ServiceExceptionUtil.exception(SMS_CODE_EXPIRED);
|
throw exception(SMS_CODE_EXPIRED);
|
||||||
}
|
}
|
||||||
// 判断验证码是否已被使用
|
// 判断验证码是否已被使用
|
||||||
if (Boolean.TRUE.equals(lastSmsCode.getUsed())) {
|
if (Boolean.TRUE.equals(lastSmsCode.getUsed())) {
|
||||||
throw ServiceExceptionUtil.exception(SMS_CODE_USED);
|
throw exception(SMS_CODE_USED);
|
||||||
}
|
}
|
||||||
return lastSmsCode;
|
return lastSmsCode;
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,209 @@
|
||||||
|
package cn.iocoder.yudao.module.system.service.sms;
|
||||||
|
|
||||||
|
import cn.hutool.core.map.MapUtil;
|
||||||
|
import cn.iocoder.yudao.framework.mybatis.core.enums.SqlConstants;
|
||||||
|
import cn.iocoder.yudao.framework.test.core.ut.BaseDbUnitTest;
|
||||||
|
import cn.iocoder.yudao.module.system.api.sms.dto.code.SmsCodeSendReqDTO;
|
||||||
|
import cn.iocoder.yudao.module.system.api.sms.dto.code.SmsCodeUseReqDTO;
|
||||||
|
import cn.iocoder.yudao.module.system.api.sms.dto.code.SmsCodeValidateReqDTO;
|
||||||
|
import cn.iocoder.yudao.module.system.dal.dataobject.sms.SmsCodeDO;
|
||||||
|
import cn.iocoder.yudao.module.system.dal.mysql.sms.SmsCodeMapper;
|
||||||
|
import cn.iocoder.yudao.module.system.enums.sms.SmsSceneEnum;
|
||||||
|
import cn.iocoder.yudao.module.system.framework.sms.SmsCodeProperties;
|
||||||
|
import com.baomidou.mybatisplus.annotation.DbType;
|
||||||
|
import org.junit.jupiter.api.BeforeEach;
|
||||||
|
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.time.Duration;
|
||||||
|
import java.time.LocalDateTime;
|
||||||
|
|
||||||
|
import static cn.hutool.core.util.RandomUtil.randomEle;
|
||||||
|
import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertPojoEquals;
|
||||||
|
import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertServiceException;
|
||||||
|
import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomPojo;
|
||||||
|
import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.*;
|
||||||
|
import static org.junit.jupiter.api.Assertions.*;
|
||||||
|
import static org.mockito.ArgumentMatchers.eq;
|
||||||
|
import static org.mockito.ArgumentMatchers.isNull;
|
||||||
|
import static org.mockito.Mockito.verify;
|
||||||
|
import static org.mockito.Mockito.when;
|
||||||
|
|
||||||
|
@Import(SmsCodeServiceImpl.class)
|
||||||
|
public class SmsCodeServiceImplTest extends BaseDbUnitTest {
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private SmsCodeServiceImpl smsCodeService;
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private SmsCodeMapper smsCodeMapper;
|
||||||
|
|
||||||
|
@MockBean
|
||||||
|
private SmsCodeProperties smsCodeProperties;
|
||||||
|
@MockBean
|
||||||
|
private SmsSendService smsSendService;
|
||||||
|
|
||||||
|
@BeforeEach
|
||||||
|
public void setUp() {
|
||||||
|
when(smsCodeProperties.getExpireTimes()).thenReturn(Duration.ofMinutes(5));
|
||||||
|
when(smsCodeProperties.getSendFrequency()).thenReturn(Duration.ofMinutes(1));
|
||||||
|
when(smsCodeProperties.getSendMaximumQuantityPerDay()).thenReturn(10);
|
||||||
|
when(smsCodeProperties.getBeginCode()).thenReturn(9999);
|
||||||
|
when(smsCodeProperties.getEndCode()).thenReturn(9999);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void sendSmsCode_success() {
|
||||||
|
// 准备参数
|
||||||
|
SmsCodeSendReqDTO reqDTO = randomPojo(SmsCodeSendReqDTO.class, o -> {
|
||||||
|
o.setMobile("15601691300");
|
||||||
|
o.setScene(SmsSceneEnum.MEMBER_LOGIN.getScene());
|
||||||
|
});
|
||||||
|
// mock 方法
|
||||||
|
SqlConstants.init(DbType.MYSQL);
|
||||||
|
|
||||||
|
// 调用
|
||||||
|
smsCodeService.sendSmsCode(reqDTO);
|
||||||
|
// 断言 code 验证码
|
||||||
|
SmsCodeDO smsCodeDO = smsCodeMapper.selectOne(null);
|
||||||
|
assertPojoEquals(reqDTO, smsCodeDO);
|
||||||
|
assertEquals("9999", smsCodeDO.getCode());
|
||||||
|
assertEquals(1, smsCodeDO.getTodayIndex());
|
||||||
|
assertFalse(smsCodeDO.getUsed());
|
||||||
|
// 断言调用
|
||||||
|
verify(smsSendService).sendSingleSms(eq(reqDTO.getMobile()), isNull(), isNull(),
|
||||||
|
eq("user-sms-login"), eq(MapUtil.of("code", "9999")));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void sendSmsCode_tooFast() {
|
||||||
|
// mock 数据
|
||||||
|
SmsCodeDO smsCodeDO = randomPojo(SmsCodeDO.class,
|
||||||
|
o -> o.setMobile("15601691300").setTodayIndex(1));
|
||||||
|
smsCodeMapper.insert(smsCodeDO);
|
||||||
|
// 准备参数
|
||||||
|
SmsCodeSendReqDTO reqDTO = randomPojo(SmsCodeSendReqDTO.class, o -> {
|
||||||
|
o.setMobile("15601691300");
|
||||||
|
o.setScene(SmsSceneEnum.MEMBER_LOGIN.getScene());
|
||||||
|
});
|
||||||
|
// mock 方法
|
||||||
|
SqlConstants.init(DbType.MYSQL);
|
||||||
|
|
||||||
|
// 调用,并断言异常
|
||||||
|
assertServiceException(() -> smsCodeService.sendSmsCode(reqDTO),
|
||||||
|
SMS_CODE_SEND_TOO_FAST);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void sendSmsCode_exceedDay() {
|
||||||
|
// mock 数据
|
||||||
|
SmsCodeDO smsCodeDO = randomPojo(SmsCodeDO.class,
|
||||||
|
o -> o.setMobile("15601691300").setTodayIndex(10).setCreateTime(LocalDateTime.now()));
|
||||||
|
smsCodeMapper.insert(smsCodeDO);
|
||||||
|
// 准备参数
|
||||||
|
SmsCodeSendReqDTO reqDTO = randomPojo(SmsCodeSendReqDTO.class, o -> {
|
||||||
|
o.setMobile("15601691300");
|
||||||
|
o.setScene(SmsSceneEnum.MEMBER_LOGIN.getScene());
|
||||||
|
});
|
||||||
|
// mock 方法
|
||||||
|
SqlConstants.init(DbType.MYSQL);
|
||||||
|
when(smsCodeProperties.getSendFrequency()).thenReturn(Duration.ofMillis(0));
|
||||||
|
|
||||||
|
// 调用,并断言异常
|
||||||
|
assertServiceException(() -> smsCodeService.sendSmsCode(reqDTO),
|
||||||
|
SMS_CODE_EXCEED_SEND_MAXIMUM_QUANTITY_PER_DAY);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testUseSmsCode_success() {
|
||||||
|
// 准备参数
|
||||||
|
SmsCodeUseReqDTO reqDTO = randomPojo(SmsCodeUseReqDTO.class, o -> {
|
||||||
|
o.setMobile("15601691300");
|
||||||
|
o.setScene(randomEle(SmsSceneEnum.values()).getScene());
|
||||||
|
});
|
||||||
|
// mock 数据
|
||||||
|
SqlConstants.init(DbType.MYSQL);
|
||||||
|
smsCodeMapper.insert(randomPojo(SmsCodeDO.class, o -> {
|
||||||
|
o.setMobile(reqDTO.getMobile()).setScene(reqDTO.getScene())
|
||||||
|
.setCode(reqDTO.getCode()).setUsed(false);
|
||||||
|
}));
|
||||||
|
|
||||||
|
// 调用
|
||||||
|
smsCodeService.useSmsCode(reqDTO);
|
||||||
|
// 断言
|
||||||
|
SmsCodeDO smsCodeDO = smsCodeMapper.selectOne(null);
|
||||||
|
assertTrue(smsCodeDO.getUsed());
|
||||||
|
assertNotNull(smsCodeDO.getUsedTime());
|
||||||
|
assertEquals(reqDTO.getUsedIp(), smsCodeDO.getUsedIp());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void validateSmsCode_success() {
|
||||||
|
// 准备参数
|
||||||
|
SmsCodeValidateReqDTO reqDTO = randomPojo(SmsCodeValidateReqDTO.class, o -> {
|
||||||
|
o.setMobile("15601691300");
|
||||||
|
o.setScene(randomEle(SmsSceneEnum.values()).getScene());
|
||||||
|
});
|
||||||
|
// mock 数据
|
||||||
|
SqlConstants.init(DbType.MYSQL);
|
||||||
|
smsCodeMapper.insert(randomPojo(SmsCodeDO.class, o -> o.setMobile(reqDTO.getMobile())
|
||||||
|
.setScene(reqDTO.getScene()).setCode(reqDTO.getCode()).setUsed(false)));
|
||||||
|
|
||||||
|
// 调用
|
||||||
|
smsCodeService.validateSmsCode(reqDTO);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void validateSmsCode_notFound() {
|
||||||
|
// 准备参数
|
||||||
|
SmsCodeValidateReqDTO reqDTO = randomPojo(SmsCodeValidateReqDTO.class, o -> {
|
||||||
|
o.setMobile("15601691300");
|
||||||
|
o.setScene(randomEle(SmsSceneEnum.values()).getScene());
|
||||||
|
});
|
||||||
|
// mock 数据
|
||||||
|
SqlConstants.init(DbType.MYSQL);
|
||||||
|
|
||||||
|
// 调用,并断言异常
|
||||||
|
assertServiceException(() -> smsCodeService.validateSmsCode(reqDTO),
|
||||||
|
SMS_CODE_NOT_FOUND);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void validateSmsCode_expired() {
|
||||||
|
// 准备参数
|
||||||
|
SmsCodeValidateReqDTO reqDTO = randomPojo(SmsCodeValidateReqDTO.class, o -> {
|
||||||
|
o.setMobile("15601691300");
|
||||||
|
o.setScene(randomEle(SmsSceneEnum.values()).getScene());
|
||||||
|
});
|
||||||
|
// mock 数据
|
||||||
|
SqlConstants.init(DbType.MYSQL);
|
||||||
|
smsCodeMapper.insert(randomPojo(SmsCodeDO.class, o -> o.setMobile(reqDTO.getMobile())
|
||||||
|
.setScene(reqDTO.getScene()).setCode(reqDTO.getCode()).setUsed(false)
|
||||||
|
.setCreateTime(LocalDateTime.now().minusMinutes(6))));
|
||||||
|
|
||||||
|
// 调用,并断言异常
|
||||||
|
assertServiceException(() -> smsCodeService.validateSmsCode(reqDTO),
|
||||||
|
SMS_CODE_EXPIRED);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void validateSmsCode_used() {
|
||||||
|
// 准备参数
|
||||||
|
SmsCodeValidateReqDTO reqDTO = randomPojo(SmsCodeValidateReqDTO.class, o -> {
|
||||||
|
o.setMobile("15601691300");
|
||||||
|
o.setScene(randomEle(SmsSceneEnum.values()).getScene());
|
||||||
|
});
|
||||||
|
// mock 数据
|
||||||
|
SqlConstants.init(DbType.MYSQL);
|
||||||
|
smsCodeMapper.insert(randomPojo(SmsCodeDO.class, o -> o.setMobile(reqDTO.getMobile())
|
||||||
|
.setScene(reqDTO.getScene()).setCode(reqDTO.getCode()).setUsed(true)
|
||||||
|
.setCreateTime(LocalDateTime.now())));
|
||||||
|
|
||||||
|
// 调用,并断言异常
|
||||||
|
assertServiceException(() -> smsCodeService.validateSmsCode(reqDTO),
|
||||||
|
SMS_CODE_USED);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -34,7 +34,7 @@ import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||||
import static org.junit.jupiter.api.Assertions.assertNotNull;
|
import static org.junit.jupiter.api.Assertions.assertNotNull;
|
||||||
|
|
||||||
@Import(SmsLogServiceImpl.class)
|
@Import(SmsLogServiceImpl.class)
|
||||||
public class SmsLogServiceTest extends BaseDbUnitTest {
|
public class SmsLogServiceImplTest extends BaseDbUnitTest {
|
||||||
|
|
||||||
@Resource
|
@Resource
|
||||||
private SmsLogServiceImpl smsLogService;
|
private SmsLogServiceImpl smsLogService;
|
|
@ -34,7 +34,7 @@ import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||||
import static org.mockito.ArgumentMatchers.eq;
|
import static org.mockito.ArgumentMatchers.eq;
|
||||||
import static org.mockito.Mockito.*;
|
import static org.mockito.Mockito.*;
|
||||||
|
|
||||||
public class SmsSendServiceTest extends BaseMockitoUnitTest {
|
public class SmsSendServiceImplTest extends BaseMockitoUnitTest {
|
||||||
|
|
||||||
@InjectMocks
|
@InjectMocks
|
||||||
private SmsSendServiceImpl smsService;
|
private SmsSendServiceImpl smsService;
|
|
@ -30,9 +30,7 @@ import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.function.Consumer;
|
import java.util.function.Consumer;
|
||||||
|
|
||||||
import static cn.hutool.core.bean.BeanUtil.getFieldValue;
|
|
||||||
import static cn.hutool.core.util.RandomUtil.randomEle;
|
import static cn.hutool.core.util.RandomUtil.randomEle;
|
||||||
import static cn.iocoder.yudao.framework.common.util.object.ObjectUtils.max;
|
|
||||||
import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.*;
|
import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.*;
|
||||||
import static cn.iocoder.yudao.framework.common.util.date.LocalDateTimeUtils.buildTime;
|
import static cn.iocoder.yudao.framework.common.util.date.LocalDateTimeUtils.buildTime;
|
||||||
import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertPojoEquals;
|
import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertPojoEquals;
|
||||||
|
@ -43,7 +41,7 @@ import static org.mockito.ArgumentMatchers.eq;
|
||||||
import static org.mockito.Mockito.*;
|
import static org.mockito.Mockito.*;
|
||||||
|
|
||||||
@Import(SmsTemplateServiceImpl.class)
|
@Import(SmsTemplateServiceImpl.class)
|
||||||
public class SmsTemplateServiceTest extends BaseDbUnitTest {
|
public class SmsTemplateServiceImplTest extends BaseDbUnitTest {
|
||||||
|
|
||||||
@Resource
|
@Resource
|
||||||
private SmsTemplateServiceImpl smsTemplateService;
|
private SmsTemplateServiceImpl smsTemplateService;
|
|
@ -14,6 +14,7 @@ DELETE FROM "system_users";
|
||||||
DELETE FROM "system_sms_channel";
|
DELETE FROM "system_sms_channel";
|
||||||
DELETE FROM "system_sms_template";
|
DELETE FROM "system_sms_template";
|
||||||
DELETE FROM "system_sms_log";
|
DELETE FROM "system_sms_log";
|
||||||
|
DELETE FROM "system_sms_code";
|
||||||
DELETE FROM "system_error_code";
|
DELETE FROM "system_error_code";
|
||||||
DELETE FROM "system_social_user";
|
DELETE FROM "system_social_user";
|
||||||
DELETE FROM "system_social_user_bind";
|
DELETE FROM "system_social_user_bind";
|
||||||
|
|
|
@ -377,6 +377,24 @@ CREATE TABLE IF NOT EXISTS "system_sms_log" (
|
||||||
PRIMARY KEY ("id")
|
PRIMARY KEY ("id")
|
||||||
) COMMENT '短信日志';
|
) COMMENT '短信日志';
|
||||||
|
|
||||||
|
CREATE TABLE IF NOT EXISTS "system_sms_code" (
|
||||||
|
"id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY,
|
||||||
|
"mobile" varchar(11) NOT NULL,
|
||||||
|
"code" varchar(11) NOT NULL,
|
||||||
|
"scene" bigint NOT NULL,
|
||||||
|
"create_ip" varchar NOT NULL,
|
||||||
|
"today_index" int NOT NULL,
|
||||||
|
"used" bit NOT NULL DEFAULT FALSE,
|
||||||
|
"used_time" timestamp DEFAULT NULL,
|
||||||
|
"used_ip" varchar NULL,
|
||||||
|
"creator" varchar(64) DEFAULT '',
|
||||||
|
"create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||||
|
"updater" varchar(64) DEFAULT '',
|
||||||
|
"update_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||||
|
"deleted" bit NOT NULL DEFAULT FALSE,
|
||||||
|
PRIMARY KEY ("id")
|
||||||
|
) COMMENT '短信日志';
|
||||||
|
|
||||||
CREATE TABLE IF NOT EXISTS "system_error_code" (
|
CREATE TABLE IF NOT EXISTS "system_error_code" (
|
||||||
"id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY,
|
"id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY,
|
||||||
"type" tinyint NOT NULL DEFAULT '0',
|
"type" tinyint NOT NULL DEFAULT '0',
|
||||||
|
|
Loading…
Reference in New Issue