You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

43 lines
2.0 KiB

package com.mydreamjob.auth;
import com.mydreamjob.audit.AuditService;
import com.mydreamjob.auth.sms.SmsCodeSender;
import com.mydreamjob.common.exception.BusinessException;
import com.mydreamjob.common.exception.ErrorCode;
import org.junit.jupiter.api.Test;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.ValueOperations;
import java.util.concurrent.TimeUnit;
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatThrownBy;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
class SmsSendRateLimitAtomicityTest {
@Test
@SuppressWarnings("unchecked")
void losingAtomicRedisReservationNeverPersistsOrSendsAnotherCode() {
SmsVerificationCodeRepository codes = mock(SmsVerificationCodeRepository.class);
RedisTemplate<String, Object> redis = mock(RedisTemplate.class);
ValueOperations<String, Object> values = mock(ValueOperations.class);
SmsCodeSender sender = mock(SmsCodeSender.class);
SmsVerificationService service = new SmsVerificationService(codes, redis,
mock(AuditService.class), sender, mock(SmsFailedAttemptRecorder.class));
when(redis.opsForValue()).thenReturn(values);
when(values.setIfAbsent("sms:rate:19900009682", "1", 60L, TimeUnit.SECONDS))
.thenReturn(false);
assertThatThrownBy(() -> service.sendCode("19900009682", "login", null, null, null))
.isInstanceOf(BusinessException.class)
.satisfies(error -> assertThat(((BusinessException) error).getErrorCodeInt())
.isEqualTo(ErrorCode.SMS_RATE_LIMITED.getCode()));
verify(codes, never()).save(any());
verify(sender, never()).sendVerificationCode(any(), any(), any());
}
}