package se.bilhalsning.security; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertThrows; import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import java.util.Optional; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; import org.springframework.security.core.userdetails.UserDetails; import org.springframework.security.core.userdetails.UsernameNotFoundException; import se.bilhalsning.entity.User; import se.bilhalsning.repository.UserRepository; @ExtendWith(MockitoExtension.class) class UserDetailsServiceImplTest { @Mock private UserRepository userRepository; @InjectMocks private UserDetailsServiceImpl userDetailsService; @Test void shouldReturnUserDetailsWhenUserExists() { User user = new User(); user.setEmail("test@example.com"); user.setPasswordHash("hashed-password"); when(userRepository.findByEmail("test@example.com")).thenReturn(Optional.of(user)); UserDetails result = userDetailsService.loadUserByUsername("test@example.com"); assertEquals("test@example.com", result.getUsername()); assertEquals("hashed-password", result.getPassword()); } @Test void shouldThrowUsernameNotFoundExceptionWhenUserMissing() { when(userRepository.findByEmail(anyString())).thenReturn(Optional.empty()); assertThrows(UsernameNotFoundException.class, () -> userDetailsService.loadUserByUsername("missing@example.com")); } @Test void shouldNormalizeEmailToLowercase() { User user = new User(); user.setEmail("uppercase@example.com"); user.setPasswordHash("hashed-password"); when(userRepository.findByEmail("uppercase@example.com")).thenReturn(Optional.of(user)); userDetailsService.loadUserByUsername("UPPERCASE@EXAMPLE.COM"); verify(userRepository).findByEmail("uppercase@example.com"); } }