mirror of
				https://gitee.com/hhyykk/ipms-sjy.git
				synced 2025-11-01 02:38:43 +08:00 
			
		
		
		
	完善 SmsCodeServiceImpl 单元测试
This commit is contained in:
		| @@ -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(SmsLogServiceImpl.class) | ||||
| public class SmsLogServiceTest extends BaseDbUnitTest { | ||||
| public class SmsLogServiceImplTest extends BaseDbUnitTest { | ||||
| 
 | ||||
|     @Resource | ||||
|     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.Mockito.*; | ||||
| 
 | ||||
| public class SmsSendServiceTest extends BaseMockitoUnitTest { | ||||
| public class SmsSendServiceImplTest extends BaseMockitoUnitTest { | ||||
| 
 | ||||
|     @InjectMocks | ||||
|     private SmsSendServiceImpl smsService; | ||||
| @@ -30,9 +30,7 @@ import java.util.List; | ||||
| import java.util.Map; | ||||
| import java.util.function.Consumer; | ||||
| 
 | ||||
| import static cn.hutool.core.bean.BeanUtil.getFieldValue; | ||||
| 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.test.core.util.AssertUtils.assertPojoEquals; | ||||
| @@ -43,7 +41,7 @@ import static org.mockito.ArgumentMatchers.eq; | ||||
| import static org.mockito.Mockito.*; | ||||
| 
 | ||||
| @Import(SmsTemplateServiceImpl.class) | ||||
| public class SmsTemplateServiceTest extends BaseDbUnitTest { | ||||
| public class SmsTemplateServiceImplTest extends BaseDbUnitTest { | ||||
| 
 | ||||
|     @Resource | ||||
|     private SmsTemplateServiceImpl smsTemplateService; | ||||
| @@ -14,6 +14,7 @@ DELETE FROM "system_users"; | ||||
| DELETE FROM "system_sms_channel"; | ||||
| DELETE FROM "system_sms_template"; | ||||
| DELETE FROM "system_sms_log"; | ||||
| DELETE FROM "system_sms_code"; | ||||
| DELETE FROM "system_error_code"; | ||||
| DELETE FROM "system_social_user"; | ||||
| DELETE FROM "system_social_user_bind"; | ||||
|   | ||||
| @@ -377,6 +377,24 @@ CREATE TABLE IF NOT EXISTS "system_sms_log" ( | ||||
|    PRIMARY KEY ("id") | ||||
| ) 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" ( | ||||
|   "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, | ||||
|   "type" tinyint NOT NULL DEFAULT '0', | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 YunaiV
					YunaiV