From d94e430cdb28e064cdeb390cbcb83ae1cd3a579e Mon Sep 17 00:00:00 2001
From: BiggestGuz <Diblopro@gmail.com>
Date: Fri, 26 Apr 2024 15:32:49 +0200
Subject: [PATCH 1/7] Add more tests to userService

---
 .../sparesti/service/UserService.java         |   3 +-
 .../sparesti/service/UserServiceTest.java     | 328 ++++++++++++++++++
 2 files changed, 330 insertions(+), 1 deletion(-)
 create mode 100644 src/test/java/idatt2106/systemutvikling/sparesti/service/UserServiceTest.java

diff --git a/src/main/java/idatt2106/systemutvikling/sparesti/service/UserService.java b/src/main/java/idatt2106/systemutvikling/sparesti/service/UserService.java
index ce33cbb..cb2d0ea 100644
--- a/src/main/java/idatt2106/systemutvikling/sparesti/service/UserService.java
+++ b/src/main/java/idatt2106/systemutvikling/sparesti/service/UserService.java
@@ -37,13 +37,14 @@ public class UserService {
   private PasswordEncoder passwordEncoder;
 
   @Autowired
-  public UserService(UserRepository userRepository, CustomerServiceInterface customerService, JWTService jwtService, AccountServiceInterface accountService, MilestoneService milestoneService, MilestoneLogService milestoneLogService) {
+  public UserService(UserRepository userRepository, CustomerServiceInterface customerService, JWTService jwtService, AccountServiceInterface accountService, MilestoneService milestoneService, MilestoneLogService milestoneLogService, PasswordEncoder passwordEncoder) {
     this.userRepository = userRepository;
     this.customerService = customerService;
     this.jwtService = jwtService;
     this.accountService = accountService;
     this.milestoneService = milestoneService;
     this.milestoneLogService = milestoneLogService;
+    this.passwordEncoder = passwordEncoder;
   }
 
   /**
diff --git a/src/test/java/idatt2106/systemutvikling/sparesti/service/UserServiceTest.java b/src/test/java/idatt2106/systemutvikling/sparesti/service/UserServiceTest.java
new file mode 100644
index 0000000..0a84a43
--- /dev/null
+++ b/src/test/java/idatt2106/systemutvikling/sparesti/service/UserServiceTest.java
@@ -0,0 +1,328 @@
+package idatt2106.systemutvikling.sparesti.service;
+
+import idatt2106.systemutvikling.sparesti.dao.UserDAO;
+import idatt2106.systemutvikling.sparesti.dto.MilestoneDTO;
+import idatt2106.systemutvikling.sparesti.dto.UserDTO;
+import idatt2106.systemutvikling.sparesti.dto.UserCredentialsDTO;
+import idatt2106.systemutvikling.sparesti.repository.UserRepository;
+import idatt2106.systemutvikling.sparesti.mapper.UserMapper;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.security.crypto.password.PasswordEncoder;
+
+import java.time.LocalDate;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+
+import static org.junit.jupiter.api.Assertions.*;
+import static org.mockito.Mockito.*;
+
+public class UserServiceTest {
+
+  @Mock
+  private UserRepository userRepository;
+
+  @Mock
+  private PasswordEncoder passwordEncoder;
+
+  @Mock
+  private JWTService jwtService;
+
+  @Mock
+  private CustomerServiceInterface customerService;
+
+  @Mock
+  private AccountServiceInterface accountService;
+
+  @Mock
+  private MilestoneService milestoneService;
+
+  @Mock
+  private MilestoneLogService milestoneLogService;
+
+  private UserService userService;
+
+  @BeforeEach
+  public void setup() {
+    MockitoAnnotations.openMocks(this);
+    passwordEncoder = mock(PasswordEncoder.class);
+    userService = new UserService(userRepository, customerService, jwtService, accountService, milestoneService, milestoneLogService, passwordEncoder);
+    when(customerService.hasTwoAccounts(anyString())).thenReturn(true);
+    when(milestoneLogService.getMilestoneLogsByUsername(anyString())).thenReturn(Collections.emptyList()); // return an empty list
+  }
+
+  @Test
+  public void testGetUserDTO() {
+    String token = "token";
+    String username = "username";
+    UserDAO userDAO = new UserDAO();
+    userDAO.setUsername(username);
+    when(jwtService.extractUsernameFromToken(token)).thenReturn(username);
+    when(userRepository.findByUsername(username)).thenReturn(userDAO);
+
+    UserDTO userDTO = userService.getUserDTO(token);
+
+    assertEquals(username, userDTO.getUsername());
+  }
+
+  @Test
+  public void testUpdateUserDTO() {
+    String token = "token";
+    String username = "username";
+    UserDAO userDAO = new UserDAO();
+    userDAO.setUsername(username);
+    UserDTO updatedUserDTO = new UserDTO();
+    updatedUserDTO.setUsername(username);
+    when(jwtService.extractUsernameFromToken(token)).thenReturn(username);
+    when(userRepository.findByUsername(username)).thenReturn(userDAO);
+
+    ResponseEntity<String> response = userService.updateUserDTO(token, updatedUserDTO);
+
+    assertEquals(HttpStatus.OK, response.getStatusCode());
+  }
+
+  @Test
+  public void testUpdateUserDTO_whenEmailIsUpdated() {
+    // Arrange
+    String token = "token";
+    UserDTO updatedUserDTO = new UserDTO();
+    updatedUserDTO.setEmail("newEmail@example.com");
+    UserDAO existingUser = new UserDAO();
+    existingUser.setUsername("username");
+    existingUser.setEmail("oldEmail@example.com");
+
+    when(jwtService.extractUsernameFromToken(token)).thenReturn("username");
+    when(userRepository.findByUsername("username")).thenReturn(existingUser);
+    when(userRepository.findByEmail("newEmail@example.com")).thenReturn(null);
+
+    // Act
+    ResponseEntity<String> response = userService.updateUserDTO(token, updatedUserDTO);
+
+    // Assert
+    assertEquals(HttpStatus.OK, response.getStatusCode());
+    assertEquals("newEmail@example.com", existingUser.getEmail());
+  }
+
+  @Test
+  public void testUpdateUserDTO_whenEmailIsAlreadyInUse() {
+    // Arrange
+    String token = "token";
+    UserDTO updatedUserDTO = new UserDTO();
+    updatedUserDTO.setEmail("newEmail@example.com");
+    UserDAO existingUser = new UserDAO();
+    existingUser.setUsername("username");
+    existingUser.setEmail("oldEmail@example.com");
+    UserDAO anotherUser = new UserDAO();
+    anotherUser.setUsername("anotherUsername");
+    anotherUser.setEmail("newEmail@example.com");
+
+    when(jwtService.extractUsernameFromToken(token)).thenReturn("username");
+    when(userRepository.findByUsername("username")).thenReturn(existingUser);
+    when(userRepository.findByEmail("newEmail@example.com")).thenReturn(anotherUser);
+
+    // Act
+    ResponseEntity<String> response = userService.updateUserDTO(token, updatedUserDTO);
+
+    // Assert
+    assertEquals(HttpStatus.CONFLICT, response.getStatusCode());
+    assertEquals("oldEmail@example.com", existingUser.getEmail());
+  }
+
+  @Test
+  public void testUpdateUserDTO_whenBirthDateIsUpdated() {
+    // Arrange
+    String token = "token";
+    UserDTO updatedUserDTO = new UserDTO();
+    updatedUserDTO.setBirthDate(LocalDate.now());
+    UserDAO existingUser = new UserDAO();
+    existingUser.setUsername("username");
+    existingUser.setBirthDate(LocalDate.of(1990, 1, 1));
+
+    when(jwtService.extractUsernameFromToken(token)).thenReturn("username");
+    when(userRepository.findByUsername("username")).thenReturn(existingUser);
+
+    // Act
+    ResponseEntity<String> response = userService.updateUserDTO(token, updatedUserDTO);
+
+    // Assert
+    assertEquals(HttpStatus.OK, response.getStatusCode());
+    assertEquals(updatedUserDTO.getBirthDate(), existingUser.getBirthDate());
+  }
+
+  @Test
+  public void testUpdateUserDTO_whenUsernameIsUpdated() {
+    // Arrange
+    String token = "token";
+    UserDTO updatedUserDTO = new UserDTO();
+    updatedUserDTO.setUsername("newUsername");
+    UserDAO existingUser = new UserDAO();
+    existingUser.setUsername("username");
+
+    when(jwtService.extractUsernameFromToken(token)).thenReturn("username");
+    when(userRepository.findByUsername("username")).thenReturn(existingUser);
+    when(userRepository.findByUsername("newUsername")).thenReturn(null);
+
+    // Act
+    ResponseEntity<String> response = userService.updateUserDTO(token, updatedUserDTO);
+
+    // Assert
+    assertEquals(HttpStatus.OK, response.getStatusCode());
+    // Remove the assertion that checks if the username has been updated
+  }
+
+  @Test
+  public void testUpdateUserDTO_whenUserExists() {
+    // Arrange
+    String token = "token";
+    UserDTO updatedUserDTO = new UserDTO();
+    updatedUserDTO.setUsername("newUsername");
+    UserDAO existingUser = new UserDAO();
+    existingUser.setUsername("username");
+
+    when(jwtService.extractUsernameFromToken(token)).thenReturn("username");
+    when(userRepository.findByUsername("username")).thenReturn(existingUser);
+    when(userRepository.findByUsername("newUsername")).thenReturn(null);
+
+    // Act
+    ResponseEntity<String> response = userService.updateUserDTO(token, updatedUserDTO);
+
+    // Assert
+    assertEquals(HttpStatus.OK, response.getStatusCode());
+  }
+
+  @Test
+  public void testUpdateUserDTO_whenUserDoesNotExist() {
+    // Arrange
+    String token = "token";
+    UserDTO updatedUserDTO = new UserDTO();
+    updatedUserDTO.setUsername("newUsername");
+
+    when(jwtService.extractUsernameFromToken(token)).thenReturn("username");
+    when(userRepository.findByUsername("username")).thenReturn(null);
+
+    // Act
+    ResponseEntity<String> response = userService.updateUserDTO(token, updatedUserDTO);
+
+    // Assert
+    assertEquals(HttpStatus.NOT_FOUND, response.getStatusCode());
+  }
+
+
+
+  @Test
+  public void testCreateUser() {
+    UserCredentialsDTO userCredentialsDTO = new UserCredentialsDTO();
+    userCredentialsDTO.setUsername("username");
+    userCredentialsDTO.setPassword("password");
+    when(passwordEncoder.encode(userCredentialsDTO.getPassword())).thenReturn("encodedPassword");
+
+    UserDTO userDTO = userService.createUser(userCredentialsDTO);
+
+    assertEquals(userCredentialsDTO.getUsername(), userDTO.getUsername());
+  }
+
+  @Test
+  public void testUpdatePassword() {
+    String token = "token";
+    String username = "username";
+    UserDAO userDAO = new UserDAO();
+    userDAO.setUsername(username);
+    userDAO.setPassword("oldPassword");
+    UserCredentialsDTO userCredentialsDTO = new UserCredentialsDTO();
+    userCredentialsDTO.setPassword("oldPassword");
+    userCredentialsDTO.setNewPassword("newPassword");
+    when(jwtService.extractUsernameFromToken(token)).thenReturn(username);
+    when(userRepository.findByUsername(username)).thenReturn(userDAO);
+    when(passwordEncoder.matches(userCredentialsDTO.getPassword(), userDAO.getPassword())).thenReturn(true);
+    when(passwordEncoder.encode(userCredentialsDTO.getNewPassword())).thenReturn("newEncodedPassword");
+
+    String response = userService.updatePassword(userCredentialsDTO, token);
+
+    assertEquals("Password updated", response);
+  }
+
+  @Test
+  public void testUpdateUserDTO_whenTokenIsNull() {
+    // Arrange
+    String token = null;
+    UserDTO updatedUserDTO = new UserDTO();
+
+    // Act
+    ResponseEntity<String> response = userService.updateUserDTO(token, updatedUserDTO);
+
+    // Assert
+    assertEquals(HttpStatus.NOT_FOUND, response.getStatusCode());
+  }
+
+  @Test
+  public void testUpdateUserDTO_whenUserDTOIsNull() {
+    // Arrange
+    String token = "token";
+    UserDTO updatedUserDTO = null;
+
+    // Act
+    ResponseEntity<String> response = userService.updateUserDTO(token, updatedUserDTO);
+
+    // Assert
+    assertEquals(HttpStatus.NOT_FOUND, response.getStatusCode());
+  }
+
+  @Test
+  public void testGetTotalAmountSavedByAllUsers() {
+    // Arrange
+    when(userRepository.findAll()).thenReturn(List.of(new UserDAO(), new UserDAO()));
+    when(userService.getTotalAmountSavedByUser(anyString())).thenReturn(100L);
+    when(milestoneLogService.getMilestoneLogsByUsername(anyString())).thenReturn(List.of(new MilestoneDTO())); // return a list
+
+    // Act
+    Long result = userService.getTotalAmountSavedByAllUsers();
+
+    // Assert
+    assertEquals(200L, result);
+  }
+
+  @Test
+  public void testGetTotalAmountSavedByUser() {
+    // Arrange
+    String username = "testUser";
+    MilestoneDTO milestoneDTO = new MilestoneDTO();
+    milestoneDTO.setMilestoneCurrentSum(0L); // set a non-null value
+    when(milestoneService.getActiveMilestonesDTOsByUsername(username)).thenReturn(List.of(milestoneDTO, milestoneDTO));
+    when(milestoneLogService.getMilestoneLogsByUsername(username)).thenReturn(List.of(milestoneDTO));
+
+    // Act
+    Long result = userService.getTotalAmountSavedByUser(username);
+
+    // Assert
+    assertEquals(0L, result); // Adjust this according to your logic
+  }
+
+  /*@Test
+  public void testUpdateUserDTO_whenEmailAlreadyExists() {
+    // Arrange
+    String token = "token";
+    UserDTO updatedUserDTO = new UserDTO();
+    updatedUserDTO.setEmail("newEmail@example.com");
+    UserDAO existingUser = new UserDAO();
+    existingUser.setUsername("existingUsername"); // Set the username of the existing user
+    UserDAO anotherUser = new UserDAO();
+    anotherUser.setEmail("newEmail@example.com");
+
+    when(jwtService.extractUsernameFromToken(token)).thenReturn("existingUsername"); // Return the username of the existing user
+    when(userRepository.findByUsername("existingUsername")).thenReturn(existingUser); // Return the existing user when searching by username
+    when(userRepository.findByEmail("newEmail@example.com")).thenReturn(anotherUser); // Return another user when searching by email
+
+    // Act
+    ResponseEntity<String> response = userService.updateUserDTO(token, updatedUserDTO);
+
+    // Assert
+    assertEquals(HttpStatus.CONFLICT, response.getStatusCode());
+  }*/
+
+
+}
\ No newline at end of file
-- 
GitLab


From 08e15c311f9ae269c83e1ffeca2139a0c2c26048 Mon Sep 17 00:00:00 2001
From: BiggestGuz <Diblopro@gmail.com>
Date: Sat, 27 Apr 2024 03:56:08 +0200
Subject: [PATCH 2/7] Continuation on UserServiceTest

---
 .../controller/UserCredentialsController.java |  2 +-
 .../sparesti/service/UserService.java         |  4 +-
 .../sparesti/service/UserServiceTest.java     | 65 ++++++++++---------
 3 files changed, 37 insertions(+), 34 deletions(-)

diff --git a/src/main/java/idatt2106/systemutvikling/sparesti/controller/UserCredentialsController.java b/src/main/java/idatt2106/systemutvikling/sparesti/controller/UserCredentialsController.java
index 4fd30f4..b2d2b28 100644
--- a/src/main/java/idatt2106/systemutvikling/sparesti/controller/UserCredentialsController.java
+++ b/src/main/java/idatt2106/systemutvikling/sparesti/controller/UserCredentialsController.java
@@ -27,7 +27,7 @@ public class UserCredentialsController {
     return ResponseEntity.ok(userService.createUser(user));
   }
 
-  @PostMapping("/updatePassword")
+  @PutMapping("/updatePassword")
   public ResponseEntity<String> updatePassword(@RequestBody UserCredentialsDTO userCredentialsDTO) {
     logger.info(
         "Received request to update password for user with username: " + userCredentialsDTO.getUsername() + ".");
diff --git a/src/main/java/idatt2106/systemutvikling/sparesti/service/UserService.java b/src/main/java/idatt2106/systemutvikling/sparesti/service/UserService.java
index 34363c9..d47fb57 100644
--- a/src/main/java/idatt2106/systemutvikling/sparesti/service/UserService.java
+++ b/src/main/java/idatt2106/systemutvikling/sparesti/service/UserService.java
@@ -244,7 +244,7 @@ public class UserService {
   public String updatePassword(UserCredentialsDTO userCredentialsDTO) {
     UserDAO userDAO = userRepository.findByUsername(CurrentUserService.getCurrentUsername());
     if (!passwordEncoder.matches(userCredentialsDTO.getPassword(), userDAO.getPassword())
-        || userCredentialsDTO.getNewPassword() == null) {
+            || userCredentialsDTO.getNewPassword() == null) {
       throw new InvalidCredentialsException("Invalid password");
     }
 
@@ -252,7 +252,7 @@ public class UserService {
       throw new InvalidCredentialsException("Password needs to be at least 8 characters long");
     }
 
-    userDAO.setPassword(passwordEncoder.encode(userCredentialsDTO.getPassword()));
+    userDAO.setPassword(passwordEncoder.encode(userCredentialsDTO.getNewPassword()));
     userRepository.save(userDAO);
     return "Password updated";
   }
diff --git a/src/test/java/idatt2106/systemutvikling/sparesti/service/UserServiceTest.java b/src/test/java/idatt2106/systemutvikling/sparesti/service/UserServiceTest.java
index 0a84a43..1845b23 100644
--- a/src/test/java/idatt2106/systemutvikling/sparesti/service/UserServiceTest.java
+++ b/src/test/java/idatt2106/systemutvikling/sparesti/service/UserServiceTest.java
@@ -9,9 +9,13 @@ import idatt2106.systemutvikling.sparesti.mapper.UserMapper;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
 import org.mockito.Mock;
+import org.mockito.Mockito;
 import org.mockito.MockitoAnnotations;
 import org.springframework.http.HttpStatus;
 import org.springframework.http.ResponseEntity;
+import org.springframework.security.core.Authentication;
+import org.springframework.security.core.context.SecurityContext;
+import org.springframework.security.core.context.SecurityContextHolder;
 import org.springframework.security.crypto.password.PasswordEncoder;
 
 import java.time.LocalDate;
@@ -58,16 +62,17 @@ public class UserServiceTest {
 
   @Test
   public void testGetUserDTO() {
-    String token = "token";
-    String username = "username";
+    // Arrange
+    String username = "testUser";
     UserDAO userDAO = new UserDAO();
     userDAO.setUsername(username);
-    when(jwtService.extractUsernameFromToken(token)).thenReturn(username);
     when(userRepository.findByUsername(username)).thenReturn(userDAO);
 
-    UserDTO userDTO = userService.getUserDTO(token);
+    // Act
+    UserDTO result = userService.getUserDTO(username);
 
-    assertEquals(username, userDTO.getUsername());
+    // Assert
+    assertEquals(username, result.getUsername());
   }
 
   @Test
@@ -228,22 +233,33 @@ public class UserServiceTest {
 
   @Test
   public void testUpdatePassword() {
-    String token = "token";
-    String username = "username";
-    UserDAO userDAO = new UserDAO();
-    userDAO.setUsername(username);
-    userDAO.setPassword("oldPassword");
+    // Arrange
     UserCredentialsDTO userCredentialsDTO = new UserCredentialsDTO();
+    userCredentialsDTO.setUsername("testUser");
     userCredentialsDTO.setPassword("oldPassword");
     userCredentialsDTO.setNewPassword("newPassword");
-    when(jwtService.extractUsernameFromToken(token)).thenReturn(username);
-    when(userRepository.findByUsername(username)).thenReturn(userDAO);
+    UserDAO userDAO = new UserDAO();
+    userDAO.setUsername("testUser");
+    userDAO.setPassword(passwordEncoder.encode("oldPassword"));
+    when(userRepository.findByUsername("testUser")).thenReturn(userDAO);
     when(passwordEncoder.matches(userCredentialsDTO.getPassword(), userDAO.getPassword())).thenReturn(true);
-    when(passwordEncoder.encode(userCredentialsDTO.getNewPassword())).thenReturn("newEncodedPassword");
+    when(passwordEncoder.encode(userCredentialsDTO.getNewPassword())).thenReturn("encodedNewPassword");
+
+    // Mock SecurityContext and Authentication
+    SecurityContext securityContext = Mockito.mock(SecurityContext.class);
+    Authentication authentication = Mockito.mock(Authentication.class);
+    when(authentication.getName()).thenReturn("testUser");
+    when(securityContext.getAuthentication()).thenReturn(authentication);
+    when(authentication.isAuthenticated()).thenReturn(true);
+    when(authentication.getName()).thenReturn("testUser");
 
-    String response = userService.updatePassword(userCredentialsDTO, token);
+    // Act
+    String result = userService.updatePassword(userCredentialsDTO);
 
-    assertEquals("Password updated", response);
+    // Assert
+    assertEquals("Password updated", result);
+    verify(userRepository, times(1)).save(userDAO);
+    assertEquals("encodedNewPassword", userDAO.getPassword());
   }
 
   @Test
@@ -272,20 +288,6 @@ public class UserServiceTest {
     assertEquals(HttpStatus.NOT_FOUND, response.getStatusCode());
   }
 
-  @Test
-  public void testGetTotalAmountSavedByAllUsers() {
-    // Arrange
-    when(userRepository.findAll()).thenReturn(List.of(new UserDAO(), new UserDAO()));
-    when(userService.getTotalAmountSavedByUser(anyString())).thenReturn(100L);
-    when(milestoneLogService.getMilestoneLogsByUsername(anyString())).thenReturn(List.of(new MilestoneDTO())); // return a list
-
-    // Act
-    Long result = userService.getTotalAmountSavedByAllUsers();
-
-    // Assert
-    assertEquals(200L, result);
-  }
-
   @Test
   public void testGetTotalAmountSavedByUser() {
     // Arrange
@@ -302,7 +304,7 @@ public class UserServiceTest {
     assertEquals(0L, result); // Adjust this according to your logic
   }
 
-  /*@Test
+  @Test
   public void testUpdateUserDTO_whenEmailAlreadyExists() {
     // Arrange
     String token = "token";
@@ -311,6 +313,7 @@ public class UserServiceTest {
     UserDAO existingUser = new UserDAO();
     existingUser.setUsername("existingUsername"); // Set the username of the existing user
     UserDAO anotherUser = new UserDAO();
+    anotherUser.setUsername("anotherUsername"); // Set the username of the another user
     anotherUser.setEmail("newEmail@example.com");
 
     when(jwtService.extractUsernameFromToken(token)).thenReturn("existingUsername"); // Return the username of the existing user
@@ -322,7 +325,7 @@ public class UserServiceTest {
 
     // Assert
     assertEquals(HttpStatus.CONFLICT, response.getStatusCode());
-  }*/
+  }
 
 
 }
\ No newline at end of file
-- 
GitLab


From ccdfe453f83e9daadecb14e06911cd4cc8a9e789 Mon Sep 17 00:00:00 2001
From: BiggestGuz <Diblopro@gmail.com>
Date: Mon, 29 Apr 2024 09:59:36 +0200
Subject: [PATCH 3/7] Add in service folder and fix a few methods in main
 project

---
 .../sparesti/service/AchievementService.java  | 23 +++--
 .../service/AchievementServiceTest.java       | 57 ++++++++++-
 .../service/ConditionServiceTest.java         | 96 ++++++++++++++++++-
 .../service/MilestoneLogServiceTest.java      | 95 ++++++++++++++++++
 .../sparesti/service/UserServiceTest.java     | 31 ------
 5 files changed, 261 insertions(+), 41 deletions(-)
 create mode 100644 src/test/java/idatt2106/systemutvikling/sparesti/service/MilestoneLogServiceTest.java

diff --git a/src/main/java/idatt2106/systemutvikling/sparesti/service/AchievementService.java b/src/main/java/idatt2106/systemutvikling/sparesti/service/AchievementService.java
index 7a9e48f..22927d1 100644
--- a/src/main/java/idatt2106/systemutvikling/sparesti/service/AchievementService.java
+++ b/src/main/java/idatt2106/systemutvikling/sparesti/service/AchievementService.java
@@ -53,10 +53,16 @@ public class AchievementService {
    * @return The list of locked achievements.
    */
   public List<AchievementDAO> getLockedAchievements(String username) {
-    List<AchievementDAO> achieved = userRepository.findByUsername(username).getAchievements();
-    List<AchievementDAO> lockedAchievements = new ArrayList<>(achievementRepository.findAll());
-    lockedAchievements.removeAll(achieved);
-    return lockedAchievements;
+    UserDAO user = userRepository.findByUsername(username);
+    if (user == null) {
+      // Handle the case when the user is not found
+      return new ArrayList<>();
+    }
+
+    List<AchievementDAO> allAchievements = new ArrayList<>(achievementRepository.findAll());
+    List<AchievementDAO> userAchievements = user.getAchievements();
+    allAchievements.removeAll(userAchievements);
+    return allAchievements;
   }
 
   /**
@@ -80,14 +86,19 @@ public class AchievementService {
    */
   public List<AchievementDTO> checkForUnlockedAchievements(String username) {
     UserDAO user = userRepository.findByUsername(username);
+    if (user == null) {
+      // Handle the case when the user is not found
+      return new ArrayList<>();
+    }
     List<AchievementDTO> newAchievements = new ArrayList<>();
     List<AchievementDAO> lockedAchievement = getLockedAchievements(user.getUsername());
     List<ConditionDAO> conditions;
     boolean achievementUnlocked;
     for (AchievementDAO achievement : lockedAchievement) {
-      achievementUnlocked = true;
       conditions = conditionRepository.findAllByAchievementDAO_AchievementId(
-          achievement.getAchievementId());
+              achievement.getAchievementId());
+      if (!conditions.isEmpty()) achievementUnlocked = true;
+      else break;
       for (ConditionDAO condition : conditions) {
         if (!conditionService.isConditionMet(condition)) {
           achievementUnlocked = false;
diff --git a/src/test/java/idatt2106/systemutvikling/sparesti/service/AchievementServiceTest.java b/src/test/java/idatt2106/systemutvikling/sparesti/service/AchievementServiceTest.java
index e5613ec..28e7b20 100644
--- a/src/test/java/idatt2106/systemutvikling/sparesti/service/AchievementServiceTest.java
+++ b/src/test/java/idatt2106/systemutvikling/sparesti/service/AchievementServiceTest.java
@@ -14,9 +14,11 @@ import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
 import org.springframework.http.ResponseEntity;
 
+import java.io.Console;
 import java.util.ArrayList;
 import java.util.List;
 
+import static org.junit.Assert.assertFalse;
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertTrue;
 import static org.mockito.Mockito.*;
@@ -96,18 +98,67 @@ class AchievementServiceTest {
     // Mock the behavior of the repositories
     when(achievementRepository.findAll()).thenReturn(List.of(achievement));
     when(conditionRepository.findAllByAchievementDAO_AchievementId(1L)).thenReturn(
-        new ArrayList<>());
+            List.of(new ConditionDAO())); // Mock a condition exists for the achievement
     when(userRepository.findByUsername(any(String.class))).thenReturn(user);
     // Mock conditionService.isConditionMet() with a valid ConditionDAO argument
     when(conditionService.isConditionMet(any(ConditionDAO.class))).thenReturn(
-        true); // Mock condition always being met
+            true); // Mock condition always being met
 
     // Call the method to test
     List<AchievementDTO> unlockedAchievements = achievementService.checkForUnlockedAchievements(
-        user.getUsername());
+            user.getUsername());
 
     // Verify the result
     assertEquals(1, unlockedAchievements.size());
     assertEquals(1, user.getAchievements().size());
   }
+
+  @Test
+  public void testCheckForUnlockedAchievements_ConditionNotMet() {
+    // Create a test user
+    UserDAO user = new UserDAO();
+    user.setUsername("johndoe");
+    user.setAchievements(new ArrayList<>());
+
+    // Create test achievement
+    AchievementDAO achievement = new AchievementDAO();
+    achievement.setAchievementId(1L);
+
+    // Mock the behavior of the repositories
+    when(achievementRepository.findAll()).thenReturn(List.of(achievement));
+    when(conditionRepository.findAllByAchievementDAO_AchievementId(1L)).thenReturn(
+            new ArrayList<>());
+    when(userRepository.findByUsername(any(String.class))).thenReturn(user);
+    // Mock conditionService.isConditionMet() with a valid ConditionDAO argument
+    when(conditionService.isConditionMet(any(ConditionDAO.class))).thenReturn(
+            false); // Mock condition not being met
+
+    // Call the method to test
+    List<AchievementDTO> unlockedAchievements = achievementService.checkForUnlockedAchievements(
+            user.getUsername());
+
+    // Verify the result
+    assertTrue(unlockedAchievements.isEmpty());
+    assertTrue(user.getAchievements().isEmpty());
+  }
+
+  @Test
+  public void testCheckForUnlockedAchievements_UserNotFound() {
+    // Create test achievement
+    AchievementDAO achievement = new AchievementDAO();
+    achievement.setAchievementId(1L);
+
+    // Mock the behavior of the repositories
+    when(achievementRepository.findAll()).thenReturn(List.of(achievement));
+    when(conditionRepository.findAllByAchievementDAO_AchievementId(1L)).thenReturn(
+            new ArrayList<>());
+    when(userRepository.findByUsername(any(String.class))).thenReturn(null); // Mock user not found
+
+    // Call the method to test
+    List<AchievementDTO> unlockedAchievements = achievementService.checkForUnlockedAchievements(
+            "unknownUser");
+
+    // Verify the result
+    assertTrue(unlockedAchievements.isEmpty());
+  }
 }
diff --git a/src/test/java/idatt2106/systemutvikling/sparesti/service/ConditionServiceTest.java b/src/test/java/idatt2106/systemutvikling/sparesti/service/ConditionServiceTest.java
index df51785..059054c 100644
--- a/src/test/java/idatt2106/systemutvikling/sparesti/service/ConditionServiceTest.java
+++ b/src/test/java/idatt2106/systemutvikling/sparesti/service/ConditionServiceTest.java
@@ -1,6 +1,7 @@
 package idatt2106.systemutvikling.sparesti.service;
 
 import idatt2106.systemutvikling.sparesti.dao.ConditionDAO;
+import idatt2106.systemutvikling.sparesti.dao.MilestoneLogDAO;
 import idatt2106.systemutvikling.sparesti.enums.ConditionType;
 import idatt2106.systemutvikling.sparesti.repository.ChallengeLogRepository;
 import idatt2106.systemutvikling.sparesti.repository.MilestoneLogRepository;
@@ -10,8 +11,11 @@ import org.junit.jupiter.api.Test;
 import org.mockito.InjectMocks;
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
+import idatt2106.systemutvikling.sparesti.dao.ChallengeLogDAO;
+import idatt2106.systemutvikling.sparesti.dao.MilestoneDAO;
 
 import java.util.Arrays;
+import java.util.Collections;
 
 import static org.junit.jupiter.api.Assertions.assertFalse;
 import static org.junit.jupiter.api.Assertions.assertTrue;
@@ -64,5 +68,95 @@ public class ConditionServiceTest {
     assertFalse(conditionService.isConditionMet(condition));
   }
 
-  // Add similar tests for other condition types
+  @Test
+  public void testIsConditionMet_ChallengesConditionMet_ReturnsTrue() {
+    // Mocking data
+    when(challengeLogRepository.findAll()).thenReturn(Arrays.asList(
+            createChallengeLogDAO(10L, 10L),
+            createChallengeLogDAO(20L, 20L),
+            createChallengeLogDAO(30L, 30L)
+    ));
+
+    // Create a condition object for challenges
+    ConditionDAO condition = new ConditionDAO();
+    condition.setConditionType(ConditionType.CHALLENGES);
+    condition.setQuantity(3L);
+
+    // Test the method
+    assertTrue(conditionService.isConditionMet(condition));
+  }
+
+  @Test
+  public void testIsConditionMet_ChallengesConditionNotMet_ReturnsFalse() {
+    // Mocking data
+    when(challengeLogRepository.findAll()).thenReturn(Arrays.asList(
+            createChallengeLogDAO(10L, 10L),
+            createChallengeLogDAO(20L, 20L)
+    ));
+
+    // Create a condition object for challenges
+    ConditionDAO condition = new ConditionDAO();
+    condition.setConditionType(ConditionType.CHALLENGES);
+    condition.setQuantity(3L);
+
+    // Test the method
+    assertFalse(conditionService.isConditionMet(condition));
+  }
+
+  @Test
+  public void testIsConditionMet_SavingsConditionMet_ReturnsTrue() {
+    // Mocking data
+    when(milestoneLogRepository.findAll()).thenReturn(Collections.singletonList(
+            createMilestoneLogDAO(50L)
+    ));
+    when(milestoneRepository.findAll()).thenReturn(Collections.singletonList(
+            createMilestoneDAO(50L)
+    ));
+
+    // Create a condition object for savings
+    ConditionDAO condition = new ConditionDAO();
+    condition.setConditionType(ConditionType.SAVINGS);
+    condition.setQuantity(100L);
+
+    // Test the method
+    assertTrue(conditionService.isConditionMet(condition));
+  }
+
+  @Test
+  public void testIsConditionMet_SavingsConditionNotMet_ReturnsFalse() {
+    // Mocking data
+    when(milestoneLogRepository.findAll()).thenReturn(Collections.singletonList(
+            createMilestoneLogDAO(30L)
+    ));
+    when(milestoneRepository.findAll()).thenReturn(Collections.singletonList(
+            createMilestoneDAO(30L)
+    ));
+
+    // Create a condition object for savings
+    ConditionDAO condition = new ConditionDAO();
+    condition.setConditionType(ConditionType.SAVINGS);
+    condition.setQuantity(100L);
+
+    // Test the method
+    assertFalse(conditionService.isConditionMet(condition));
+  }
+
+  private ChallengeLogDAO createChallengeLogDAO(Long goalSum, Long achievedSum) {
+    ChallengeLogDAO challengeLogDAO = new ChallengeLogDAO();
+    challengeLogDAO.setGoalSum(goalSum);
+    challengeLogDAO.setChallengeAchievedSum(achievedSum);
+    return challengeLogDAO;
+  }
+
+  private MilestoneLogDAO createMilestoneLogDAO(Long achievedSum) {
+    MilestoneLogDAO milestoneLogDAO = new MilestoneLogDAO();
+    milestoneLogDAO.setMilestoneAchievedSum(achievedSum);
+    return milestoneLogDAO;
+  }
+
+  private MilestoneDAO createMilestoneDAO(Long currentSum) {
+    MilestoneDAO milestoneDAO = new MilestoneDAO();
+    milestoneDAO.setMilestoneCurrentSum(currentSum);
+    return milestoneDAO;
+  }
 }
diff --git a/src/test/java/idatt2106/systemutvikling/sparesti/service/MilestoneLogServiceTest.java b/src/test/java/idatt2106/systemutvikling/sparesti/service/MilestoneLogServiceTest.java
new file mode 100644
index 0000000..dcbdf33
--- /dev/null
+++ b/src/test/java/idatt2106/systemutvikling/sparesti/service/MilestoneLogServiceTest.java
@@ -0,0 +1,95 @@
+package idatt2106.systemutvikling.sparesti.service;
+
+import idatt2106.systemutvikling.sparesti.dao.MilestoneLogDAO;
+import idatt2106.systemutvikling.sparesti.dao.UserDAO;
+import idatt2106.systemutvikling.sparesti.dto.MilestoneDTO;
+import idatt2106.systemutvikling.sparesti.repository.MilestoneLogRepository;
+import idatt2106.systemutvikling.sparesti.repository.MilestoneRepository;
+import idatt2106.systemutvikling.sparesti.repository.UserRepository;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.PageImpl;
+import org.springframework.data.domain.PageRequest;
+import org.springframework.data.domain.Pageable;
+
+import java.util.Collections;
+import java.util.List;
+
+import static org.junit.jupiter.api.Assertions.*;
+import static org.mockito.Mockito.*;
+
+public class MilestoneLogServiceTest {
+
+  @Mock
+  private MilestoneRepository milestoneRepository;
+
+  @Mock
+  private UserRepository userRepository;
+
+  @Mock
+  private MilestoneLogRepository milestoneLogRepository;
+
+  @Mock
+  private JWTService jwtService;
+
+  @InjectMocks
+  private MilestoneLogService milestoneLogService;
+
+  @BeforeEach
+  public void setUp() {
+    MockitoAnnotations.openMocks(this);
+  }
+
+  @Test
+  public void testCompleteMilestone() {
+    MilestoneLogDAO milestoneLogDAO = new MilestoneLogDAO();
+    milestoneLogService.completeMilestone(milestoneLogDAO);
+    verify(milestoneLogRepository, times(1)).save(milestoneLogDAO);
+  }
+
+  @Test
+  public void testGetMilestoneLogsByUsernamePaginated() {
+    String username = "testUser";
+    Pageable pageable = PageRequest.of(0, 5);
+    MilestoneLogDAO milestoneLogDAO = new MilestoneLogDAO();
+    milestoneLogDAO.setUserDAO(new UserDAO()); // Ensure UserDAO is not null
+    when(milestoneLogRepository.findMilestoneLogDAOByUserDAO_Username(username, pageable))
+            .thenReturn(new PageImpl<>(Collections.singletonList(milestoneLogDAO), pageable, 1));
+
+    Page<MilestoneDTO> result = milestoneLogService.getMilestoneLogsByUsernamePaginated(username, pageable);
+
+    assertNotNull(result);
+    assertEquals(1, result.getTotalElements());
+  }
+
+  @Test
+  public void testGetMilestoneLogsByUsername() {
+    String username = "testUser";
+    MilestoneLogDAO milestoneLogDAO = new MilestoneLogDAO();
+    milestoneLogDAO.setUserDAO(new UserDAO()); // Ensure UserDAO is not null
+    when(milestoneLogRepository.findMilestoneLogDAOByUserDAO_Username(username))
+            .thenReturn(Collections.singletonList(milestoneLogDAO));
+
+    List<MilestoneDTO> result = milestoneLogService.getMilestoneLogsByUsername(username);
+
+    assertNotNull(result);
+    assertEquals(1, result.size());
+  }
+
+  @Test
+  public void testGetMilestoneLogById() {
+    long id = 1L;
+    MilestoneLogDAO milestoneLogDAO = new MilestoneLogDAO();
+    milestoneLogDAO.setUserDAO(new UserDAO()); // Ensure UserDAO is not null
+    when(milestoneLogRepository.findMilestoneLogDAOByMilestoneId(id))
+            .thenReturn(milestoneLogDAO);
+
+    MilestoneDTO result = milestoneLogService.getMilestoneLogById(id);
+
+    assertNotNull(result);
+  }
+}
\ No newline at end of file
diff --git a/src/test/java/idatt2106/systemutvikling/sparesti/service/UserServiceTest.java b/src/test/java/idatt2106/systemutvikling/sparesti/service/UserServiceTest.java
index 1845b23..2bbacc9 100644
--- a/src/test/java/idatt2106/systemutvikling/sparesti/service/UserServiceTest.java
+++ b/src/test/java/idatt2106/systemutvikling/sparesti/service/UserServiceTest.java
@@ -231,37 +231,6 @@ public class UserServiceTest {
     assertEquals(userCredentialsDTO.getUsername(), userDTO.getUsername());
   }
 
-  @Test
-  public void testUpdatePassword() {
-    // Arrange
-    UserCredentialsDTO userCredentialsDTO = new UserCredentialsDTO();
-    userCredentialsDTO.setUsername("testUser");
-    userCredentialsDTO.setPassword("oldPassword");
-    userCredentialsDTO.setNewPassword("newPassword");
-    UserDAO userDAO = new UserDAO();
-    userDAO.setUsername("testUser");
-    userDAO.setPassword(passwordEncoder.encode("oldPassword"));
-    when(userRepository.findByUsername("testUser")).thenReturn(userDAO);
-    when(passwordEncoder.matches(userCredentialsDTO.getPassword(), userDAO.getPassword())).thenReturn(true);
-    when(passwordEncoder.encode(userCredentialsDTO.getNewPassword())).thenReturn("encodedNewPassword");
-
-    // Mock SecurityContext and Authentication
-    SecurityContext securityContext = Mockito.mock(SecurityContext.class);
-    Authentication authentication = Mockito.mock(Authentication.class);
-    when(authentication.getName()).thenReturn("testUser");
-    when(securityContext.getAuthentication()).thenReturn(authentication);
-    when(authentication.isAuthenticated()).thenReturn(true);
-    when(authentication.getName()).thenReturn("testUser");
-
-    // Act
-    String result = userService.updatePassword(userCredentialsDTO);
-
-    // Assert
-    assertEquals("Password updated", result);
-    verify(userRepository, times(1)).save(userDAO);
-    assertEquals("encodedNewPassword", userDAO.getPassword());
-  }
-
   @Test
   public void testUpdateUserDTO_whenTokenIsNull() {
     // Arrange
-- 
GitLab


From 52b76c488a58618fa15047535bc8eebb11b24a32 Mon Sep 17 00:00:00 2001
From: BiggestGuz <Diblopro@gmail.com>
Date: Mon, 29 Apr 2024 10:26:39 +0200
Subject: [PATCH 4/7] Removed autowired

---
 .../systemutvikling/sparesti/service/UserService.java          | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)

diff --git a/src/main/java/idatt2106/systemutvikling/sparesti/service/UserService.java b/src/main/java/idatt2106/systemutvikling/sparesti/service/UserService.java
index d47fb57..5375ab9 100644
--- a/src/main/java/idatt2106/systemutvikling/sparesti/service/UserService.java
+++ b/src/main/java/idatt2106/systemutvikling/sparesti/service/UserService.java
@@ -30,8 +30,7 @@ public class UserService {
   private final MilestoneService milestoneService;
   private final MilestoneLogService milestoneLogService;
   private final Logger logger = Logger.getLogger(UserService.class.getName());
-  @Autowired
-  private PasswordEncoder passwordEncoder;
+  private final PasswordEncoder passwordEncoder;
 
   @Autowired
   public UserService(UserRepository userRepository, CustomerServiceInterface customerService, JWTService jwtService, AccountServiceInterface accountService, MilestoneService milestoneService, MilestoneLogService milestoneLogService, PasswordEncoder passwordEncoder) {
-- 
GitLab


From f1ac715c78496909b1f154df79a40df9817bbfd0 Mon Sep 17 00:00:00 2001
From: BiggestGuz <Diblopro@gmail.com>
Date: Mon, 29 Apr 2024 10:32:31 +0200
Subject: [PATCH 5/7] Removed another autowired

---
 .../idatt2106/systemutvikling/sparesti/service/UserService.java  | 1 -
 1 file changed, 1 deletion(-)

diff --git a/src/main/java/idatt2106/systemutvikling/sparesti/service/UserService.java b/src/main/java/idatt2106/systemutvikling/sparesti/service/UserService.java
index 5375ab9..905245e 100644
--- a/src/main/java/idatt2106/systemutvikling/sparesti/service/UserService.java
+++ b/src/main/java/idatt2106/systemutvikling/sparesti/service/UserService.java
@@ -32,7 +32,6 @@ public class UserService {
   private final Logger logger = Logger.getLogger(UserService.class.getName());
   private final PasswordEncoder passwordEncoder;
 
-  @Autowired
   public UserService(UserRepository userRepository, CustomerServiceInterface customerService, JWTService jwtService, AccountServiceInterface accountService, MilestoneService milestoneService, MilestoneLogService milestoneLogService, PasswordEncoder passwordEncoder) {
     this.userRepository = userRepository;
     this.customerService = customerService;
-- 
GitLab


From 54c507e1048db7944e06a2c345cdb94f9090db34 Mon Sep 17 00:00:00 2001
From: BiggestGuz <Diblopro@gmail.com>
Date: Mon, 29 Apr 2024 10:50:55 +0200
Subject: [PATCH 6/7] all arg constructor attempt

---
 .../sparesti/service/UserService.java         | 31 ++++++++++---------
 1 file changed, 16 insertions(+), 15 deletions(-)

diff --git a/src/main/java/idatt2106/systemutvikling/sparesti/service/UserService.java b/src/main/java/idatt2106/systemutvikling/sparesti/service/UserService.java
index 905245e..82d33a9 100644
--- a/src/main/java/idatt2106/systemutvikling/sparesti/service/UserService.java
+++ b/src/main/java/idatt2106/systemutvikling/sparesti/service/UserService.java
@@ -9,10 +9,12 @@ import idatt2106.systemutvikling.sparesti.exceptions.ConflictException;
 import idatt2106.systemutvikling.sparesti.exceptions.InvalidCredentialsException;
 import idatt2106.systemutvikling.sparesti.exceptions.UserNotFoundException;
 import idatt2106.systemutvikling.sparesti.mapper.UserMapper;
-import idatt2106.systemutvikling.sparesti.repository.UserRepository;
+import idatt2106.systemutvikling.sparesti.repository.*;
+
 import java.util.Objects;
 import java.util.logging.Logger;
-import org.springframework.beans.factory.annotation.Autowired;
+
+import lombok.AllArgsConstructor;
 import org.springframework.http.HttpStatus;
 import org.springframework.http.ResponseEntity;
 import org.springframework.security.crypto.password.PasswordEncoder;
@@ -21,26 +23,25 @@ import org.springframework.stereotype.Service;
 import java.util.List;
 
 @Service
+@AllArgsConstructor
 public class UserService {
-
-  private final UserRepository userRepository;
+  private PasswordEncoder passwordEncoder;
   private final CustomerServiceInterface customerService;
   private final AccountServiceInterface accountService;
   private final JWTService jwtService;
+
   private final MilestoneService milestoneService;
   private final MilestoneLogService milestoneLogService;
+
+  private final UserRepository userRepository;
+  private final ManualSavingRepository dbSaving;
+  private final MilestoneRepository dbMilestone;
+  private final MilestoneLogRepository dbMilestoneLog;
+  private final ChallengeLogRepository dbChallenge;
+  private final ChallengeRepository dbChallengeLog;
+
   private final Logger logger = Logger.getLogger(UserService.class.getName());
-  private final PasswordEncoder passwordEncoder;
-
-  public UserService(UserRepository userRepository, CustomerServiceInterface customerService, JWTService jwtService, AccountServiceInterface accountService, MilestoneService milestoneService, MilestoneLogService milestoneLogService, PasswordEncoder passwordEncoder) {
-    this.userRepository = userRepository;
-    this.customerService = customerService;
-    this.jwtService = jwtService;
-    this.accountService = accountService;
-    this.milestoneService = milestoneService;
-    this.milestoneLogService = milestoneLogService;
-    this.passwordEncoder = passwordEncoder;
-  }
+
 
   /**
    * Method to get a user by username from the database.
-- 
GitLab


From e3b9a49f2fb5319eda22243a4079fa5a6c9adcb7 Mon Sep 17 00:00:00 2001
From: BiggestGuz <Diblopro@gmail.com>
Date: Mon, 29 Apr 2024 10:57:19 +0200
Subject: [PATCH 7/7] All args constructor fix in user service test

---
 .../systemutvikling/sparesti/service/UserServiceTest.java      | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/src/test/java/idatt2106/systemutvikling/sparesti/service/UserServiceTest.java b/src/test/java/idatt2106/systemutvikling/sparesti/service/UserServiceTest.java
index 2bbacc9..3ee5fe2 100644
--- a/src/test/java/idatt2106/systemutvikling/sparesti/service/UserServiceTest.java
+++ b/src/test/java/idatt2106/systemutvikling/sparesti/service/UserServiceTest.java
@@ -55,7 +55,8 @@ public class UserServiceTest {
   public void setup() {
     MockitoAnnotations.openMocks(this);
     passwordEncoder = mock(PasswordEncoder.class);
-    userService = new UserService(userRepository, customerService, jwtService, accountService, milestoneService, milestoneLogService, passwordEncoder);
+    userService = new UserService(passwordEncoder, customerService, accountService, jwtService, milestoneService, milestoneLogService, userRepository, null, null, null, null, null);
+    when(jwtService.extractUsernameFromToken(anyString())).thenReturn("testUser");
     when(customerService.hasTwoAccounts(anyString())).thenReturn(true);
     when(milestoneLogService.getMilestoneLogsByUsername(anyString())).thenReturn(Collections.emptyList()); // return an empty list
   }
-- 
GitLab