diff --git a/src/main/java/de/ozgcloud/admin/keycloak/AddGroupData.java b/src/main/java/de/ozgcloud/admin/keycloak/AddGroupData.java index 2845e10babe0bed5eaf22a1b5d5bb043d0532a6b..bfef1afa5a70b06618372fcb6e7c1eb035f3e872 100644 --- a/src/main/java/de/ozgcloud/admin/keycloak/AddGroupData.java +++ b/src/main/java/de/ozgcloud/admin/keycloak/AddGroupData.java @@ -9,7 +9,6 @@ import lombok.ToString; @ToString public class AddGroupData { - private String parentId; private String name; private String organisationsEinheitId; } diff --git a/src/main/java/de/ozgcloud/admin/keycloak/KeycloakApiService.java b/src/main/java/de/ozgcloud/admin/keycloak/KeycloakApiService.java index 09b865543a58b34c7a89233f6f75ee0253bc8d6c..057d0ab9622b949f7214008b131e956d76b70629 100644 --- a/src/main/java/de/ozgcloud/admin/keycloak/KeycloakApiService.java +++ b/src/main/java/de/ozgcloud/admin/keycloak/KeycloakApiService.java @@ -20,17 +20,11 @@ class KeycloakApiService { } public String addGroup(GroupRepresentation groupRepresentation) { - try (var response = addParentOrChildGroup(groupRepresentation)) { + try (var response = groupsResource.add(groupRepresentation)) { return getAddedResourceIdFromResponse(response); } } - Response addParentOrChildGroup(GroupRepresentation groupRepresentation) { - return groupRepresentation.getParentId() == null ? - groupsResource.add(groupRepresentation) : - groupsResource.group(groupRepresentation.getParentId()).subGroup(groupRepresentation); - } - String getAddedResourceIdFromResponse(Response response) { if (response.getStatus() == Response.Status.CREATED.getStatusCode()) { return extractResourceIdFromLocationHeader(response.getHeaderString("Location")); diff --git a/src/main/java/de/ozgcloud/admin/organisationseinheit/OrganisationsEinheitMapper.java b/src/main/java/de/ozgcloud/admin/organisationseinheit/OrganisationsEinheitMapper.java index 193a6f05d8410e8733aad684fc8a4fb6761825f5..da1634ec80bf9a5169022184c50bba014dd735a4 100644 --- a/src/main/java/de/ozgcloud/admin/organisationseinheit/OrganisationsEinheitMapper.java +++ b/src/main/java/de/ozgcloud/admin/organisationseinheit/OrganisationsEinheitMapper.java @@ -13,6 +13,5 @@ interface OrganisationsEinheitMapper { @Mapping(target = "zufiId", source = "id") OrganisationsEinheit fromGrpc(GrpcOrganisationsEinheit grpcOrganisationsEinheit); - @Mapping(target = "parentId", source = "parentKeycloakId") - AddGroupData toAddGroupData(OrganisationsEinheit organisationsEinheit, String parentKeycloakId); + AddGroupData toAddGroupData(OrganisationsEinheit organisationsEinheit); } diff --git a/src/main/java/de/ozgcloud/admin/organisationseinheit/OrganisationsEinheitSynchronizationException.java b/src/main/java/de/ozgcloud/admin/organisationseinheit/OrganisationsEinheitSynchronizationException.java new file mode 100644 index 0000000000000000000000000000000000000000..cc431ca257e3c6b6acc109c09154e128709694df --- /dev/null +++ b/src/main/java/de/ozgcloud/admin/organisationseinheit/OrganisationsEinheitSynchronizationException.java @@ -0,0 +1,8 @@ +package de.ozgcloud.admin.organisationseinheit; + +public class OrganisationsEinheitSynchronizationException extends RuntimeException { + + public OrganisationsEinheitSynchronizationException(String message) { + super(message); + } +} diff --git a/src/main/java/de/ozgcloud/admin/organisationseinheit/SyncService.java b/src/main/java/de/ozgcloud/admin/organisationseinheit/SyncService.java index 751d4767ff3075d6b5b8f2e06c2be4810365c2e4..85200b0b659b65f05d63047280b81dd62c383570 100644 --- a/src/main/java/de/ozgcloud/admin/organisationseinheit/SyncService.java +++ b/src/main/java/de/ozgcloud/admin/organisationseinheit/SyncService.java @@ -2,7 +2,6 @@ package de.ozgcloud.admin.organisationseinheit; import java.util.List; import java.util.Optional; -import java.util.stream.Stream; import org.springframework.stereotype.Service; @@ -90,46 +89,20 @@ class SyncService { } public void syncAddedOrganisationsEinheiten(long syncTimestamp) { - sortInAdditionOrder(repository.findAllWithoutSyncResult()).forEach( + repository.findAllWithoutSyncResult().forEach( organisationsEinheit -> syncAddedOrganisationsEinheit(syncTimestamp, organisationsEinheit)); } - Stream<OrganisationsEinheit> sortInAdditionOrder(Stream<OrganisationsEinheit> organisationsEinheiten) { - return organisationsEinheiten.sorted((org1, org2) -> { - if (org1.getParentId() == null && org2.getParentId() == null) { - return 0; - } - if (org1.getParentId() == null) { - return -1; - } - if (org2.getParentId() == null) { - return 1; - } - if (org1.getId().equals(org2.getParentId())) { - return -1; - } - if (org1.getParentId().equals(org2.getId())) { - return 1; - } - return 0; - }); - } - void syncAddedOrganisationsEinheit(long syncTimestamp, OrganisationsEinheit organisationsEinheit) { - var parent = findParent(organisationsEinheit); - if (parent.isEmpty() || parent.get().getKeycloakId() != null) { - var parentKeycloakId = parent.map(OrganisationsEinheit::getKeycloakId).orElse(null); - addAsGroupInKeycloak(organisationsEinheit, parentKeycloakId).ifPresent( - addedGroupId -> updateAfterSuccessfulGroupCreation(organisationsEinheit, syncTimestamp, addedGroupId)); - } + addAsGroupInKeycloak(organisationsEinheit).ifPresent( + addedGroupId -> updateAfterSuccessfulGroupCreation(organisationsEinheit, syncTimestamp, addedGroupId)); } - Optional<OrganisationsEinheit> findParent(OrganisationsEinheit organisationsEinheit) { - return Optional.ofNullable(organisationsEinheit.getParentId()).flatMap(repository::findById); - } - - Optional<String> addAsGroupInKeycloak(OrganisationsEinheit organisationsEinheit, String parentKeycloakId) { - var addGroupData = organisationsEinheitMapper.toAddGroupData(organisationsEinheit, parentKeycloakId); + Optional<String> addAsGroupInKeycloak(OrganisationsEinheit organisationsEinheit) { + if (organisationsEinheit.getParentId() != null) { + throw new OrganisationsEinheitSynchronizationException("Organisationseinheit %s has parent".formatted(organisationsEinheit.getOrganisationsEinheitId())); + } + var addGroupData = organisationsEinheitMapper.toAddGroupData(organisationsEinheit); return addGroupInKeycloak(addGroupData); } diff --git a/src/test/java/de/ozgcloud/admin/keycloak/AddGroupDataTestFactory.java b/src/test/java/de/ozgcloud/admin/keycloak/AddGroupDataTestFactory.java index b53d872617b553a2c708e6b653905231889af445..cea95944ffe15491d5a60ead097db8a8a29c4989 100644 --- a/src/test/java/de/ozgcloud/admin/keycloak/AddGroupDataTestFactory.java +++ b/src/test/java/de/ozgcloud/admin/keycloak/AddGroupDataTestFactory.java @@ -2,7 +2,6 @@ package de.ozgcloud.admin.keycloak; public class AddGroupDataTestFactory { - public static final String PARENT_ID = GroupRepresentationTestFactory.ID; public static final String NAME = GroupRepresentationTestFactory.NAME; public static final String ORGANISATIONS_EINHEIT_ID = GroupRepresentationTestFactory.ORGANISATIONS_EINHEIT_ID; @@ -12,7 +11,6 @@ public class AddGroupDataTestFactory { public static AddGroupData.AddGroupDataBuilder createBuilder() { return new AddGroupData.AddGroupDataBuilder() - .parentId(PARENT_ID) .name(NAME) .organisationsEinheitId(ORGANISATIONS_EINHEIT_ID); } diff --git a/src/test/java/de/ozgcloud/admin/keycloak/GroupMapperTest.java b/src/test/java/de/ozgcloud/admin/keycloak/GroupMapperTest.java index adaddc58f2a88a674a6e66e2fba85c698ba81570..790451bfb93c34eec09fe0168cbb0eee2d84c73b 100644 --- a/src/test/java/de/ozgcloud/admin/keycloak/GroupMapperTest.java +++ b/src/test/java/de/ozgcloud/admin/keycloak/GroupMapperTest.java @@ -180,13 +180,6 @@ class GroupMapperTest { doReturn(ATTRIBUTES).when(mapper).getAttributes(addGroupData); } - @Test - void shouldSetParentId() { - var groupRepresentation = callMapper(); - - assertThat(groupRepresentation.getParentId()).isEqualTo(addGroupData.getParentId()); - } - @Test void shouldSetName() { var groupRepresentation = callMapper(); diff --git a/src/test/java/de/ozgcloud/admin/keycloak/KeycloakApiServiceITCase.java b/src/test/java/de/ozgcloud/admin/keycloak/KeycloakApiServiceITCase.java index f4bbd5036da9a34a15704c19209e2d4571eb9705..f2c7dd6c83ee9651cca09c17ad7eda8927ac94eb 100644 --- a/src/test/java/de/ozgcloud/admin/keycloak/KeycloakApiServiceITCase.java +++ b/src/test/java/de/ozgcloud/admin/keycloak/KeycloakApiServiceITCase.java @@ -8,7 +8,6 @@ import java.util.Optional; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; -import org.keycloak.admin.client.resource.GroupsResource; import org.keycloak.representations.idm.GroupRepresentation; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.test.context.ContextConfiguration; @@ -26,8 +25,6 @@ class KeycloakApiServiceITCase { private KeycloakApiService service; @Autowired private KeycloakApiProperties properties; - @Autowired - private GroupsResource groupsResource; @Nested class TestGetAllGroups { @@ -158,20 +155,6 @@ class KeycloakApiServiceITCase { .asList().isEmpty(); } - @Test - void shouldAddSubgroupToParent() { - var parentToAdd = createUniqueGroupRepresentation("shouldAddSubgroupToParent-parent"); - var parentId = service.addGroup(parentToAdd); - var childToAdd = createUniqueGroupRepresentation("shouldAddSubgroupToParent-child"); - childToAdd.setParentId(parentId); - - var childId = service.addGroup(childToAdd); - - var subgroupsInKc = groupsResource.group(parentId).getSubGroups(0, Integer.MAX_VALUE, true); - assertThat(subgroupsInKc).hasSize(1).first().extracting(GroupRepresentation::getId, GroupRepresentation::getParentId) - .contains(childId, parentId); - } - private GroupRepresentation createUniqueGroupRepresentation(String nameSuffix) { // LoremIpsum does not guarantee unique results when called repeatedly var groupName = "%s (%s)".formatted(LoremIpsum.getInstance().getName(), nameSuffix); diff --git a/src/test/java/de/ozgcloud/admin/keycloak/KeycloakApiServiceTest.java b/src/test/java/de/ozgcloud/admin/keycloak/KeycloakApiServiceTest.java index f04a47581dc3c2d7c67a79edb6f4ec3f1c69572b..ffded7cebae2a78c00c622ba341eb840eec4f760 100644 --- a/src/test/java/de/ozgcloud/admin/keycloak/KeycloakApiServiceTest.java +++ b/src/test/java/de/ozgcloud/admin/keycloak/KeycloakApiServiceTest.java @@ -6,7 +6,6 @@ import static org.mockito.Mockito.*; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; -import org.keycloak.admin.client.resource.GroupResource; import org.keycloak.admin.client.resource.GroupsResource; import org.keycloak.representations.idm.GroupRepresentation; import org.mockito.InjectMocks; @@ -35,15 +34,15 @@ class KeycloakApiServiceTest { @BeforeEach void init() { - doReturn(response).when(service).addParentOrChildGroup(groupRepresentation); + when(groupsResource.add(groupRepresentation)).thenReturn(response); doReturn(RESOURCE_ID).when(service).getAddedResourceIdFromResponse(response); } @Test - void shouldAddParentOrChildGroup() { + void shouldCallGroupsResource() { callService(); - verify(service).addParentOrChildGroup(groupRepresentation); + verify(groupsResource).add(groupRepresentation); } @Test @@ -65,69 +64,6 @@ class KeycloakApiServiceTest { } } - @Nested - class TestAddParentOrChildGroup { - - private GroupRepresentation groupRepresentation; - - @Nested - class OnParentGroup { - - @BeforeEach - void init() { - groupRepresentation = GroupRepresentationTestFactory.create(); - groupRepresentation.setParentId(null); - when(groupsResource.add(groupRepresentation)).thenReturn(response); - } - - @Test - void shouldCallGroupsResource() { - callService(); - - verify(groupsResource).add(groupRepresentation); - } - - @Test - void shouldReturnResponse() { - var serviceResponse = callService(); - - assertThat(serviceResponse).isEqualTo(response); - } - } - - @Nested - class OnChildGroup { - - @Mock - private GroupResource groupResource; - - @BeforeEach - void init() { - groupRepresentation = GroupRepresentationTestFactory.create(); - when(groupsResource.group(GroupRepresentationTestFactory.PARENT_ID)).thenReturn(groupResource); - when(groupResource.subGroup(groupRepresentation)).thenReturn(response); - } - - @Test - void shouldCallGroupResource() { - callService(); - - verify(groupResource).subGroup(groupRepresentation); - } - - @Test - void shouldReturnResponse() { - var serviceResponse = callService(); - - assertThat(serviceResponse).isEqualTo(response); - } - } - - private Response callService() { - return service.addParentOrChildGroup(groupRepresentation); - } - } - @Nested class TestGetAddedResourceIdFromResponse { diff --git a/src/test/java/de/ozgcloud/admin/organisationseinheit/OrganisationsEinheitMapperTest.java b/src/test/java/de/ozgcloud/admin/organisationseinheit/OrganisationsEinheitMapperTest.java index 9192df6b2e1ac6545099bec61c84006758dadde3..53ec27998c68c86ce3dcdb7b91a1a8ba77fb8c20 100644 --- a/src/test/java/de/ozgcloud/admin/organisationseinheit/OrganisationsEinheitMapperTest.java +++ b/src/test/java/de/ozgcloud/admin/organisationseinheit/OrganisationsEinheitMapperTest.java @@ -4,7 +4,6 @@ import static org.assertj.core.api.Assertions.*; import java.util.Collections; import java.util.Objects; -import java.util.UUID; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; @@ -46,18 +45,14 @@ class OrganisationsEinheitMapperTest { @Nested class TestToAddGroupData { - public static final String PARENT_KEYCLOAK_ID = UUID.randomUUID().toString(); - @Test void shouldMap() { - var mapped = mapper.toAddGroupData(OrganisationsEinheitTestFactory.create(), PARENT_KEYCLOAK_ID); + var mapped = mapper.toAddGroupData(OrganisationsEinheitTestFactory.create()); assertThat(mapped).extracting( - AddGroupData::getParentId, AddGroupData::getName, AddGroupData::getOrganisationsEinheitId ).containsExactly( - PARENT_KEYCLOAK_ID, OrganisationsEinheitTestFactory.NAME, OrganisationsEinheitTestFactory.ORGANISATIONS_EINHEIT_ID ); diff --git a/src/test/java/de/ozgcloud/admin/organisationseinheit/SyncAddedOrganisationsEinheitenITCase.java b/src/test/java/de/ozgcloud/admin/organisationseinheit/SyncAddedOrganisationsEinheitenITCase.java index ca1b0366500f5ea25e29cef7ebdaee5deff22484..1af0cf1617c485ebb64936aba8e653cdafa83ed1 100644 --- a/src/test/java/de/ozgcloud/admin/organisationseinheit/SyncAddedOrganisationsEinheitenITCase.java +++ b/src/test/java/de/ozgcloud/admin/organisationseinheit/SyncAddedOrganisationsEinheitenITCase.java @@ -2,11 +2,9 @@ package de.ozgcloud.admin.organisationseinheit; import static org.assertj.core.api.Assertions.*; import static org.assertj.core.groups.Tuple.tuple; -import static org.mockito.Mockito.*; import java.time.Instant; import java.util.List; -import java.util.Optional; import java.util.UUID; import org.junit.jupiter.api.BeforeEach; @@ -19,7 +17,6 @@ import org.springframework.test.context.ContextConfiguration; import de.ozgcloud.admin.common.KeycloakInitializer; import de.ozgcloud.admin.keycloak.Group; import de.ozgcloud.admin.keycloak.KeycloakRemoteService; -import de.ozgcloud.admin.keycloak.ResourceCreationException; import de.ozgcloud.common.test.DbInitializer; import de.ozgcloud.common.test.ITCase; @@ -53,48 +50,6 @@ class SyncAddedOrganisationsEinheitenITCase { .contains(tuple(topLevel.getName(), topLevel.getOrganisationsEinheitId(), List.of())); } - @Test - void shouldSynchronizeAddedTopLevelGroupWithChild() { - var topLevel = topLevel("shouldSynchronizeAddedTopLevelGroupWithChild"); - var childLevel1 = childLevel("shouldSynchronizeAddedTopLevelGroupWithChild", topLevel); - operations.save(topLevel); - operations.save(childLevel1); - - service.syncAddedOrganisationsEinheiten(syncTimestamp); - - assertThat(findGroupInKeycloak(topLevel.getName())).isPresent().get() - .extracting(Group::getSubGroups).asList().extracting("name") - .containsExactly(childLevel1.getName()); - } - - @Test - void shouldSynchronizeChildAddedToAlreadySynchronizedParent() { - var parent = topLevel("shouldSynchronizeChildAddedToAlreadySynchronizedParent"); - syncOrganisationsEinheitToKeycloak(parent); - var childLevel1 = childLevel("shouldSynchronizeChildAddedToAlreadySynchronizedParent", parent); - operations.save(childLevel1); - - service.syncAddedOrganisationsEinheiten(syncTimestamp); - - assertThat(findGroupInKeycloak(parent.getName())).isPresent().get() - .extracting(Group::getSubGroups).asList().extracting("name") - .containsExactly(childLevel1.getName()); - } - - @Test - void shouldNotAddChildIfParentWasNotSynchronized() { - var topLevel = topLevel("shouldNotAddChildIfParentWasNotSynchronized"); - var childLevel1 = childLevel("shouldNotAddChildIfParentWasNotSynchronized", topLevel); - operations.save(topLevel); - operations.save(childLevel1); - doThrow(new ResourceCreationException("OMG!")).when(keycloakRemoteService) - .addGroup(argThat(addGroupData -> addGroupData.getName().equals(topLevel.getName()))); - - service.syncAddedOrganisationsEinheiten(syncTimestamp); - - assertThat(findGroupInKeycloak(childLevel1.getName())).isEmpty(); - } - private static OrganisationsEinheit topLevel(String nameSuffix) { return OrganisationsEinheitTestFactory.createBuilder() .id(UUID.randomUUID().toString()) @@ -104,25 +59,4 @@ class SyncAddedOrganisationsEinheitenITCase { .name("topLevel (%s)".formatted(nameSuffix)) .build(); } - - private static OrganisationsEinheit childLevel(String nameSuffix, OrganisationsEinheit parent) { - return OrganisationsEinheitTestFactory.createBuilder() - .id(UUID.randomUUID().toString()) - .parentId(parent.getId()) - .keycloakId(null) - .syncResult(null) - .name("childLevel1 (%s)".formatted(nameSuffix)) - .build(); - } - - private Optional<Group> findGroupInKeycloak(String groupName) { - return keycloakRemoteService.getGroupsWithOrganisationsEinheitId() - .filter(group -> groupName.equals(group.getName())) - .findFirst(); - } - - private void syncOrganisationsEinheitToKeycloak(OrganisationsEinheit organisationsEinheit) { - operations.save(organisationsEinheit); - service.syncAddedOrganisationsEinheiten(syncTimestamp); - } } diff --git a/src/test/java/de/ozgcloud/admin/organisationseinheit/SyncServiceTest.java b/src/test/java/de/ozgcloud/admin/organisationseinheit/SyncServiceTest.java index c448edf7fc37374623679fb861e5cc062bc6058f..52660504a334711babe2579bd5e7c4612bd2f763 100644 --- a/src/test/java/de/ozgcloud/admin/organisationseinheit/SyncServiceTest.java +++ b/src/test/java/de/ozgcloud/admin/organisationseinheit/SyncServiceTest.java @@ -5,7 +5,6 @@ import static org.mockito.ArgumentMatchers.*; import static org.mockito.Mockito.*; import java.time.Instant; -import java.util.Arrays; import java.util.Collections; import java.util.List; import java.util.Optional; @@ -422,16 +421,14 @@ class SyncServiceTest { private final long syncTimestamp = Instant.now().toEpochMilli(); private final OrganisationsEinheit withoutSyncResult1 = OrganisationsEinheitTestFactory.createBuilder().id("A").build(); private final OrganisationsEinheit withoutSyncResult2 = OrganisationsEinheitTestFactory.createBuilder().id("B").build(); - private final OrganisationsEinheit[] unsortedOrganisationsEinheiten = new OrganisationsEinheit[] { withoutSyncResult2, withoutSyncResult1 }; - private final OrganisationsEinheit[] sortedOrganisationsEinheiten = new OrganisationsEinheit[] { withoutSyncResult1, withoutSyncResult2 }; + private final OrganisationsEinheit[] organisationsEinheiten = new OrganisationsEinheit[] { withoutSyncResult2, withoutSyncResult1 }; @Captor private ArgumentCaptor<Stream<OrganisationsEinheit>> streamArgumentCaptor; @BeforeEach void setUp() { - when(repository.findAllWithoutSyncResult()).thenReturn(Stream.of(unsortedOrganisationsEinheiten)); - doReturn(Stream.of(sortedOrganisationsEinheiten)).when(service).sortInAdditionOrder(any()); + when(repository.findAllWithoutSyncResult()).thenReturn(Stream.of(organisationsEinheiten)); doNothing().when(service).syncAddedOrganisationsEinheit(anyLong(), any()); } @@ -442,14 +439,6 @@ class SyncServiceTest { verify(repository).findAllWithoutSyncResult(); } - @Test - void shouldSortInAdditionOrder() { - callService(); - - verify(service).sortInAdditionOrder(streamArgumentCaptor.capture()); - assertThat(streamArgumentCaptor.getValue()).containsExactly(unsortedOrganisationsEinheiten); - } - @Test void shouldSynchronizeFirstOrganisationsEinheit() { callService(); @@ -464,55 +453,11 @@ class SyncServiceTest { verify(service).syncAddedOrganisationsEinheit(syncTimestamp, withoutSyncResult2); } - @Test - void shouldSynchronizeInOrder() { - var inOrder = inOrder(service); - - callService(); - - Arrays.stream(sortedOrganisationsEinheiten).forEach(organisationsEinheit -> - inOrder.verify(service).syncAddedOrganisationsEinheit(syncTimestamp, organisationsEinheit)); - } - private void callService() { service.syncAddedOrganisationsEinheiten(syncTimestamp); } } - @Nested - class TestSortInAdditionOrder { - - @Test - void shouldTopLevelOrgComeFirst() { - var orgWithParent = OrganisationsEinheitTestFactory.create(); - var orgWithoutParent = OrganisationsEinheitTestFactory.createBuilder().parentId(null).build(); - - var sorted = service.sortInAdditionOrder(Stream.of(orgWithParent, orgWithoutParent)); - - assertThat(sorted).containsExactly(orgWithoutParent, orgWithParent); - } - - @Test - void shouldParentComeBeforeChild() { - var parent = OrganisationsEinheitTestFactory.create(); - var child = OrganisationsEinheitTestFactory.createBuilder().parentId(parent.getId()).build(); - - var sorted = service.sortInAdditionOrder(Stream.of(child, parent)); - - assertThat(sorted).containsExactly(parent, child); - } - - @Test - void shouldPreserveOrderForTopLevelGroups() { - var orgWithoutParent1 = OrganisationsEinheitTestFactory.createBuilder().parentId(null).build(); - var orgWithoutParent2 = OrganisationsEinheitTestFactory.createBuilder().parentId(null).build(); - - var sorted = service.sortInAdditionOrder(Stream.of(orgWithoutParent1, orgWithoutParent2)); - - assertThat(sorted).containsExactly(orgWithoutParent1, orgWithoutParent2); - } - } - @Nested class TestSyncAddedOrganisationsEinheit { @@ -520,106 +465,33 @@ class SyncServiceTest { private final String addedGroupId = UUID.randomUUID().toString(); private final String parentKeycloakId = UUID.randomUUID().toString(); private final OrganisationsEinheit organisationsEinheit = OrganisationsEinheitTestFactory.create(); - private final OrganisationsEinheit parentWithoutKeycloakId = OrganisationsEinheitTestFactory.createBuilder().keycloakId(null).build(); - private final OrganisationsEinheit parentWithKeycloakId = OrganisationsEinheitTestFactory.createBuilder().keycloakId(parentKeycloakId).build(); @Test - void shouldFindParentKeycloakId() { - doReturn(Optional.of(parentWithoutKeycloakId)).when(service).findParent(organisationsEinheit); + void shouldAddAsGroupInKeycloak() { + doReturn(Optional.empty()).when(service).addAsGroupInKeycloak(organisationsEinheit); callService(); - verify(service).findParent(organisationsEinheit); + verify(service).addAsGroupInKeycloak(organisationsEinheit); } - @Nested - class OnParentHasNoKeycloakId { - - @BeforeEach - void init() { - doReturn(Optional.of(parentWithoutKeycloakId)).when(service).findParent(organisationsEinheit); - } - - @Test - void shouldNotAddAsGroupInKeycloak() { - callService(); - - verify(service, never()).addAsGroupInKeycloak(any(), any()); - } - } - - @Nested - class OnOrganisationsEinheitIsTopLevel { - - @BeforeEach - void init() { - doReturn(Optional.empty()).when(service).findParent(organisationsEinheit); - } - - @Test - void shouldAddAsGroupInKeycloakWithNullParent() { - doReturn(Optional.empty()).when(service).addAsGroupInKeycloak(organisationsEinheit, null); - - callService(); - - verify(service).addAsGroupInKeycloak(organisationsEinheit, null); - } - - @Test - void shouldUpdateAfterSuccessfulGroupCreation() { - doReturn(Optional.of(addedGroupId)).when(service).addAsGroupInKeycloak(organisationsEinheit, null); - doNothing().when(service).updateAfterSuccessfulGroupCreation(organisationsEinheit, syncTimestamp, addedGroupId); - - callService(); - - verify(service).updateAfterSuccessfulGroupCreation(organisationsEinheit, syncTimestamp, addedGroupId); - } - - @Test - void shouldNotUpdate() { - doReturn(Optional.empty()).when(service).addAsGroupInKeycloak(organisationsEinheit, null); + @Test + void shouldUpdateAfterSuccessfulGroupCreation() { + doReturn(Optional.of(addedGroupId)).when(service).addAsGroupInKeycloak(organisationsEinheit); + doNothing().when(service).updateAfterSuccessfulGroupCreation(organisationsEinheit, syncTimestamp, addedGroupId); - callService(); + callService(); - verify(service, never()).updateAfterSuccessfulGroupCreation(any(), anyLong(), any()); - } + verify(service).updateAfterSuccessfulGroupCreation(organisationsEinheit, syncTimestamp, addedGroupId); } - @Nested - class OnParentHasKeycloakId { - - @BeforeEach - void init() { - doReturn(Optional.of(parentWithKeycloakId)).when(service).findParent(organisationsEinheit); - } - - @Test - void shouldAddAsGroupInKeycloakWithNullParent() { - doReturn(Optional.empty()).when(service).addAsGroupInKeycloak(organisationsEinheit, parentKeycloakId); - - callService(); - - verify(service).addAsGroupInKeycloak(organisationsEinheit, parentKeycloakId); - } - - @Test - void shouldUpdateAfterSuccessfulGroupCreation() { - doReturn(Optional.of(addedGroupId)).when(service).addAsGroupInKeycloak(organisationsEinheit, parentKeycloakId); - doNothing().when(service).updateAfterSuccessfulGroupCreation(organisationsEinheit, syncTimestamp, addedGroupId); - - callService(); - - verify(service).updateAfterSuccessfulGroupCreation(organisationsEinheit, syncTimestamp, addedGroupId); - } - - @Test - void shouldNotUpdate() { - doReturn(Optional.empty()).when(service).addAsGroupInKeycloak(organisationsEinheit, parentKeycloakId); + @Test + void shouldNotUpdate() { + doReturn(Optional.empty()).when(service).addAsGroupInKeycloak(organisationsEinheit); - callService(); + callService(); - verify(service, never()).updateAfterSuccessfulGroupCreation(any(), anyLong(), any()); - } + verify(service, never()).updateAfterSuccessfulGroupCreation(any(), anyLong(), any()); } private void callService() { @@ -628,87 +500,57 @@ class SyncServiceTest { } @Nested - class TestFindParent { - - @Nested - class OnParentIdIsNull { - @Test - void shouldReturnEmpty() { - var parent = service.findParent(OrganisationsEinheitTestFactory.createBuilder().parentId(null).build()); - - assertThat(parent).isEmpty(); - } - } + class TestAddAsGroupInKeycloak { @Nested - class OnParentIdIsNotNull { + class OnParentIdIsNotSet { - private final String PARENT_KEYCLOAK_ID = UUID.randomUUID().toString(); - private final OrganisationsEinheit organisationsEinheit = OrganisationsEinheitTestFactory.create(); - private final OrganisationsEinheit parent = OrganisationsEinheitTestFactory.createBuilder().keycloakId(PARENT_KEYCLOAK_ID).build(); + private final OrganisationsEinheit organisationsEinheit = OrganisationsEinheitTestFactory.createBuilder().parentId(null).build(); + private final AddGroupData addGroupData = AddGroupDataTestFactory.create(); + private final String addedGroupId = UUID.randomUUID().toString(); @BeforeEach void init() { - when(repository.findById(OrganisationsEinheitTestFactory.PARENT_ID)).thenReturn(Optional.of(parent)); + when(organisationsEinheitMapper.toAddGroupData(organisationsEinheit)).thenReturn(addGroupData); + doReturn(Optional.of(addedGroupId)).when(service).addGroupInKeycloak(addGroupData); } @Test - void shouldFindById() { + void shouldCreateAddGroupData() { callService(); - verify(repository).findById(OrganisationsEinheitTestFactory.PARENT_ID); + verify(organisationsEinheitMapper).toAddGroupData(organisationsEinheit); } @Test - void shouldReturnParent() { - var found = callService(); - - assertThat(found).isPresent().get().isEqualTo(parent); - } + void shouldAddGroupInKeycloak() { + callService(); - private Optional<OrganisationsEinheit> callService() { - return service.findParent(organisationsEinheit); + verify(service).addGroupInKeycloak(addGroupData); } - } - } - - @Nested - class TestAddAsGroupInKeycloak { - - private final OrganisationsEinheit organisationsEinheit = OrganisationsEinheitTestFactory.create(); - private final String parentKeycloakId = UUID.randomUUID().toString(); - private final AddGroupData addGroupData = AddGroupDataTestFactory.create(); - private final String addedGroupId = UUID.randomUUID().toString(); - @BeforeEach - void init() { - when(organisationsEinheitMapper.toAddGroupData(organisationsEinheit, parentKeycloakId)).thenReturn(addGroupData); - doReturn(Optional.of(addedGroupId)).when(service).addGroupInKeycloak(addGroupData); - } - - @Test - void shouldCreateAddGroupData() { - callService(); - - verify(organisationsEinheitMapper).toAddGroupData(organisationsEinheit, parentKeycloakId); - } + @Test + void shouldReturnAddedGroupId() { + var returnedGroupId = callService(); - @Test - void shouldAddGroupInKeycloak() { - callService(); + assertThat(returnedGroupId).get().isEqualTo(addedGroupId); + } - verify(service).addGroupInKeycloak(addGroupData); + private Optional<String> callService() { + return service.addAsGroupInKeycloak(organisationsEinheit); + } } - @Test - void shouldReturnAddedGroupId() { - var returnedGroupId = callService(); - - assertThat(returnedGroupId).get().isEqualTo(addedGroupId); - } + @Nested + class OnParentIdIsSet { - private Optional<String> callService() { - return service.addAsGroupInKeycloak(organisationsEinheit, parentKeycloakId); + @Test + void shouldThrowException() { + var withParentId = OrganisationsEinheitTestFactory.create(); + assertThatExceptionOfType(OrganisationsEinheitSynchronizationException.class) + .isThrownBy(() -> service.addAsGroupInKeycloak(withParentId)) + .withMessage("Organisationseinheit " + withParentId.getOrganisationsEinheitId() + " has parent"); + } } }