Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
Y
yudao-cloud
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
图表
比较
统计图
议题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
hblj
yudao-cloud
Commits
ac25dbe2
提交
ac25dbe2
authored
2月 02, 2023
作者:
YunaiV
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
完善 SmsCodeServiceImpl 单元测试
上级
5a18223b
全部展开
显示空白字符变更
内嵌
并排
正在显示
12 个修改的文件
包含
263 行增加
和
40 行删除
+263
-40
SmsCodeApi.java
...va/cn/iocoder/yudao/module/system/api/sms/SmsCodeApi.java
+3
-3
SmsCodeValidateReqDTO.java
...module/system/api/sms/dto/code/SmsCodeValidateReqDTO.java
+1
-1
SmsCodeApiImpl.java
...n/iocoder/yudao/module/system/api/sms/SmsCodeApiImpl.java
+3
-3
SmsCodeService.java
...coder/yudao/module/system/service/sms/SmsCodeService.java
+2
-2
SmsCodeServiceImpl.java
...r/yudao/module/system/service/sms/SmsCodeServiceImpl.java
+14
-16
SmsChannelServiceTest.java
...udao/module/system/service/sms/SmsChannelServiceTest.java
+0
-1
SmsCodeServiceImplTest.java
...dao/module/system/service/sms/SmsCodeServiceImplTest.java
+209
-0
SmsLogServiceImplTest.java
...udao/module/system/service/sms/SmsLogServiceImplTest.java
+1
-1
SmsSendServiceTest.java
...r/yudao/module/system/service/sms/SmsSendServiceTest.java
+0
-0
SmsTemplateServiceImplTest.java
...module/system/service/sms/SmsTemplateServiceImplTest.java
+11
-13
clean.sql
.../yudao-module-system-biz/src/test/resources/sql/clean.sql
+1
-0
create_tables.sql
...odule-system-biz/src/test/resources/sql/create_tables.sql
+18
-0
没有找到文件。
yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/sms/SmsCodeApi.java
浏览文件 @
ac25dbe2
package
cn
.
iocoder
.
yudao
.
module
.
system
.
api
.
sms
;
package
cn
.
iocoder
.
yudao
.
module
.
system
.
api
.
sms
;
import
cn.iocoder.yudao.framework.common.pojo.CommonResult
;
import
cn.iocoder.yudao.framework.common.pojo.CommonResult
;
import
cn.iocoder.yudao.module.system.api.sms.dto.code.SmsCode
Check
ReqDTO
;
import
cn.iocoder.yudao.module.system.api.sms.dto.code.SmsCode
Validate
ReqDTO
;
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.enums.ApiConstants
;
import
cn.iocoder.yudao.module.system.enums.ApiConstants
;
...
@@ -29,8 +29,8 @@ public interface SmsCodeApi {
...
@@ -29,8 +29,8 @@ public interface SmsCodeApi {
@ApiOperation
(
"验证短信验证码,并进行使用"
)
@ApiOperation
(
"验证短信验证码,并进行使用"
)
CommonResult
<
Boolean
>
useSmsCode
(
@Valid
@RequestBody
SmsCodeUseReqDTO
reqDTO
);
CommonResult
<
Boolean
>
useSmsCode
(
@Valid
@RequestBody
SmsCodeUseReqDTO
reqDTO
);
@GetMapping
(
PREFIX
+
"/
check
"
)
@GetMapping
(
PREFIX
+
"/
validate
"
)
@ApiOperation
(
"检查验证码是否有效"
)
@ApiOperation
(
"检查验证码是否有效"
)
CommonResult
<
Boolean
>
checkSmsCode
(
@Valid
@RequestBody
SmsCodeCheck
ReqDTO
reqDTO
);
CommonResult
<
Boolean
>
validateSmsCode
(
@Valid
@RequestBody
SmsCodeValidate
ReqDTO
reqDTO
);
}
}
yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/sms/dto/code/SmsCode
Check
ReqDTO.java
→
yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/sms/dto/code/SmsCode
Validate
ReqDTO.java
浏览文件 @
ac25dbe2
...
@@ -12,7 +12,7 @@ import javax.validation.constraints.NotNull;
...
@@ -12,7 +12,7 @@ import javax.validation.constraints.NotNull;
@ApiModel
(
"RPC 服务 - 短信验证码的校验 Request DTO"
)
@ApiModel
(
"RPC 服务 - 短信验证码的校验 Request DTO"
)
@Data
@Data
public
class
SmsCode
Check
ReqDTO
{
public
class
SmsCode
Validate
ReqDTO
{
@ApiModelProperty
(
value
=
"手机号"
,
required
=
true
,
example
=
"15601691300"
)
@ApiModelProperty
(
value
=
"手机号"
,
required
=
true
,
example
=
"15601691300"
)
@Mobile
@Mobile
...
...
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/api/sms/SmsCodeApiImpl.java
浏览文件 @
ac25dbe2
package
cn
.
iocoder
.
yudao
.
module
.
system
.
api
.
sms
;
package
cn
.
iocoder
.
yudao
.
module
.
system
.
api
.
sms
;
import
cn.iocoder.yudao.framework.common.pojo.CommonResult
;
import
cn.iocoder.yudao.framework.common.pojo.CommonResult
;
import
cn.iocoder.yudao.module.system.api.sms.dto.code.SmsCode
Check
ReqDTO
;
import
cn.iocoder.yudao.module.system.api.sms.dto.code.SmsCode
Validate
ReqDTO
;
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
;
...
@@ -35,8 +35,8 @@ public class SmsCodeApiImpl implements SmsCodeApi {
...
@@ -35,8 +35,8 @@ public class SmsCodeApiImpl implements SmsCodeApi {
}
}
@Override
@Override
public
CommonResult
<
Boolean
>
checkSmsCode
(
SmsCodeCheck
ReqDTO
reqDTO
)
{
public
CommonResult
<
Boolean
>
validateSmsCode
(
SmsCodeValidate
ReqDTO
reqDTO
)
{
smsCodeService
.
check
SmsCode
(
reqDTO
);
smsCodeService
.
validate
SmsCode
(
reqDTO
);
return
success
(
true
);
return
success
(
true
);
}
}
...
...
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/sms/SmsCodeService.java
浏览文件 @
ac25dbe2
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.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
javax.validation.Valid
;
import
javax.validation.Valid
;
...
@@ -35,6 +35,6 @@ public interface SmsCodeService {
...
@@ -35,6 +35,6 @@ public interface SmsCodeService {
*
*
* @param reqDTO 校验请求
* @param reqDTO 校验请求
*/
*/
void
checkSmsCode
(
@Valid
SmsCodeCheck
ReqDTO
reqDTO
);
void
validateSmsCode
(
@Valid
SmsCodeValidate
ReqDTO
reqDTO
);
}
}
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/sms/SmsCodeServiceImpl.java
浏览文件 @
ac25dbe2
...
@@ -3,11 +3,9 @@ package cn.iocoder.yudao.module.system.service.sms;
...
@@ -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;
...
@@ -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 {
...
@@ -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 {
...
@@ -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 {
...
@@ -80,32 +78,32 @@ public class SmsCodeServiceImpl implements SmsCodeService {
@Override
@Override
public
void
useSmsCode
(
SmsCodeUseReqDTO
reqDTO
)
{
public
void
useSmsCode
(
SmsCodeUseReqDTO
reqDTO
)
{
// 检测验证码是否有效
// 检测验证码是否有效
SmsCodeDO
lastSmsCode
=
this
.
check
SmsCode0
(
reqDTO
.
getMobile
(),
reqDTO
.
getCode
(),
reqDTO
.
getScene
());
SmsCodeDO
lastSmsCode
=
validate
SmsCode0
(
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
(
SmsCodeCheck
ReqDTO
reqDTO
)
{
public
void
validateSmsCode
(
SmsCodeValidate
ReqDTO
reqDTO
)
{
check
SmsCode0
(
reqDTO
.
getMobile
(),
reqDTO
.
getCode
(),
reqDTO
.
getScene
());
validate
SmsCode0
(
reqDTO
.
getMobile
(),
reqDTO
.
getCode
(),
reqDTO
.
getScene
());
}
}
p
ublic
SmsCodeDO
check
SmsCode0
(
String
mobile
,
String
code
,
Integer
scene
)
{
p
rivate
SmsCodeDO
validate
SmsCode0
(
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
;
}
}
...
...
yudao-module-system/yudao-module-system-biz/src/test/java/cn/iocoder/yudao/module/system/service/sms/SmsChannelServiceTest.java
浏览文件 @
ac25dbe2
...
@@ -15,7 +15,6 @@ import org.springframework.boot.test.mock.mockito.MockBean;
...
@@ -15,7 +15,6 @@ import org.springframework.boot.test.mock.mockito.MockBean;
import
org.springframework.context.annotation.Import
;
import
org.springframework.context.annotation.Import
;
import
javax.annotation.Resource
;
import
javax.annotation.Resource
;
import
java.util.List
;
import
java.util.List
;
import
static
cn
.
iocoder
.
yudao
.
framework
.
common
.
util
.
date
.
LocalDateTimeUtils
.
buildBetweenTime
;
import
static
cn
.
iocoder
.
yudao
.
framework
.
common
.
util
.
date
.
LocalDateTimeUtils
.
buildBetweenTime
;
...
...
yudao-module-system/yudao-module-system-biz/src/test/java/cn/iocoder/yudao/module/system/service/sms/SmsCodeServiceImplTest.java
0 → 100644
浏览文件 @
ac25dbe2
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
);
}
}
yudao-module-system/yudao-module-system-biz/src/test/java/cn/iocoder/yudao/module/system/service/sms/SmsLogServiceTest.java
→
yudao-module-system/yudao-module-system-biz/src/test/java/cn/iocoder/yudao/module/system/service/sms/SmsLogService
Impl
Test.java
浏览文件 @
ac25dbe2
...
@@ -34,7 +34,7 @@ import static org.junit.jupiter.api.Assertions.assertEquals;
...
@@ -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
SmsLogService
Impl
Test
extends
BaseDbUnitTest
{
@Resource
@Resource
private
SmsLogServiceImpl
smsLogService
;
private
SmsLogServiceImpl
smsLogService
;
...
...
yudao-module-system/yudao-module-system-biz/src/test/java/cn/iocoder/yudao/module/system/service/sms/SmsSendServiceTest.java
deleted
100644 → 0
浏览文件 @
5a18223b
差异被折叠。
点击展开。
yudao-module-system/yudao-module-system-biz/src/test/java/cn/iocoder/yudao/module/system/service/sms/SmsTemplateServiceTest.java
→
yudao-module-system/yudao-module-system-biz/src/test/java/cn/iocoder/yudao/module/system/service/sms/SmsTemplateService
Impl
Test.java
浏览文件 @
ac25dbe2
package
cn
.
iocoder
.
yudao
.
module
.
system
.
service
.
sms
;
package
cn
.
iocoder
.
yudao
.
module
.
system
.
service
.
sms
;
import
cn.iocoder.yudao.module.system.controller.admin.sms.vo.template.SmsTemplateCreateReqVO
;
import
cn.iocoder.yudao.module.system.controller.admin.sms.vo.template.SmsTemplateExportReqVO
;
import
cn.iocoder.yudao.module.system.controller.admin.sms.vo.template.SmsTemplatePageReqVO
;
import
cn.iocoder.yudao.module.system.controller.admin.sms.vo.template.SmsTemplateUpdateReqVO
;
import
cn.iocoder.yudao.module.system.dal.dataobject.sms.SmsChannelDO
;
import
cn.iocoder.yudao.module.system.dal.dataobject.sms.SmsTemplateDO
;
import
cn.iocoder.yudao.module.system.dal.mysql.sms.SmsTemplateMapper
;
import
cn.iocoder.yudao.module.system.mq.producer.sms.SmsProducer
;
import
cn.iocoder.yudao.module.system.enums.sms.SmsTemplateTypeEnum
;
import
cn.iocoder.yudao.framework.common.enums.CommonStatusEnum
;
import
cn.iocoder.yudao.framework.common.enums.CommonStatusEnum
;
import
cn.iocoder.yudao.framework.common.exception.enums.GlobalErrorCodeConstants
;
import
cn.iocoder.yudao.framework.common.exception.enums.GlobalErrorCodeConstants
;
import
cn.iocoder.yudao.framework.common.pojo.PageResult
;
import
cn.iocoder.yudao.framework.common.pojo.PageResult
;
...
@@ -19,6 +10,15 @@ import cn.iocoder.yudao.framework.sms.core.client.SmsClientFactory;
...
@@ -19,6 +10,15 @@ import cn.iocoder.yudao.framework.sms.core.client.SmsClientFactory;
import
cn.iocoder.yudao.framework.sms.core.client.SmsCommonResult
;
import
cn.iocoder.yudao.framework.sms.core.client.SmsCommonResult
;
import
cn.iocoder.yudao.framework.sms.core.client.dto.SmsTemplateRespDTO
;
import
cn.iocoder.yudao.framework.sms.core.client.dto.SmsTemplateRespDTO
;
import
cn.iocoder.yudao.framework.test.core.ut.BaseDbUnitTest
;
import
cn.iocoder.yudao.framework.test.core.ut.BaseDbUnitTest
;
import
cn.iocoder.yudao.module.system.controller.admin.sms.vo.template.SmsTemplateCreateReqVO
;
import
cn.iocoder.yudao.module.system.controller.admin.sms.vo.template.SmsTemplateExportReqVO
;
import
cn.iocoder.yudao.module.system.controller.admin.sms.vo.template.SmsTemplatePageReqVO
;
import
cn.iocoder.yudao.module.system.controller.admin.sms.vo.template.SmsTemplateUpdateReqVO
;
import
cn.iocoder.yudao.module.system.dal.dataobject.sms.SmsChannelDO
;
import
cn.iocoder.yudao.module.system.dal.dataobject.sms.SmsTemplateDO
;
import
cn.iocoder.yudao.module.system.dal.mysql.sms.SmsTemplateMapper
;
import
cn.iocoder.yudao.module.system.enums.sms.SmsTemplateTypeEnum
;
import
cn.iocoder.yudao.module.system.mq.producer.sms.SmsProducer
;
import
com.google.common.collect.Lists
;
import
com.google.common.collect.Lists
;
import
org.junit.jupiter.api.Test
;
import
org.junit.jupiter.api.Test
;
import
org.springframework.boot.test.mock.mockito.MockBean
;
import
org.springframework.boot.test.mock.mockito.MockBean
;
...
@@ -30,20 +30,18 @@ import java.util.List;
...
@@ -30,20 +30,18 @@ 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
.
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
;
import
static
cn
.
iocoder
.
yudao
.
framework
.
test
.
core
.
util
.
AssertUtils
.
assertServiceException
;
import
static
cn
.
iocoder
.
yudao
.
framework
.
test
.
core
.
util
.
AssertUtils
.
assertServiceException
;
import
static
cn
.
iocoder
.
yudao
.
framework
.
test
.
core
.
util
.
RandomUtils
.*;
import
static
cn
.
iocoder
.
yudao
.
framework
.
test
.
core
.
util
.
RandomUtils
.*;
import
static
cn
.
iocoder
.
yudao
.
module
.
system
.
enums
.
ErrorCodeConstants
.*;
import
static
org
.
junit
.
jupiter
.
api
.
Assertions
.*;
import
static
org
.
junit
.
jupiter
.
api
.
Assertions
.*;
import
static
org
.
mockito
.
ArgumentMatchers
.
eq
;
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
SmsTemplateService
Impl
Test
extends
BaseDbUnitTest
{
@Resource
@Resource
private
SmsTemplateServiceImpl
smsTemplateService
;
private
SmsTemplateServiceImpl
smsTemplateService
;
...
...
yudao-module-system/yudao-module-system-biz/src/test/resources/sql/clean.sql
浏览文件 @
ac25dbe2
...
@@ -14,6 +14,7 @@ DELETE FROM "system_users";
...
@@ -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"
;
...
...
yudao-module-system/yudao-module-system-biz/src/test/resources/sql/create_tables.sql
浏览文件 @
ac25dbe2
...
@@ -377,6 +377,24 @@ CREATE TABLE IF NOT EXISTS "system_sms_log" (
...
@@ -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'
,
...
...
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论