package com.kritsit.casetracker.server.datalayer; import static org.mockito.Mockito.*; import com.kritsit.casetracker.server.domain.model.AuthenticationException; import com.kritsit.casetracker.shared.domain.model.Staff; import com.kritsit.casetracker.shared.domain.model.Permission; import junit.framework.Test; import junit.framework.TestCase; import junit.framework.TestSuite; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; public class UserRepositoryTest extends TestCase { public UserRepositoryTest(String name) { super(name); } public static Test suite() { return new TestSuite(UserRepositoryTest.class); } public void testGetUserDetails_Null() throws Exception { String username = "inspector"; String sql = "SELECT firstName, lastName, department, position, " + "permissions FROM staff WHERE username=?;"; IPersistenceService db = mock(IPersistenceService.class); IUserRepository repo = new UserRepository(db); when(db.executeQuery(sql, username)).thenReturn(null); try { Staff response = repo.getUserDetails(username); fail("AuthenticationException expected"); } catch(AuthenticationException ex) { verify(db).executeQuery(sql, username); } } public void testGetUserDetails() throws Exception { String username = "inspector"; String sql = "SELECT firstName, lastName, department, position, " + "permissions FROM staff WHERE username=?;"; IPersistenceService db = mock(IPersistenceService.class); IUserRepository repo = new UserRepository(db); Map<String, String> details = new HashMap<>(); details.put("firstName", "Inspector"); details.put("lastName", "Inspector"); details.put("department", "Inspectorate"); details.put("position", "inspector"); details.put("permissions", "1"); List<Map<String, String>> result = new ArrayList<>(); result.add(details); when(db.executeQuery(sql, username)).thenReturn(result); Staff response = repo.getUserDetails(username); assertTrue(response != null); verify(db).executeQuery(sql, username); } public void testGetSalt_Null() throws Exception{ String username = "inspector"; String sql = "SELECT salt FROM staff WHERE username=?;"; IPersistenceService db = mock(IPersistenceService.class); IUserRepository repo = new UserRepository(db); AuthenticationException ex = null; try { long actualSalt = repo.getSalt(username); } catch (AuthenticationException e) { ex = e; } assertNotNull(ex); verify(db).executeQuery(sql, username); } public void testGetSalt() throws Exception{ String username = "inspector"; String sql = "SELECT salt FROM staff WHERE username=?;"; long expectedSalt = -5922475058261058398L; IPersistenceService db = mock(IPersistenceService.class); IUserRepository repo = new UserRepository(db); Map<String, String> details = new HashMap<>(); details.put("salt", expectedSalt + ""); List<Map<String, String>> result = new ArrayList<>(); result.add(details); when(db.executeQuery(sql, username)).thenReturn(result); long actualSalt = repo.getSalt(username); assertTrue(expectedSalt == actualSalt); verify(db).executeQuery(sql, username); } public void testGetPasswordSaltedHash_Null() throws Exception { String username = "inspector"; String sql = "SELECT passwordHash FROM staff WHERE username=?;"; IPersistenceService db = mock(IPersistenceService.class); IUserRepository repo = new UserRepository(db); when(db.executeQuery(sql, username)).thenReturn(null); AuthenticationException ex = null; try { long passwordSaltedHash = repo.getPasswordSaltedHash(username); } catch (AuthenticationException e) { ex = e; } assertNotNull(ex); verify(db).executeQuery(sql, username); } public void testGetPasswordSaltedHash() throws Exception { String username = "inspector"; String sql = "SELECT passwordHash FROM staff WHERE username=?;"; long expectedSalt = -5922475058261058398L; long expectedPasswordSaltedHash = "inspector".hashCode() + expectedSalt; IPersistenceService db = mock(IPersistenceService.class); IUserRepository repo = new UserRepository(db); Map<String, String> details = new HashMap<>(); details.put("passwordHash", expectedPasswordSaltedHash + ""); List<Map<String, String>> result = new ArrayList<>(); result.add(details); when(db.executeQuery(sql, username)).thenReturn(result); long passwordSaltedHash = repo.getPasswordSaltedHash(username); assertTrue(expectedPasswordSaltedHash == passwordSaltedHash); verify(db).executeQuery(sql, username); } public void testGetInvestigatingOfficer_Null() throws Exception { String caseNumber = "1"; String username = "inspector"; String investigatingOfficerSql = "SELECT username FROM staff " + "INNER JOIN(cases) WHERE staff.username=cases.staffID AND cases.caseNumber=?;"; IPersistenceService db = mock(IPersistenceService.class); IUserRepository repo = new UserRepository(db); Staff response = repo.getInvestigatingOfficer(caseNumber); assertTrue(response == null); verify(db).executeQuery(investigatingOfficerSql, caseNumber); } public void testGetInvestigatingOfficer() throws Exception { String caseNumber = "1"; String username = "inspector"; String investigatingOfficerSql = "SELECT username FROM staff " + "INNER JOIN(cases) WHERE staff.username=cases.staffID AND cases.caseNumber=?;"; String detailsSql = "SELECT firstName, lastName, department, position, " + "permissions FROM staff WHERE username=?;"; IPersistenceService db = mock(IPersistenceService.class); IUserRepository repo = new UserRepository(db); Map<String, String> details = new HashMap<>(); details.put("firstName", "Inspector"); details.put("lastName", "Inspector"); details.put("department", "Inspectorate"); details.put("position", "inspector"); details.put("permissions", "1"); List<Map<String, String>> detailsList = new ArrayList<>(); detailsList.add(details); Map<String, String> usernameMap = new HashMap<>(); usernameMap.put("username", username); List<Map<String, String>> usernameList = new ArrayList<>(); usernameList.add(usernameMap); when(db.executeQuery(investigatingOfficerSql, caseNumber)).thenReturn(usernameList); when(db.executeQuery(detailsSql, username)).thenReturn(detailsList); Staff response = repo.getInvestigatingOfficer(caseNumber); assertTrue(response != null); verify(db).executeQuery(investigatingOfficerSql, caseNumber); verify(db).executeQuery(detailsSql, username); } public void testGetGetInspectors_Null() throws Exception { String username = "inspector"; String anotherUsername = "AnotherInspector"; String usernameListSql = "SELECT username FROM staff WHERE permissions=?;"; IPersistenceService db = mock(IPersistenceService.class); IUserRepository repo = new UserRepository(db); List<Staff> response = repo.getInspectors(); assertTrue(response == null); verify(db).executeQuery(usernameListSql, "1"); } public void testGetGetInspectors() throws Exception { String username = "inspector"; String anotherUsername = "AnotherInspector"; String usernameListSql = "SELECT username FROM staff WHERE permissions=?;"; String inspectorDetailsSql = "SELECT firstName, lastName, department, " + "position, permissions FROM staff WHERE username=?;"; String anotherInspectorDetailsSql = "SELECT firstName, lastName, " + "department, position, permissions FROM staff WHERE username=?;"; IPersistenceService db = mock(IPersistenceService.class); IUserRepository repo = new UserRepository(db); List<Map<String, String>> inspector = new ArrayList<>(); Map<String, String> user1 = new HashMap<>(); user1.put("firstName", "Inspector"); user1.put("lastName", "Inspector"); user1.put("department", "Inspectorate"); user1.put("position", "inspector"); user1.put("permissions", "1"); inspector.add(user1); List<Map<String, String>> anotherInspector = new ArrayList<>(); Map<String, String> user2 = new HashMap<>(); user2.put("firstName", "Another"); user2.put("lastName", "Inspector"); user2.put("department", "Inspectorate"); user2.put("position", "manager"); user2.put("permissions", "1"); anotherInspector.add(user2); Map<String, String> usernameMap = new HashMap<>(); usernameMap.put("username", username); List<Map<String, String>> usernameList = new ArrayList<>(); usernameList.add(usernameMap); Map<String, String> anotherUsernameMap = new HashMap<>(); anotherUsernameMap.put("username", anotherUsername); usernameList.add(anotherUsernameMap); when(db.executeQuery(usernameListSql, "1")).thenReturn(usernameList); when(db.executeQuery(inspectorDetailsSql, username)).thenReturn(inspector); when(db.executeQuery(anotherInspectorDetailsSql, anotherUsername)).thenReturn(anotherInspector); List<Staff> response = repo.getInspectors(); assertTrue(response != null); verify(db).executeQuery(usernameListSql, "1"); verify(db).executeQuery(inspectorDetailsSql, username); verify(db).executeQuery(anotherInspectorDetailsSql, anotherUsername); } public void testGetStaff_Null() throws Exception { String usernameListSql = "SELECT username FROM staff WHERE username!=?;"; IPersistenceService db = mock(IPersistenceService.class); IUserRepository repo = new UserRepository(db); when(db.executeQuery(usernameListSql, "root")).thenReturn(null); List<Staff> response = repo.getStaff(); assertNull(response); verify(db).executeQuery(usernameListSql, "root"); } public void testGetStaff() throws Exception { String username = "inspector"; String anotherUsername = "AnotherInspector"; String usernameListSql = "SELECT username FROM staff WHERE username!=?;"; String inspectorDetailsSql = "SELECT firstName, lastName, department, " + "position, permissions FROM staff WHERE username=?;"; String anotherInspectorDetailsSql = "SELECT firstName, lastName, " + "department, position, permissions FROM staff WHERE username=?;"; IPersistenceService db = mock(IPersistenceService.class); IUserRepository repo = new UserRepository(db); List<Map<String, String>> inspector = new ArrayList<>(); Map<String, String> user1 = new HashMap<>(); user1.put("firstName", "Inspector"); user1.put("lastName", "Inspector"); user1.put("department", "Inspectorate"); user1.put("position", "inspector"); user1.put("permissions", "0"); inspector.add(user1); List<Map<String, String>> anotherInspector = new ArrayList<>(); Map<String, String> user2 = new HashMap<>(); user2.put("firstName", "Another"); user2.put("lastName", "Inspector"); user2.put("department", "Inspectorate"); user2.put("position", "manager"); user2.put("permissions", "2"); anotherInspector.add(user2); Map<String, String> usernameMap = new HashMap<>(); usernameMap.put("username", username); List<Map<String, String>> usernameList = new ArrayList<>(); usernameList.add(usernameMap); Map<String, String> anotherUsernameMap = new HashMap<>(); anotherUsernameMap.put("username", anotherUsername); usernameList.add(anotherUsernameMap); when(db.executeQuery(usernameListSql, "root")).thenReturn(usernameList); when(db.executeQuery(inspectorDetailsSql, username)).thenReturn(inspector); when(db.executeQuery(anotherInspectorDetailsSql, anotherUsername)).thenReturn(anotherInspector); List<Staff> response = repo.getStaff(); assertTrue(response != null); verify(db).executeQuery(usernameListSql, "root"); verify(db).executeQuery(inspectorDetailsSql, username); verify(db).executeQuery(anotherInspectorDetailsSql, anotherUsername); } public void testInsertUser_Admin() throws Exception { String sql = "INSERT INTO staff VALUES(?, ?, ?, ?, ?, -1, 0, ?);"; String username = "testUser"; String firstName = "test"; String lastName = "user"; String department = "IT"; String position = "Test"; Permission permission = Permission.ADMIN; String strPermission = "0"; Staff user = new Staff(username, firstName, lastName, department, position, permission); IPersistenceService db = mock(IPersistenceService.class); IUserRepository repo = new UserRepository(db); repo.insertUser(user); verify(db).executeUpdate(sql, username, firstName, lastName, department, position, strPermission); } public void testInsertUser_Editor() throws Exception { String sql = "INSERT INTO staff VALUES(?, ?, ?, ?, ?, -1, 0, ?);"; String username = "testUser"; String firstName = "test"; String lastName = "user"; String department = "IT"; String position = "Test"; Permission permission = Permission.EDITOR; String strPermission = "1"; Staff user = new Staff(username, firstName, lastName, department, position, permission); IPersistenceService db = mock(IPersistenceService.class); IUserRepository repo = new UserRepository(db); repo.insertUser(user); verify(db).executeUpdate(sql, username, firstName, lastName, department, position, strPermission); } public void testInsertUser_Viewer() throws Exception { String sql = "INSERT INTO staff VALUES(?, ?, ?, ?, ?, -1, 0, ?);"; String username = "testUser"; String firstName = "test"; String lastName = "user"; String department = "IT"; String position = "Test"; Permission permission = Permission.VIEWER; String strPermission = "2"; Staff user = new Staff(username, firstName, lastName, department, position, permission); IPersistenceService db = mock(IPersistenceService.class); IUserRepository repo = new UserRepository(db); repo.insertUser(user); verify(db).executeUpdate(sql, username, firstName, lastName, department, position, strPermission); } public void testUpdateUser_Admin() throws Exception { String sql = "UPDATE staff SET firstName=?, lastName=?, department=?, " + "position=?, permissions=? WHERE username=?;"; String username = "testUser"; String firstName = "test"; String lastName = "user"; String department = "IT"; String position = "Test"; Permission permission = Permission.ADMIN; String strPermission = "0"; Staff user = new Staff(username, firstName, lastName, department, position, permission); IPersistenceService db = mock(IPersistenceService.class); IUserRepository repo = new UserRepository(db); repo.updateUser(user); verify(db).executeUpdate(sql, firstName, lastName, department, position, strPermission, username); } public void testUpdateUser_Editor() throws Exception { String sql = "UPDATE staff SET firstName=?, lastName=?, department=?, " + "position=?, permissions=? WHERE username=?;"; String username = "testUser"; String firstName = "test"; String lastName = "user"; String department = "IT"; String position = "Test"; Permission permission = Permission.EDITOR; String strPermission = "1"; Staff user = new Staff(username, firstName, lastName, department, position, permission); IPersistenceService db = mock(IPersistenceService.class); IUserRepository repo = new UserRepository(db); repo.updateUser(user); verify(db).executeUpdate(sql, firstName, lastName, department, position, strPermission, username); } public void testUpdateUser_Viewer() throws Exception { String sql = "UPDATE staff SET firstName=?, lastName=?, department=?, " + "position=?, permissions=? WHERE username=?;"; String username = "testUser"; String firstName = "test"; String lastName = "user"; String department = "IT"; String position = "Test"; Permission permission = Permission.VIEWER; String strPermission = "2"; Staff user = new Staff(username, firstName, lastName, department, position, permission); IPersistenceService db = mock(IPersistenceService.class); IUserRepository repo = new UserRepository(db); repo.updateUser(user); verify(db).executeUpdate(sql, firstName, lastName, department, position, strPermission, username); } public void testDeleteUser() throws Exception { String sql = "DELETE FROM staff WHERE username=?;"; String username = "testUser"; IPersistenceService db = mock(IPersistenceService.class); IUserRepository repo = new UserRepository(db); repo.deleteUser(username); verify(db).executeUpdate(sql, username); } public void testSetPassword() throws Exception { String sql = "UPDATE staff SET passwordHash=?, salt=? WHERE username=?;"; String username = "testUser"; int passwordHash = 1234; IPersistenceService db = mock(IPersistenceService.class); IUserRepository repo = new UserRepository(db); repo.setPassword(username, passwordHash); verify(db).executeUpdate(eq(sql), anyString(), anyString(), eq(username)); } }