From cbb7e15b94eeaf977f982798a96154d591dc3cf6 Mon Sep 17 00:00:00 2001 From: aniebietafia Date: Fri, 28 Feb 2025 18:17:33 +0100 Subject: [PATCH 1/2] feat: implement add users to an organisation. feat: implement add users to organization. --- .../controller/OrganisationController.java | 27 ++- .../organisation/dto/AddUserRequestDTO.java | 15 ++ .../organisation/dto/AddUserResponseDTO.java | 16 ++ .../OrganisationNotFoundException.java | 7 + .../UserExistsInOrganisationException.java | 7 + .../interfaces/AddUserResponse.java | 4 + .../AddUsersToOrganisationService.java | 72 +++++++ .../AddUsersToOrganisationServiceTest.java | 191 ++++++++++++++++++ 8 files changed, 333 insertions(+), 6 deletions(-) create mode 100644 src/main/java/hng_java_boilerplate/organisation/dto/AddUserRequestDTO.java create mode 100644 src/main/java/hng_java_boilerplate/organisation/dto/AddUserResponseDTO.java create mode 100644 src/main/java/hng_java_boilerplate/organisation/exception/OrganisationNotFoundException.java create mode 100644 src/main/java/hng_java_boilerplate/organisation/exception/UserExistsInOrganisationException.java create mode 100644 src/main/java/hng_java_boilerplate/organisation/interfaces/AddUserResponse.java create mode 100644 src/main/java/hng_java_boilerplate/organisation/service/AddUsersToOrganisationService.java create mode 100644 src/test/java/hng_java_boilerplate/organisation/service/AddUsersToOrganisationServiceTest.java diff --git a/src/main/java/hng_java_boilerplate/organisation/controller/OrganisationController.java b/src/main/java/hng_java_boilerplate/organisation/controller/OrganisationController.java index 06bbed3d2..8a13f3c4c 100644 --- a/src/main/java/hng_java_boilerplate/organisation/controller/OrganisationController.java +++ b/src/main/java/hng_java_boilerplate/organisation/controller/OrganisationController.java @@ -1,7 +1,8 @@ package hng_java_boilerplate.organisation.controller; -import hng_java_boilerplate.organisation.dto.CreateOrganisationRequestDto; -import hng_java_boilerplate.organisation.dto.CreateOrganisationResponseDto; +import hng_java_boilerplate.organisation.dto.*; +import hng_java_boilerplate.organisation.interfaces.AddUserResponse; +import hng_java_boilerplate.organisation.service.AddUsersToOrganisationService; import hng_java_boilerplate.organisation.service.OrganisationService; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.validation.Valid; @@ -9,10 +10,7 @@ import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.security.core.Authentication; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; @RestController @RequiredArgsConstructor @@ -20,6 +18,7 @@ @Tag(name="Organisation") public class OrganisationController { private final OrganisationService organisationService; + private final AddUsersToOrganisationService addUsersToOrganisationService; @PostMapping public ResponseEntity createOrganisation( @@ -30,4 +29,20 @@ public ResponseEntity createOrganisation( organisationService.create(orgRequest, activeUser) ); } + + @PostMapping("/{organisationId}/users") + public ResponseEntity addUserToOrganisation( + @PathVariable("organisationId") String organisationId, + @RequestBody @Valid AddUserRequestDTO orgRequest, + Authentication authenticatedUser + ) { + AddUserResponse response = addUsersToOrganisationService.addUserToOrganisation(organisationId, orgRequest, + authenticatedUser); + + if (response instanceof AddUserExceptionDto) { + return ResponseEntity.status(((AddUserExceptionDto) response).status_code()).body(response); + } + + return ResponseEntity.status(HttpStatus.OK).body(response); + } } diff --git a/src/main/java/hng_java_boilerplate/organisation/dto/AddUserRequestDTO.java b/src/main/java/hng_java_boilerplate/organisation/dto/AddUserRequestDTO.java new file mode 100644 index 000000000..422665369 --- /dev/null +++ b/src/main/java/hng_java_boilerplate/organisation/dto/AddUserRequestDTO.java @@ -0,0 +1,15 @@ +package hng_java_boilerplate.organisation.dto; + +import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.Size; +import lombok.Builder; + +import java.util.List; + +@Builder +public record AddUserRequestDTO( + @NotEmpty(message = "User ID cannot be empty") + @Size(min = 1, message = "Provide a valid user ID") + List user_ids +) { +} \ No newline at end of file diff --git a/src/main/java/hng_java_boilerplate/organisation/dto/AddUserResponseDTO.java b/src/main/java/hng_java_boilerplate/organisation/dto/AddUserResponseDTO.java new file mode 100644 index 000000000..f4f85b662 --- /dev/null +++ b/src/main/java/hng_java_boilerplate/organisation/dto/AddUserResponseDTO.java @@ -0,0 +1,16 @@ +package hng_java_boilerplate.organisation.dto; + +import hng_java_boilerplate.organisation.interfaces.AddUserResponse; +import lombok.Builder; + +import java.util.List; + +@Builder +public record AddUserResponseDTO( + String status, + String message, + String organization_id, + List users_added_to_organisation, + Integer status_code +) implements AddUserResponse { +} diff --git a/src/main/java/hng_java_boilerplate/organisation/exception/OrganisationNotFoundException.java b/src/main/java/hng_java_boilerplate/organisation/exception/OrganisationNotFoundException.java new file mode 100644 index 000000000..2ca3ee52f --- /dev/null +++ b/src/main/java/hng_java_boilerplate/organisation/exception/OrganisationNotFoundException.java @@ -0,0 +1,7 @@ +package hng_java_boilerplate.organisation.exception; + +public class OrganisationNotFoundException extends RuntimeException { + public OrganisationNotFoundException(String message) { + super(message); + } +} diff --git a/src/main/java/hng_java_boilerplate/organisation/exception/UserExistsInOrganisationException.java b/src/main/java/hng_java_boilerplate/organisation/exception/UserExistsInOrganisationException.java new file mode 100644 index 000000000..4d5f2ea7b --- /dev/null +++ b/src/main/java/hng_java_boilerplate/organisation/exception/UserExistsInOrganisationException.java @@ -0,0 +1,7 @@ +package hng_java_boilerplate.organisation.exception; + +public class UserExistsInOrganisationException extends RuntimeException { + public UserExistsInOrganisationException(String message) { + super(message); + } +} diff --git a/src/main/java/hng_java_boilerplate/organisation/interfaces/AddUserResponse.java b/src/main/java/hng_java_boilerplate/organisation/interfaces/AddUserResponse.java new file mode 100644 index 000000000..5070a2c98 --- /dev/null +++ b/src/main/java/hng_java_boilerplate/organisation/interfaces/AddUserResponse.java @@ -0,0 +1,4 @@ +package hng_java_boilerplate.organisation.interfaces; + +public interface AddUserResponse { +} diff --git a/src/main/java/hng_java_boilerplate/organisation/service/AddUsersToOrganisationService.java b/src/main/java/hng_java_boilerplate/organisation/service/AddUsersToOrganisationService.java new file mode 100644 index 000000000..76efd4c70 --- /dev/null +++ b/src/main/java/hng_java_boilerplate/organisation/service/AddUsersToOrganisationService.java @@ -0,0 +1,72 @@ +package hng_java_boilerplate.organisation.service; + +import hng_java_boilerplate.exception.ConflictException; +import hng_java_boilerplate.exception.NotFoundException; +import hng_java_boilerplate.exception.UnAuthorizedException; +import hng_java_boilerplate.organisation.dto.AddUserRequestDTO; +import hng_java_boilerplate.organisation.dto.AddUserResponseDTO; +import hng_java_boilerplate.organisation.entity.Organisation; +import hng_java_boilerplate.organisation.interfaces.AddUserResponse; +import hng_java_boilerplate.organisation.repository.OrganisationRepository; +import hng_java_boilerplate.user.entity.User; +import hng_java_boilerplate.user.repository.UserRepository; +import lombok.RequiredArgsConstructor; +import org.springframework.http.HttpStatus; +import org.springframework.security.core.Authentication; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.server.ResponseStatusException; + +import java.util.ArrayList; +import java.util.List; + +@Service +@RequiredArgsConstructor +public class AddUsersToOrganisationService { + private final OrganisationRepository organisationRepository; + private final UserRepository userRepository; + + @Transactional + public AddUserResponse addUserToOrganisation( + String organisationId, + AddUserRequestDTO orgRequest, + Authentication authenticatedUser + ) { + Organisation organisation = organisationRepository.findById(organisationId). + orElseThrow(() -> new ResponseStatusException(HttpStatus.NOT_FOUND, + "Organisation with id " + organisationId + " does not exist")); + + User user = (User) authenticatedUser.getPrincipal(); + + if (!organisation.getOwner().equals(user.getId())) { + throw new UnAuthorizedException("User is not owner of the organisation"); + } + + List addedUserIds = new ArrayList<>(); + + for (String userId : orgRequest.user_ids()) { + if (organisation.getUsers().stream().anyMatch(user1 -> user1.getId().equals(userId))) { + throw new ConflictException("User with id " + userId + " is already in the organisation"); + } + + var userExists = userRepository.findById(userId); + if (userExists.isEmpty()) { + throw new NotFoundException("User with id " + userId + " does not exist"); + } + + organisation.getUsers().add(userExists.get()); + userExists.get().getOrganisations().add(organisation); + addedUserIds.add(userId); + } + + organisationRepository.save(organisation); + + return AddUserResponseDTO.builder() + .status("success") + .message("Users added to organisation") + .organization_id(organisation.getId()) + .users_added_to_organisation(addedUserIds) + .status_code(HttpStatus.OK.value()) + .build(); + } +} diff --git a/src/test/java/hng_java_boilerplate/organisation/service/AddUsersToOrganisationServiceTest.java b/src/test/java/hng_java_boilerplate/organisation/service/AddUsersToOrganisationServiceTest.java new file mode 100644 index 000000000..795e49480 --- /dev/null +++ b/src/test/java/hng_java_boilerplate/organisation/service/AddUsersToOrganisationServiceTest.java @@ -0,0 +1,191 @@ +package hng_java_boilerplate.organisation.service; + +import hng_java_boilerplate.exception.ConflictException; +import hng_java_boilerplate.exception.NotFoundException; +import hng_java_boilerplate.exception.UnAuthorizedException; +import hng_java_boilerplate.organisation.dto.AddUserRequestDTO; +import hng_java_boilerplate.organisation.dto.AddUserResponseDTO; +import hng_java_boilerplate.organisation.entity.Organisation; +import hng_java_boilerplate.organisation.repository.OrganisationRepository; +import hng_java_boilerplate.user.entity.User; +import hng_java_boilerplate.user.repository.UserRepository; +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.Authentication; +import org.springframework.web.server.ResponseStatusException; + +import java.util.ArrayList; +import java.util.List; +import java.util.Optional; + +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.Mockito.*; + +@ExtendWith(MockitoExtension.class) +public class AddUsersToOrganisationServiceTest { + + @Mock + private OrganisationRepository organisationRepository; + + @Mock + private UserRepository userRepository; + + @Mock + private Authentication authenticatedUser; + + @InjectMocks + private AddUsersToOrganisationService addUsersToOrganisationService; + + private AddUserRequestDTO orgRequest; + private User user; + + // Add test cases here + @Test + void testAddUserToOrganisation_OrganisationNotFound() { + String organisationId = "b1e009c5-a197-42f9-b9a3-98fc357b5f08"; + AddUserRequestDTO orgRequest = new AddUserRequestDTO(List.of("user1", "user2", "user3")); + + when(organisationRepository.findById(organisationId)).thenReturn(Optional.empty()); + + ResponseStatusException exception = assertThrows(ResponseStatusException.class, () -> + addUsersToOrganisationService.addUserToOrganisation(organisationId, orgRequest, authenticatedUser)); + assertEquals(404, exception.getStatusCode().value()); + assertEquals("Organisation with id " + organisationId + " does not exist", exception.getReason()); + + verify(organisationRepository).findById(organisationId); + verifyNoMoreInteractions(organisationRepository); + verifyNoInteractions(userRepository); + verifyNoInteractions(authenticatedUser); + } + + @Test + void testAddUserToOrganisation_UserNotOwner() { + String organisationId = "b1e009c5-a197-42f9-b9a3-98fc357b5f08"; + AddUserRequestDTO orgRequest = new AddUserRequestDTO(List.of("user1", "user2", "user3")); + User activeUser = new User(); + activeUser.setId("user-123"); + + Organisation organisation = new Organisation(); + organisation.setOwner("user-456"); + + when(organisationRepository.findById(organisationId)).thenReturn(Optional.of(organisation)); + when(authenticatedUser.getPrincipal()).thenReturn(activeUser); + + UnAuthorizedException exception = assertThrows(UnAuthorizedException.class, () -> + addUsersToOrganisationService.addUserToOrganisation(organisationId, orgRequest, authenticatedUser)); + assertEquals("User is not owner of the organisation", exception.getMessage()); + + verify(organisationRepository).findById(organisationId); + verify(authenticatedUser).getPrincipal(); + verifyNoMoreInteractions(organisationRepository); + verifyNoMoreInteractions(authenticatedUser); + verifyNoInteractions(userRepository); + } + + // Test 3: User already in organisation + @Test + void testAddUserToOrganisation_UserAlreadyInOrganisation() { + String organisationId = "b1e009c5-a197-42f9-b9a3-98fc357b5f08"; + AddUserRequestDTO orgRequest = new AddUserRequestDTO(List.of("user1", "user2", "user3")); + User activeUser = new User(); + activeUser.setId("user-123"); + + User existingUser = new User(); + existingUser.setId("user1"); + + Organisation organisation = new Organisation(); + organisation.setId(organisationId); + organisation.setOwner("user-123"); + organisation.setUsers(List.of(existingUser)); + + when(organisationRepository.findById(organisationId)).thenReturn(Optional.of(organisation)); + when(authenticatedUser.getPrincipal()).thenReturn(activeUser); + + ConflictException exception = assertThrows(ConflictException.class, () -> + addUsersToOrganisationService.addUserToOrganisation(organisationId, orgRequest, authenticatedUser)); + assertEquals("User with id user1 is already in the organisation", exception.getMessage()); + + verify(organisationRepository).findById(organisationId); + verify(authenticatedUser).getPrincipal(); + verifyNoMoreInteractions(organisationRepository); + verifyNoMoreInteractions(authenticatedUser); + verifyNoInteractions(userRepository); + } + + // Test 4: User does not exist + @Test + void testAddUserToOrganisation_UserDoesNotExist() { + String organisationId = "b1e009c5-a197-42f9-b9a3-98fc357b5f08"; + AddUserRequestDTO orgRequest = new AddUserRequestDTO(List.of("user2")); + User activeUser = new User(); + activeUser.setId("user-123"); + + Organisation organisation = new Organisation(); + organisation.setId(organisationId); + organisation.setOwner("user-123"); + organisation.setUsers(new ArrayList<>()); + + when(organisationRepository.findById(organisationId)).thenReturn(Optional.of(organisation)); + when(authenticatedUser.getPrincipal()).thenReturn(activeUser); + when(userRepository.findById("user2")).thenReturn(Optional.empty()); + + NotFoundException exception = assertThrows(NotFoundException.class, () -> + addUsersToOrganisationService.addUserToOrganisation(organisationId, orgRequest, authenticatedUser)); + assertEquals("User with id user2 does not exist", exception.getMessage()); + + verify(organisationRepository).findById(organisationId); + verify(authenticatedUser).getPrincipal(); + verify(userRepository).findById("user2"); + verifyNoMoreInteractions(organisationRepository); + verifyNoMoreInteractions(authenticatedUser); + verifyNoMoreInteractions(userRepository); + } + + // Test 5: Successful addition of users to organisation + @Test + void testAddUserToOrganisation_Successful() { + String organisationId = "b1e009c5-a197-42f9-b9a3-98fc357b5f08"; + AddUserRequestDTO orgRequest = new AddUserRequestDTO(List.of("user1", "user2")); + User activeUser = new User(); + activeUser.setId("user-123"); + + Organisation organisation = new Organisation(); + organisation.setId(organisationId); + organisation.setOwner("user-123"); + organisation.setUsers(new ArrayList<>()); + + User user1 = new User(); + user1.setId("user1"); + user1.setOrganisations(new ArrayList<>()); + + User user2 = new User(); + user2.setId("user2"); + user2.setOrganisations(new ArrayList<>()); + + when(organisationRepository.findById(organisationId)).thenReturn(Optional.of(organisation)); + when(authenticatedUser.getPrincipal()).thenReturn(activeUser); + when(userRepository.findById("user1")).thenReturn(Optional.of(user1)); + when(userRepository.findById("user2")).thenReturn(Optional.of(user2)); + + var response = (AddUserResponseDTO) addUsersToOrganisationService.addUserToOrganisation(organisationId, + orgRequest, authenticatedUser); + + assertEquals("success", response.status()); + assertEquals("Users added to organisation", response.message()); + assertEquals(organisationId, response.organization_id()); + assertEquals(List.of("user1", "user2"), response.users_added_to_organisation()); + assertEquals(200, response.status_code()); + + verify(organisationRepository).findById(organisationId); + verify(authenticatedUser).getPrincipal(); + verify(userRepository).findById("user1"); + verify(userRepository).findById("user2"); + verify(organisationRepository).save(organisation); + verifyNoMoreInteractions(organisationRepository); + verifyNoMoreInteractions(authenticatedUser); + verifyNoMoreInteractions(userRepository); + } +} \ No newline at end of file From f12b383ba19793820061f2e3a977c896942530c2 Mon Sep 17 00:00:00 2001 From: aniebietafia Date: Sat, 1 Mar 2025 13:59:00 +0100 Subject: [PATCH 2/2] feat: Implement add users to an organisation. --- .../controller/OrganisationController.java | 4 ---- .../exception/OrganisationNotFoundException.java | 7 ------- .../exception/UserExistsInOrganisationException.java | 7 ------- .../service/AddUsersToOrganisationService.java | 4 +--- .../service/AddUsersToOrganisationServiceTest.java | 10 ++-------- 5 files changed, 3 insertions(+), 29 deletions(-) delete mode 100644 src/main/java/hng_java_boilerplate/organisation/exception/OrganisationNotFoundException.java delete mode 100644 src/main/java/hng_java_boilerplate/organisation/exception/UserExistsInOrganisationException.java diff --git a/src/main/java/hng_java_boilerplate/organisation/controller/OrganisationController.java b/src/main/java/hng_java_boilerplate/organisation/controller/OrganisationController.java index 8a13f3c4c..7b8df87e7 100644 --- a/src/main/java/hng_java_boilerplate/organisation/controller/OrganisationController.java +++ b/src/main/java/hng_java_boilerplate/organisation/controller/OrganisationController.java @@ -39,10 +39,6 @@ public ResponseEntity addUserToOrganisation( AddUserResponse response = addUsersToOrganisationService.addUserToOrganisation(organisationId, orgRequest, authenticatedUser); - if (response instanceof AddUserExceptionDto) { - return ResponseEntity.status(((AddUserExceptionDto) response).status_code()).body(response); - } - return ResponseEntity.status(HttpStatus.OK).body(response); } } diff --git a/src/main/java/hng_java_boilerplate/organisation/exception/OrganisationNotFoundException.java b/src/main/java/hng_java_boilerplate/organisation/exception/OrganisationNotFoundException.java deleted file mode 100644 index 2ca3ee52f..000000000 --- a/src/main/java/hng_java_boilerplate/organisation/exception/OrganisationNotFoundException.java +++ /dev/null @@ -1,7 +0,0 @@ -package hng_java_boilerplate.organisation.exception; - -public class OrganisationNotFoundException extends RuntimeException { - public OrganisationNotFoundException(String message) { - super(message); - } -} diff --git a/src/main/java/hng_java_boilerplate/organisation/exception/UserExistsInOrganisationException.java b/src/main/java/hng_java_boilerplate/organisation/exception/UserExistsInOrganisationException.java deleted file mode 100644 index 4d5f2ea7b..000000000 --- a/src/main/java/hng_java_boilerplate/organisation/exception/UserExistsInOrganisationException.java +++ /dev/null @@ -1,7 +0,0 @@ -package hng_java_boilerplate.organisation.exception; - -public class UserExistsInOrganisationException extends RuntimeException { - public UserExistsInOrganisationException(String message) { - super(message); - } -} diff --git a/src/main/java/hng_java_boilerplate/organisation/service/AddUsersToOrganisationService.java b/src/main/java/hng_java_boilerplate/organisation/service/AddUsersToOrganisationService.java index 76efd4c70..dea84f895 100644 --- a/src/main/java/hng_java_boilerplate/organisation/service/AddUsersToOrganisationService.java +++ b/src/main/java/hng_java_boilerplate/organisation/service/AddUsersToOrganisationService.java @@ -15,7 +15,6 @@ import org.springframework.security.core.Authentication; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import org.springframework.web.server.ResponseStatusException; import java.util.ArrayList; import java.util.List; @@ -33,8 +32,7 @@ public AddUserResponse addUserToOrganisation( Authentication authenticatedUser ) { Organisation organisation = organisationRepository.findById(organisationId). - orElseThrow(() -> new ResponseStatusException(HttpStatus.NOT_FOUND, - "Organisation with id " + organisationId + " does not exist")); + orElseThrow(() -> new NotFoundException("Organisation with id " + organisationId + " does not exist")); User user = (User) authenticatedUser.getPrincipal(); diff --git a/src/test/java/hng_java_boilerplate/organisation/service/AddUsersToOrganisationServiceTest.java b/src/test/java/hng_java_boilerplate/organisation/service/AddUsersToOrganisationServiceTest.java index 795e49480..804db9bc8 100644 --- a/src/test/java/hng_java_boilerplate/organisation/service/AddUsersToOrganisationServiceTest.java +++ b/src/test/java/hng_java_boilerplate/organisation/service/AddUsersToOrganisationServiceTest.java @@ -15,7 +15,6 @@ import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; import org.springframework.security.core.Authentication; -import org.springframework.web.server.ResponseStatusException; import java.util.ArrayList; import java.util.List; @@ -42,7 +41,6 @@ public class AddUsersToOrganisationServiceTest { private AddUserRequestDTO orgRequest; private User user; - // Add test cases here @Test void testAddUserToOrganisation_OrganisationNotFound() { String organisationId = "b1e009c5-a197-42f9-b9a3-98fc357b5f08"; @@ -50,10 +48,9 @@ void testAddUserToOrganisation_OrganisationNotFound() { when(organisationRepository.findById(organisationId)).thenReturn(Optional.empty()); - ResponseStatusException exception = assertThrows(ResponseStatusException.class, () -> + NotFoundException exception = assertThrows(NotFoundException.class, () -> addUsersToOrganisationService.addUserToOrganisation(organisationId, orgRequest, authenticatedUser)); - assertEquals(404, exception.getStatusCode().value()); - assertEquals("Organisation with id " + organisationId + " does not exist", exception.getReason()); + assertEquals("Organisation with id " + organisationId + " does not exist", exception.getMessage()); verify(organisationRepository).findById(organisationId); verifyNoMoreInteractions(organisationRepository); @@ -85,7 +82,6 @@ void testAddUserToOrganisation_UserNotOwner() { verifyNoInteractions(userRepository); } - // Test 3: User already in organisation @Test void testAddUserToOrganisation_UserAlreadyInOrganisation() { String organisationId = "b1e009c5-a197-42f9-b9a3-98fc357b5f08"; @@ -115,7 +111,6 @@ void testAddUserToOrganisation_UserAlreadyInOrganisation() { verifyNoInteractions(userRepository); } - // Test 4: User does not exist @Test void testAddUserToOrganisation_UserDoesNotExist() { String organisationId = "b1e009c5-a197-42f9-b9a3-98fc357b5f08"; @@ -144,7 +139,6 @@ void testAddUserToOrganisation_UserDoesNotExist() { verifyNoMoreInteractions(userRepository); } - // Test 5: Successful addition of users to organisation @Test void testAddUserToOrganisation_Successful() { String organisationId = "b1e009c5-a197-42f9-b9a3-98fc357b5f08";