Refactoring - Version stable
This commit is contained in:
@@ -217,6 +217,148 @@ class MembreKeycloakSyncServiceTest {
|
||||
verify(membreRepository).persist(membre);
|
||||
}
|
||||
|
||||
// =========================================================================
|
||||
// promouvoirAdminOrganisationDansKeycloak
|
||||
// =========================================================================
|
||||
|
||||
@Test
|
||||
@DisplayName("promouvoirAdminOrganisation échoue si le membre n'existe pas")
|
||||
void promouvoirAdminOrganisation_failsIfMembreNotFound() {
|
||||
UUID membreId = UUID.randomUUID();
|
||||
when(membreRepository.findByIdOptional(membreId)).thenReturn(Optional.empty());
|
||||
|
||||
assertThatThrownBy(() -> syncService.promouvoirAdminOrganisationDansKeycloak(membreId))
|
||||
.isInstanceOf(NotFoundException.class);
|
||||
}
|
||||
|
||||
@Test
|
||||
@DisplayName("promouvoirAdminOrganisation assigne ADMIN_ORGANISATION et retire MEMBRE/MEMBRE_ACTIF")
|
||||
void promouvoirAdminOrganisation_assignsAdminRoleAndRemovesMemberRoles() {
|
||||
UUID membreId = UUID.randomUUID();
|
||||
UUID keycloakId = UUID.randomUUID();
|
||||
|
||||
Membre membre = new Membre();
|
||||
membre.setId(membreId);
|
||||
membre.setKeycloakId(keycloakId);
|
||||
membre.setEmail("admin@unionflow.dev");
|
||||
membre.setNom("Admin");
|
||||
membre.setPrenom("New");
|
||||
|
||||
when(membreRepository.findByIdOptional(membreId)).thenReturn(Optional.of(membre));
|
||||
|
||||
UserDTO user = new UserDTO();
|
||||
user.setId(keycloakId.toString());
|
||||
user.setEnabled(true);
|
||||
user.setRealmRoles(new java.util.ArrayList<>(java.util.List.of("MEMBRE", "MEMBRE_ACTIF")));
|
||||
user.setRealmName("unionflow");
|
||||
when(userServiceClient.getUserById(eq(keycloakId.toString()), eq("unionflow"))).thenReturn(user);
|
||||
when(userServiceClient.updateUser(anyString(), any(UserDTO.class), anyString())).thenReturn(user);
|
||||
|
||||
syncService.promouvoirAdminOrganisationDansKeycloak(membreId);
|
||||
|
||||
verify(userServiceClient).updateUser(eq(keycloakId.toString()), any(UserDTO.class), eq("unionflow"));
|
||||
assertThat(user.getRealmRoles()).contains("ADMIN_ORGANISATION");
|
||||
assertThat(user.getRealmRoles()).doesNotContain("MEMBRE", "MEMBRE_ACTIF");
|
||||
}
|
||||
|
||||
@Test
|
||||
@DisplayName("promouvoirAdminOrganisation active le compte s'il est désactivé dans Keycloak")
|
||||
void promouvoirAdminOrganisation_enablesDisabledAccount() {
|
||||
UUID membreId = UUID.randomUUID();
|
||||
UUID keycloakId = UUID.randomUUID();
|
||||
|
||||
Membre membre = new Membre();
|
||||
membre.setId(membreId);
|
||||
membre.setKeycloakId(keycloakId);
|
||||
membre.setEmail("disabled-admin@unionflow.dev");
|
||||
membre.setNom("Disabled");
|
||||
membre.setPrenom("Admin");
|
||||
|
||||
when(membreRepository.findByIdOptional(membreId)).thenReturn(Optional.of(membre));
|
||||
|
||||
UserDTO user = new UserDTO();
|
||||
user.setId(keycloakId.toString());
|
||||
user.setEnabled(false); // désactivé
|
||||
user.setRealmRoles(new java.util.ArrayList<>());
|
||||
user.setRealmName("unionflow");
|
||||
when(userServiceClient.getUserById(anyString(), anyString())).thenReturn(user);
|
||||
when(userServiceClient.updateUser(anyString(), any(UserDTO.class), anyString())).thenReturn(user);
|
||||
|
||||
syncService.promouvoirAdminOrganisationDansKeycloak(membreId);
|
||||
|
||||
assertThat(user.getEnabled()).isTrue();
|
||||
verify(userServiceClient).updateUser(anyString(), any(UserDTO.class), anyString());
|
||||
}
|
||||
|
||||
@Test
|
||||
@DisplayName("promouvoirAdminOrganisation provisionne Keycloak si keycloakId est null")
|
||||
void promouvoirAdminOrganisation_provisionesIfNoKeycloakAccount() {
|
||||
UUID membreId = UUID.randomUUID();
|
||||
|
||||
Membre membre = new Membre();
|
||||
membre.setId(membreId);
|
||||
membre.setEmail("no-kc-admin@unionflow.dev");
|
||||
membre.setNom("No");
|
||||
membre.setPrenom("KC");
|
||||
// keycloakId == null
|
||||
|
||||
UUID newKeycloakId = UUID.randomUUID();
|
||||
Membre membreWithKc = new Membre();
|
||||
membreWithKc.setId(membreId);
|
||||
membreWithKc.setEmail("no-kc-admin@unionflow.dev");
|
||||
membreWithKc.setNom("No");
|
||||
membreWithKc.setPrenom("KC");
|
||||
membreWithKc.setKeycloakId(newKeycloakId);
|
||||
|
||||
when(membreRepository.findByIdOptional(membreId))
|
||||
.thenReturn(Optional.of(membre)) // 1er appel (promouvoir) : pas de keycloakId → déclenche provisionnement
|
||||
.thenReturn(Optional.of(membre)) // 2e appel (provisionKeycloakUser interne) : pas de keycloakId
|
||||
.thenReturn(Optional.of(membreWithKc)); // 3e appel : rechargement après provisionnement
|
||||
|
||||
UserSearchResultDTO searchResult = new UserSearchResultDTO();
|
||||
searchResult.setUsers(java.util.Collections.emptyList());
|
||||
when(userServiceClient.searchUsers(any())).thenReturn(searchResult);
|
||||
|
||||
UserDTO createdUser = new UserDTO();
|
||||
createdUser.setId(newKeycloakId.toString());
|
||||
when(userServiceClient.createUser(any(UserDTO.class), anyString())).thenReturn(createdUser);
|
||||
|
||||
UserDTO fetchedUser = new UserDTO();
|
||||
fetchedUser.setId(newKeycloakId.toString());
|
||||
fetchedUser.setEnabled(true);
|
||||
fetchedUser.setRealmRoles(new java.util.ArrayList<>());
|
||||
fetchedUser.setRealmName("unionflow");
|
||||
when(userServiceClient.getUserById(eq(newKeycloakId.toString()), anyString())).thenReturn(fetchedUser);
|
||||
when(userServiceClient.updateUser(anyString(), any(UserDTO.class), anyString())).thenReturn(fetchedUser);
|
||||
|
||||
syncService.promouvoirAdminOrganisationDansKeycloak(membreId);
|
||||
|
||||
verify(userServiceClient).createUser(any(UserDTO.class), eq("unionflow"));
|
||||
verify(userServiceClient).updateUser(eq(newKeycloakId.toString()), any(UserDTO.class), eq("unionflow"));
|
||||
}
|
||||
|
||||
@Test
|
||||
@DisplayName("promouvoirAdminOrganisation lève RuntimeException si l'appel Keycloak échoue")
|
||||
void promouvoirAdminOrganisation_throwsRuntimeExceptionOnKeycloakFailure() {
|
||||
UUID membreId = UUID.randomUUID();
|
||||
UUID keycloakId = UUID.randomUUID();
|
||||
|
||||
Membre membre = new Membre();
|
||||
membre.setId(membreId);
|
||||
membre.setKeycloakId(keycloakId);
|
||||
membre.setEmail("fail-admin@unionflow.dev");
|
||||
membre.setNom("Fail");
|
||||
membre.setPrenom("Admin");
|
||||
|
||||
when(membreRepository.findByIdOptional(membreId)).thenReturn(Optional.of(membre));
|
||||
when(userServiceClient.getUserById(anyString(), anyString()))
|
||||
.thenThrow(new RuntimeException("Keycloak unreachable"));
|
||||
|
||||
assertThatThrownBy(() -> syncService.promouvoirAdminOrganisationDansKeycloak(membreId))
|
||||
.isInstanceOf(RuntimeException.class)
|
||||
.hasMessageContaining("Impossible de promouvoir le compte Keycloak");
|
||||
}
|
||||
|
||||
// =========================================================================
|
||||
// syncMembreToKeycloak
|
||||
// =========================================================================
|
||||
|
||||
@@ -246,6 +246,50 @@ class MembreServiceTest {
|
||||
}
|
||||
}
|
||||
|
||||
// =========================================================================
|
||||
// promouvoirAdminOrganisation
|
||||
// =========================================================================
|
||||
|
||||
@Nested
|
||||
@DisplayName("promouvoirAdminOrganisation")
|
||||
class PromouvoirAdminOrganisationTests {
|
||||
|
||||
@Test
|
||||
@DisplayName("Happy path: membre promu → ACTIF + actif=true immédiatement")
|
||||
void promouvoirAdminOrganisation_setsActifImmediately() {
|
||||
UUID id = UUID.randomUUID();
|
||||
Membre membre = new Membre();
|
||||
membre.setId(id);
|
||||
membre.setEmail("future-admin@unionflow.dev");
|
||||
membre.setNom("Admin");
|
||||
membre.setPrenom("New");
|
||||
membre.setStatutCompte("EN_ATTENTE_VALIDATION");
|
||||
membre.setActif(false);
|
||||
|
||||
when(membreRepository.findByIdOptional(id)).thenReturn(Optional.of(membre));
|
||||
doNothing().when(membreRepository).persist(any(Membre.class));
|
||||
|
||||
Membre result = membreService.promouvoirAdminOrganisation(id);
|
||||
|
||||
assertThat(result.getStatutCompte()).isEqualTo("ACTIF");
|
||||
assertThat(result.getActif()).isTrue();
|
||||
verify(membreRepository).persist(membre);
|
||||
}
|
||||
|
||||
@Test
|
||||
@DisplayName("Membre introuvable: lève NotFoundException")
|
||||
void promouvoirAdminOrganisation_notFound_throws() {
|
||||
UUID id = UUID.randomUUID();
|
||||
when(membreRepository.findByIdOptional(id)).thenReturn(Optional.empty());
|
||||
|
||||
assertThatThrownBy(() -> membreService.promouvoirAdminOrganisation(id))
|
||||
.isInstanceOf(jakarta.ws.rs.NotFoundException.class)
|
||||
.hasMessageContaining("non trouvé");
|
||||
|
||||
verify(membreRepository, never()).persist(any(Membre.class));
|
||||
}
|
||||
}
|
||||
|
||||
// =========================================================================
|
||||
// mettreAJourMembre
|
||||
// =========================================================================
|
||||
|
||||
Reference in New Issue
Block a user