2025-11-24 12:29:32 +07:00
|
|
|
package ru.soune.no_copy.service;
|
|
|
|
|
|
|
|
|
|
import org.junit.jupiter.api.BeforeEach;
|
|
|
|
|
import org.junit.jupiter.api.Test;
|
2025-11-25 11:59:37 +07:00
|
|
|
import org.mockito.ArgumentCaptor;
|
2025-11-24 12:29:32 +07:00
|
|
|
import org.mockito.InjectMocks;
|
|
|
|
|
import org.mockito.Mock;
|
|
|
|
|
import org.mockito.MockitoAnnotations;
|
|
|
|
|
import org.springframework.context.MessageSource;
|
|
|
|
|
import org.springframework.security.crypto.password.PasswordEncoder;
|
2025-11-25 11:59:37 +07:00
|
|
|
import ru.soune.no_copy.dto.LoginRequest;
|
2025-11-24 12:29:32 +07:00
|
|
|
import ru.soune.no_copy.dto.RegisterRequest;
|
|
|
|
|
import ru.soune.no_copy.entity.AuthToken;
|
|
|
|
|
import ru.soune.no_copy.entity.User;
|
2025-11-25 11:59:37 +07:00
|
|
|
import ru.soune.no_copy.exception.NotValidationPasswordException;
|
2025-11-24 12:29:32 +07:00
|
|
|
import ru.soune.no_copy.exception.UserAlreadyExistsException;
|
2025-11-25 11:59:37 +07:00
|
|
|
import ru.soune.no_copy.exception.UserNotFoundException;
|
2025-11-24 12:29:32 +07:00
|
|
|
import ru.soune.no_copy.repository.AuthTokenRepository;
|
|
|
|
|
import ru.soune.no_copy.repository.UserRepository;
|
|
|
|
|
|
|
|
|
|
import java.util.Locale;
|
2025-11-25 11:59:37 +07:00
|
|
|
import java.util.Optional;
|
2025-11-24 12:29:32 +07:00
|
|
|
|
|
|
|
|
import static org.junit.jupiter.api.Assertions.*;
|
|
|
|
|
import static org.mockito.ArgumentMatchers.any;
|
|
|
|
|
import static org.mockito.ArgumentMatchers.anyString;
|
2025-11-25 11:59:37 +07:00
|
|
|
import static org.mockito.Mockito.verify;
|
2025-11-24 12:29:32 +07:00
|
|
|
import static org.mockito.Mockito.when;
|
|
|
|
|
|
2025-11-24 21:04:50 +07:00
|
|
|
public class AuthServiceTest {
|
2025-11-24 12:29:32 +07:00
|
|
|
|
|
|
|
|
@Mock
|
|
|
|
|
private UserRepository userRepository;
|
|
|
|
|
|
|
|
|
|
@Mock
|
|
|
|
|
private AuthTokenRepository authTokenRepository;
|
|
|
|
|
|
|
|
|
|
@Mock
|
|
|
|
|
private PasswordEncoder passwordEncoder;
|
|
|
|
|
|
|
|
|
|
@Mock
|
|
|
|
|
private MessageSource messageSource;
|
|
|
|
|
|
|
|
|
|
@InjectMocks
|
|
|
|
|
private AuthService authService;
|
|
|
|
|
|
|
|
|
|
@BeforeEach
|
|
|
|
|
void setUp() {
|
|
|
|
|
MockitoAnnotations.openMocks(this);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Test
|
|
|
|
|
void registerSuccess() {
|
2025-11-25 11:59:37 +07:00
|
|
|
RegisterRequest request = new RegisterRequest("John","A.","Doe",
|
|
|
|
|
"john@example.com", "password123");
|
2025-11-24 12:29:32 +07:00
|
|
|
|
|
|
|
|
when(userRepository.existsByEmail(request.email())).thenReturn(false);
|
|
|
|
|
when(passwordEncoder.encode(request.password())).thenReturn("hashed");
|
|
|
|
|
when(userRepository.save(any(User.class))).thenAnswer(invocation -> invocation.getArgument(0));
|
|
|
|
|
when(authTokenRepository.save(any(AuthToken.class))).thenAnswer(invocation -> invocation.getArgument(0));
|
|
|
|
|
|
|
|
|
|
AuthToken token = authService.register(request);
|
|
|
|
|
User user = token.getUser();
|
|
|
|
|
String email = user.getEmail();
|
|
|
|
|
|
|
|
|
|
assertNotNull(token);
|
|
|
|
|
assertNotNull(token.getToken());
|
|
|
|
|
assertNotNull(token.getUser());
|
|
|
|
|
assertEquals("john@example.com", email);
|
|
|
|
|
assertNotNull(token.getExpiresAt());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Test
|
|
|
|
|
void registerExistingEmailThrows() {
|
2025-11-25 11:59:37 +07:00
|
|
|
RegisterRequest request = new RegisterRequest("John","A.","Doe",
|
|
|
|
|
"john@example.com", "password123");
|
2025-11-24 12:29:32 +07:00
|
|
|
|
2025-11-25 11:59:37 +07:00
|
|
|
when(userRepository.existsByEmail(request.email()))
|
|
|
|
|
.thenReturn(true);
|
|
|
|
|
when(messageSource.getMessage(anyString(), any(), any(Locale.class)))
|
|
|
|
|
.thenReturn("User exists");
|
2025-11-24 12:29:32 +07:00
|
|
|
|
|
|
|
|
UserAlreadyExistsException ex = assertThrows(UserAlreadyExistsException.class,
|
|
|
|
|
() -> authService.register(request));
|
|
|
|
|
|
|
|
|
|
assertEquals("User exists", ex.getMessage());
|
|
|
|
|
}
|
2025-11-25 11:59:37 +07:00
|
|
|
|
|
|
|
|
@Test
|
|
|
|
|
void login_success() {
|
|
|
|
|
LoginRequest request = new LoginRequest("test@mail.com", "password");
|
|
|
|
|
|
|
|
|
|
User user = new User();
|
|
|
|
|
user.setUserId(1L);
|
|
|
|
|
user.setEmail("test@mail.com");
|
|
|
|
|
user.setPassword("encoded_pass");
|
|
|
|
|
|
|
|
|
|
when(userRepository.findByEmail("test@mail.com"))
|
|
|
|
|
.thenReturn(Optional.of(user));
|
|
|
|
|
when(passwordEncoder.matches("password", "encoded_pass"))
|
|
|
|
|
.thenReturn(true);
|
|
|
|
|
when(authTokenRepository.save(any(AuthToken.class)))
|
|
|
|
|
.thenAnswer(invocation -> invocation.getArgument(0));
|
|
|
|
|
|
|
|
|
|
AuthToken token = authService.login(request);
|
|
|
|
|
|
|
|
|
|
assertNotNull(token);
|
|
|
|
|
assertNotNull(token.getToken());
|
|
|
|
|
assertEquals(user, token.getUser());
|
|
|
|
|
|
|
|
|
|
ArgumentCaptor<AuthToken> captor = ArgumentCaptor.forClass(AuthToken.class);
|
|
|
|
|
verify(authTokenRepository).save(captor.capture());
|
|
|
|
|
|
|
|
|
|
assertEquals(user, captor.getValue().getUser());
|
|
|
|
|
assertNotNull(captor.getValue().getToken());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@Test
|
|
|
|
|
void login_userNotFound() {
|
|
|
|
|
LoginRequest request = new LoginRequest("missing@mail.com", "pwd");
|
|
|
|
|
|
|
|
|
|
when(userRepository.findByEmail("missing@mail.com")).thenReturn(Optional.empty());
|
|
|
|
|
|
|
|
|
|
assertThrows(UserNotFoundException.class, () -> authService.login(request));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@Test
|
|
|
|
|
void login_invalidPassword() {
|
|
|
|
|
LoginRequest request = new LoginRequest("test@mail.com", "wrong");
|
|
|
|
|
|
|
|
|
|
User user = new User();
|
|
|
|
|
user.setEmail("test@mail.com");
|
|
|
|
|
user.setPassword("encoded_pass");
|
|
|
|
|
|
|
|
|
|
when(userRepository.findByEmail("test@mail.com")).thenReturn(Optional.of(user));
|
|
|
|
|
when(passwordEncoder.matches("wrong", "encoded_pass")).thenReturn(false);
|
|
|
|
|
|
|
|
|
|
assertThrows(NotValidationPasswordException.class, () -> authService.login(request));
|
|
|
|
|
}
|
2025-11-24 12:29:32 +07:00
|
|
|
}
|