diff --git a/src/main/java/_11/asktpk/artisanconnectbackend/controller/AuthController.java b/src/main/java/_11/asktpk/artisanconnectbackend/controller/AuthController.java index a992a1a..0b5ba48 100644 --- a/src/main/java/_11/asktpk/artisanconnectbackend/controller/AuthController.java +++ b/src/main/java/_11/asktpk/artisanconnectbackend/controller/AuthController.java @@ -3,6 +3,7 @@ package _11.asktpk.artisanconnectbackend.controller; import _11.asktpk.artisanconnectbackend.customExceptions.ClientAlreadyExistsException; import _11.asktpk.artisanconnectbackend.customExceptions.WrongLoginPasswordException; import _11.asktpk.artisanconnectbackend.dto.*; +import _11.asktpk.artisanconnectbackend.security.JwtUtil; import _11.asktpk.artisanconnectbackend.service.AuthService; import jakarta.servlet.http.HttpServletRequest; import lombok.extern.slf4j.Slf4j; @@ -16,9 +17,10 @@ import org.springframework.web.client.HttpClientErrorException; public class AuthController { private final AuthService authService; - - public AuthController(AuthService authService) { + private final JwtUtil jwtUtil; + public AuthController(AuthService authService, JwtUtil jwtUtil) { this.authService = authService; + this.jwtUtil = jwtUtil; } @PostMapping("/login") @@ -94,4 +96,14 @@ public class AuthController { .body(new RequestResponseDTO("Authentication Error (Google): " + e.getMessage())); } } + + @GetMapping("/me") + public ResponseEntity getMe(HttpServletRequest request) { + String authHeader = request.getHeader("Authorization"); + if (authHeader != null && authHeader.startsWith("Bearer ")) { + String token = authHeader.substring(7); + return ResponseEntity.status(HttpStatus.OK).body(new AuthResponseDTO(jwtUtil.extractUserId(token), jwtUtil.extractRole(token), token)); + } + return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(new RequestResponseDTO("Invalid or empty token")); + } } \ No newline at end of file diff --git a/src/test/java/_11/asktpk/artisanconnectbackend/AuthServiceTest.java b/src/test/java/_11/asktpk/artisanconnectbackend/AuthServiceTest.java new file mode 100644 index 0000000..409fc1e --- /dev/null +++ b/src/test/java/_11/asktpk/artisanconnectbackend/AuthServiceTest.java @@ -0,0 +1,120 @@ +package _11.asktpk.artisanconnectbackend; + +import _11.asktpk.artisanconnectbackend.customExceptions.ClientAlreadyExistsException; +import _11.asktpk.artisanconnectbackend.customExceptions.WrongLoginPasswordException; +import _11.asktpk.artisanconnectbackend.dto.AuthResponseDTO; +import _11.asktpk.artisanconnectbackend.dto.ClientDTO; +import _11.asktpk.artisanconnectbackend.entities.Client; +import _11.asktpk.artisanconnectbackend.entities.Role; +import _11.asktpk.artisanconnectbackend.security.JwtUtil; +import _11.asktpk.artisanconnectbackend.service.AuthService; +import _11.asktpk.artisanconnectbackend.service.ClientService; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.DisplayName; +import org.mockito.Mockito; +import org.springframework.security.crypto.password.PasswordEncoder; + +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.Mockito.*; + +public class AuthServiceTest { + + private final ClientService clientService = Mockito.mock(ClientService.class); + private final PasswordEncoder passwordEncoder = Mockito.mock(PasswordEncoder.class); + private final JwtUtil jwtUtil = Mockito.mock(JwtUtil.class); + private final AuthService authService = new AuthService(clientService, jwtUtil, passwordEncoder); + + + @Test + @DisplayName("Test logowania - poprawne dane") + public void testLoginSuccess() throws Exception { + String email = "test@example.com"; + String password = "password"; + Client client = new Client(); + client.setEmail(email); + client.setPassword("encodedPassword"); + client.setRole(new Role()); + + when(clientService.getClientByEmail(email)).thenReturn(client); + when(passwordEncoder.matches(password, client.getPassword())).thenReturn(true); + when(jwtUtil.generateToken(email, client.getRole().getRole(), client.getId())).thenReturn("token"); + + AuthResponseDTO response = authService.login(email, password); + + assertNotNull(response, "Odpowiedź nie powinna być null"); + assertEquals("token", response.getToken(), "Token w odpowiedzi powinien być poprawny"); + } + + @Test + @DisplayName("Test logowania - niepoprawne hasło") + public void testLoginWrongPassword() { + String email = "test@example.com"; + String password = "wrongPassword"; + Client client = new Client(); + client.setEmail(email); + client.setPassword("encodedPassword"); + + when(clientService.getClientByEmail(email)).thenReturn(client); + when(passwordEncoder.matches(password, client.getPassword())).thenReturn(false); + + assertThrows(WrongLoginPasswordException.class, () -> authService.login(email, password), + "Powinien zostać rzucony WrongLoginPasswordException"); + } + + @Test + @DisplayName("Test rejestracji - nowy użytkownik") + public void testRegisterNewUser() throws Exception { + String email = "new@example.com"; + String password = "password"; + String firstName = "Jan"; + String lastName = "Kowalski"; + + when(clientService.getClientByEmail(email)).thenReturn(null); + when(passwordEncoder.encode(password)).thenReturn("encodedPassword"); + when(clientService.registerClient(any(Client.class))).thenReturn(new ClientDTO()); + + AuthResponseDTO response = authService.register(email, password, firstName, lastName); + + assertNotNull(response, "Odpowiedź nie powinna być null"); + } + + @Test + @DisplayName("Test rejestracji - użytkownik już istnieje") + public void testRegisterExistingUser() { + String email = "existing@example.com"; + String password = "password"; + String firstName = "Jan"; + String lastName = "Kowalski"; + + when(clientService.getClientByEmail(email)).thenReturn(new Client()); + + assertThrows(ClientAlreadyExistsException.class, () -> authService.register(email, password, firstName, lastName), + "Powinien zostać rzucony ClientAlreadyExistsException"); + } + + @Test + @DisplayName("Test wylogowania z poprawnym tokenem") + public void testLogoutWithValidToken() { + String token = "valid.token.here"; + + when(jwtUtil.isBlacklisted(token)).thenReturn(false); + + authService.logout(token); + + verify(jwtUtil, times(1)).blacklistToken(token); + + when(jwtUtil.isBlacklisted(token)).thenReturn(true); + assertTrue(jwtUtil.isBlacklisted(token), "Token powinien być na czarnej liście po wylogowaniu"); + } + + @Test + @DisplayName("Test wylogowania bez tokena") + public void testLogoutWithoutToken() { + authService.logout(null); + + verify(jwtUtil, never()).blacklistToken(anyString()); + + } + + +} \ No newline at end of file