package com.ufund.api.ufundapi.service; import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; import static org.junit.jupiter.api.Assertions.assertThrows; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; import java.io.IOException; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Tag; import org.junit.jupiter.api.Test; import com.ufund.api.ufundapi.model.User; import com.ufund.api.ufundapi.model.UserAuth; import com.ufund.api.ufundapi.persistence.UserAuthDAO; @Tag("Service-tier") public class AuthServiceTest { private UserAuthDAO mockAuthDAO; private UserService mockUserService; private AuthService authService; private String username; private String key; private String password; private User user; @BeforeEach public void setupAuthService() { mockAuthDAO = mock(UserAuthDAO.class); mockUserService = mock(UserService.class); authService = new AuthService(mockAuthDAO, mockUserService); username = "Fish"; password = "sticks"; key = UserAuth.generate(username).getKey(); user = User.create(username, password); } @Test public void testKeyIsValid() throws IOException { // Mock when(mockAuthDAO.getUserAuth(key)).thenReturn(new UserAuth(key, username, null)); when(mockUserService.getUser(username)).thenReturn(user); // Analyze assertDoesNotThrow(() -> authService.keyHasAccessToUser(username, key)); } @Test public void testKeyIsValidMismatchName() throws IOException { // Mock when(mockAuthDAO.getUserAuth(key)).thenReturn(new UserAuth(key, "EvilFish", null)); when(mockUserService.getUser("EvilFish")).thenReturn(user); // Analyze assertThrows(IllegalAccessException.class, () -> authService.keyHasAccessToUser(username, key)); } @Test public void testKeyIsValidMissingUserAuth() throws IOException { // Mock when(mockAuthDAO.getUserAuth(key)).thenReturn(null); // Analyze assertThrows(IllegalAccessException.class, () -> authService.keyHasAccessToUser(username, key)); } @Test public void testLogin() throws IOException { // Mock when(mockUserService.getUser(username)).thenReturn(user); // Analyze assertDoesNotThrow(() -> authService.login(username, password)); } @Test public void testLoginNullUser() throws IOException { // Mock when(mockUserService.getUser(username)).thenReturn(null); // Analyze assertThrows(IllegalAccessException.class, () -> authService.login(username, password)); } @Test public void testLoginMismatchPasswords() throws IOException { // Mock when(mockUserService.getUser(username)).thenReturn(User.create(username, "fries")); // Analyze assertThrows(IllegalAccessException.class, () -> authService.login(username, password)); } @Test public void testLogout() { // Analyze assertDoesNotThrow(() -> authService.logout(key)); } }