diff --git a/pom.xml b/pom.xml index ccb8de3bfd4dcbb34e522ade41b81e7bbe5125cd..915ccea3e9f6dfbca7d73078bb0a325dc625d97e 100644 --- a/pom.xml +++ b/pom.xml @@ -89,10 +89,6 @@ <artifactId>spring-boot-configuration-processor</artifactId> <optional>true</optional> </dependency> - <dependency> - <groupId>net.devh</groupId> - <artifactId>grpc-client-spring-boot-starter</artifactId> - </dependency> <!-- ShedLock --> <dependency> diff --git a/src/main/java/de/ozgcloud/admin/organisationseinheit/SyncService.java b/src/main/java/de/ozgcloud/admin/organisationseinheit/SyncService.java index 85200b0b659b65f05d63047280b81dd62c383570..2e8cf4bf5c2bc97711782f5915dbdbbf248fe78e 100644 --- a/src/main/java/de/ozgcloud/admin/organisationseinheit/SyncService.java +++ b/src/main/java/de/ozgcloud/admin/organisationseinheit/SyncService.java @@ -23,14 +23,14 @@ class SyncService { private final OrganisationsEinheitMapper organisationsEinheitMapper; public void syncOrganisationsEinheitenFromKeycloak(long syncTimestamp) { - keycloakRemoteService.getGroupsWithOrganisationsEinheitId().forEach(group -> syncGroups(group, null, syncTimestamp)); + keycloakRemoteService.getGroupsWithOrganisationsEinheitId().forEach(group -> syncGroupsWithSubGroups(group, null, syncTimestamp)); repository.setUnsyncedAsDeleted(syncTimestamp); } - void syncGroups(Group group, OrganisationsEinheit parent, long syncTimestamp) { + void syncGroupsWithSubGroups(Group group, OrganisationsEinheit parent, long syncTimestamp) { var synced = syncGroup(group, parent, syncTimestamp); var saved = saveSyncedOrganisationsEinheit(synced); - group.getSubGroups().forEach(subGroup -> syncGroups(subGroup, saved, syncTimestamp)); + group.getSubGroups().forEach(subGroup -> syncGroupsWithSubGroups(subGroup, saved, syncTimestamp)); } OrganisationsEinheit syncGroup(Group group, OrganisationsEinheit parent, long syncTimestamp) { diff --git a/src/test/java/de/ozgcloud/admin/organisationseinheit/OrganisationsEinheitControllerTest.java b/src/test/java/de/ozgcloud/admin/organisationseinheit/OrganisationsEinheitControllerTest.java index 3e6dd9250606bddadaf863b154e328ead35476d9..a913eb55dcfaeeb4c89da5a8085b04a3bef75e22 100644 --- a/src/test/java/de/ozgcloud/admin/organisationseinheit/OrganisationsEinheitControllerTest.java +++ b/src/test/java/de/ozgcloud/admin/organisationseinheit/OrganisationsEinheitControllerTest.java @@ -89,10 +89,12 @@ class OrganisationsEinheitControllerTest { class TestGetById { private final OrganisationsEinheit organisationsEinheit = OrganisationsEinheitTestFactory.create(); + private final EntityModel<OrganisationsEinheit> entityModel = EntityModel.of(organisationsEinheit); @BeforeEach void setUp() { when(organisationsEinheitService.getOrganisationsEinheitById(OrganisationsEinheitTestFactory.ID)).thenReturn(organisationsEinheit); + when(assembler.toModel(organisationsEinheit)).thenReturn(entityModel); } @Test @@ -115,6 +117,13 @@ class OrganisationsEinheitControllerTest { doRequest().andExpect(status().isOk()); } + @Test + void shouldReturnEntityModel() { + var response = controller.getById(OrganisationsEinheitTestFactory.ID); + + assertThat(response).isEqualTo(entityModel); + } + @SneakyThrows private ResultActions doRequest() { return mockMvc.perform(get(OrganisationsEinheitController.PATH + "/" + OrganisationsEinheitTestFactory.ID)); @@ -124,11 +133,15 @@ class OrganisationsEinheitControllerTest { @Nested class TestGetChildren { - private final List<OrganisationsEinheit> children = List.of(OrganisationsEinheitTestFactory.create()); + private final OrganisationsEinheit organisationsEinheit = OrganisationsEinheitTestFactory.create(); + private final List<OrganisationsEinheit> children = List.of(organisationsEinheit); + private final CollectionModel<EntityModel<OrganisationsEinheit>> collectionModel = CollectionModel.of( + List.of(EntityModel.of(organisationsEinheit))); @BeforeEach void setUp() { when(organisationsEinheitService.getChildren(OrganisationsEinheitTestFactory.ID)).thenReturn(children); + when(assembler.toChildrenCollectionModel(OrganisationsEinheitTestFactory.ID, children)).thenReturn(collectionModel); } @Test @@ -151,6 +164,13 @@ class OrganisationsEinheitControllerTest { verify(assembler).toChildrenCollectionModel(OrganisationsEinheitTestFactory.ID, children); } + @Test + void shouldReturnCollectionModel() { + var response = controller.getChildren(OrganisationsEinheitTestFactory.ID); + + assertThat(response).isEqualTo(collectionModel); + } + @SneakyThrows private ResultActions doRequest() { return mockMvc.perform(get(OrganisationsEinheitController.PATH + "/" + OrganisationsEinheitTestFactory.ID + "/children")); diff --git a/src/test/java/de/ozgcloud/admin/organisationseinheit/OrganisationsEinheitModelAssemblerTest.java b/src/test/java/de/ozgcloud/admin/organisationseinheit/OrganisationsEinheitModelAssemblerTest.java index 0a79e4253ef8860897ef3a04c820e894c5b80bfe..c726c6b5219bdadedb46e336c2baa9fed5edee5f 100644 --- a/src/test/java/de/ozgcloud/admin/organisationseinheit/OrganisationsEinheitModelAssemblerTest.java +++ b/src/test/java/de/ozgcloud/admin/organisationseinheit/OrganisationsEinheitModelAssemblerTest.java @@ -11,6 +11,8 @@ import java.util.UUID; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; +import org.mockito.ArgumentCaptor; +import org.mockito.Captor; import org.mockito.InjectMocks; import org.mockito.Spy; import org.springframework.hateoas.CollectionModel; @@ -71,6 +73,10 @@ class OrganisationsEinheitModelAssemblerTest { private CollectionModel<EntityModel<OrganisationsEinheit>> childrenCollectionModel; @Spy private final HalModelBuilder halModelBuilder = HalModelBuilder.emptyHalModel(); + @Captor + private ArgumentCaptor<LinkRelation> linkRelationArgumentCaptor; + @Captor + private ArgumentCaptor<Collection<EntityModel<OrganisationsEinheit>>> collectionModelContentArgumentCaptor; @BeforeEach void setUp() { @@ -78,8 +84,7 @@ class OrganisationsEinheitModelAssemblerTest { childOrganisationsEinheit = OrganisationsEinheitTestFactory.createBuilder().id(UUID.randomUUID().toString()) .parentId(parentOrganisationsEinheit.getId()).build(); parentOrganisationsEinheit = parentOrganisationsEinheit.toBuilder().child(childOrganisationsEinheit).build(); - childrenCollectionModel = CollectionModel.of( - List.of(EntityModel.of(childOrganisationsEinheit))); + childrenCollectionModel = CollectionModel.of(List.of(EntityModel.of(childOrganisationsEinheit))); doReturn(childrenCollectionModel).when(assembler) .toChildrenCollectionModel(parentOrganisationsEinheit.getId(), parentOrganisationsEinheit.getChildren()); } @@ -95,7 +100,9 @@ class OrganisationsEinheitModelAssemblerTest { void shouldEmbedChildrenModels() { assembler.embedChildOrganisationsEinheiten(parentOrganisationsEinheit, halModelBuilder); - verify(halModelBuilder).embed(any(Collection.class), any(LinkRelation.class)); + verify(halModelBuilder).embed(collectionModelContentArgumentCaptor.capture(), linkRelationArgumentCaptor.capture()); + assertThat(collectionModelContentArgumentCaptor.getValue()).usingRecursiveComparison().isEqualTo(childrenCollectionModel.getContent()); + assertThat(linkRelationArgumentCaptor.getValue().toString()).isEqualTo(REL_CHILD_ORGANISATIONS_EINHEITEN); } @Test diff --git a/src/test/java/de/ozgcloud/admin/organisationseinheit/OrganisationsEinheitRepositoryITCase.java b/src/test/java/de/ozgcloud/admin/organisationseinheit/OrganisationsEinheitRepositoryITCase.java index ced0b42ccd586c5b3588ed5cb4927f805c243a25..dcfeebde1d6aa5bfb83944ec11c110f72dd833a8 100644 --- a/src/test/java/de/ozgcloud/admin/organisationseinheit/OrganisationsEinheitRepositoryITCase.java +++ b/src/test/java/de/ozgcloud/admin/organisationseinheit/OrganisationsEinheitRepositoryITCase.java @@ -111,7 +111,7 @@ class OrganisationsEinheitRepositoryITCase { } @Test - void shouldReturnEmptyOnNotFoundSyncResultNull() { + void shouldReturnEmptyOnSyncResultNull() { operations.save(OrganisationsEinheitTestFactory.createBuilder().id(null).syncResult(null).build()); var organisationsEinheit = repository.findSyncedByKeycloakId(OrganisationsEinheitTestFactory.KEYCLOAK_ID); @@ -145,12 +145,12 @@ class OrganisationsEinheitRepositoryITCase { private final OrganisationsEinheit deleted1 = OrganisationsEinheitTestFactory.createBuilder() .id(null) .organisationsEinheitId(DELETED_ORGANISATIONS_EINHEIT_ID_1) - .lastSyncTimestamp(Instant.now().minusSeconds(300).toEpochMilli()) + .lastSyncTimestamp(OrganisationsEinheitTestFactory.LAST_SYNC_UPDATE - 1) .build(); private final OrganisationsEinheit deleted2 = OrganisationsEinheitTestFactory.createBuilder() .id(null) .organisationsEinheitId(DELETED_ORGANISATIONS_EINHEIT_ID_2) - .lastSyncTimestamp(Instant.now().minusSeconds(30000).toEpochMilli()) + .lastSyncTimestamp(OrganisationsEinheitTestFactory.LAST_SYNC_UPDATE - 2) .build(); private final OrganisationsEinheit synced1 = OrganisationsEinheitTestFactory.createBuilder() .id(null) @@ -235,7 +235,8 @@ class OrganisationsEinheitRepositoryITCase { void shouldFindAllWithoutSyncResult() { var allWithoutSyncResult = repository.findAllWithoutSyncResult(); - assertThat(allWithoutSyncResult).extracting(OrganisationsEinheit::getId).containsExactlyInAnyOrder(WITHOUT_SYNC_RESULT_ID_1, WITHOUT_SYNC_RESULT_ID_2); + assertThat(allWithoutSyncResult).extracting(OrganisationsEinheit::getId) + .containsExactlyInAnyOrder(WITHOUT_SYNC_RESULT_ID_1, WITHOUT_SYNC_RESULT_ID_2); } } diff --git a/src/test/java/de/ozgcloud/admin/organisationseinheit/OrganisationsEinheitServiceTest.java b/src/test/java/de/ozgcloud/admin/organisationseinheit/OrganisationsEinheitServiceTest.java index c864b9a6b9cc466792da674c1bb1e8a199a419f5..e151636ee95ef52d2dab645c0e19ad5b134f1114 100644 --- a/src/test/java/de/ozgcloud/admin/organisationseinheit/OrganisationsEinheitServiceTest.java +++ b/src/test/java/de/ozgcloud/admin/organisationseinheit/OrganisationsEinheitServiceTest.java @@ -137,11 +137,25 @@ class OrganisationsEinheitServiceTest { @Nested class TestGetChildren { + private final OrganisationsEinheit organisationsEinheit = OrganisationsEinheitTestFactory.create(); + + @BeforeEach + void setUp() { + when(repository.findChildren(OrganisationsEinheitTestFactory.ID)).thenReturn(List.of(organisationsEinheit)); + } + @Test void shouldCallRepository() { service.getChildren(OrganisationsEinheitTestFactory.ID); verify(repository).findChildren(OrganisationsEinheitTestFactory.ID); } + + @Test + void shouldReturnChildren() { + var children = service.getChildren(OrganisationsEinheitTestFactory.ID); + + assertThat(children).containsExactly(organisationsEinheit); + } } } \ No newline at end of file diff --git a/src/test/java/de/ozgcloud/admin/organisationseinheit/OrganisationsEinheitSettingsTestFactory.java b/src/test/java/de/ozgcloud/admin/organisationseinheit/OrganisationsEinheitSettingsTestFactory.java index ababf88ba11eb1378cc4416c357098c48abd8bc7..c5028fb0e25bb8b6127e623a4e09b75794545d61 100644 --- a/src/test/java/de/ozgcloud/admin/organisationseinheit/OrganisationsEinheitSettingsTestFactory.java +++ b/src/test/java/de/ozgcloud/admin/organisationseinheit/OrganisationsEinheitSettingsTestFactory.java @@ -15,4 +15,9 @@ public class OrganisationsEinheitSettingsTestFactory { .signatur(SIGNATUR); } + public static OrganisationsEinheitSettings.OrganisationsEinheitSettingsBuilder createNewBuilder() { + return OrganisationsEinheitSettings.builder() + .signatur(LoremIpsum.getInstance().getWords(3)); + } + } diff --git a/src/test/java/de/ozgcloud/admin/organisationseinheit/OrganisationsEinheitTestFactory.java b/src/test/java/de/ozgcloud/admin/organisationseinheit/OrganisationsEinheitTestFactory.java index 2feb3311fb010748e58beed1f48b9a132c24d015..756ec38fc6a01660b352924cebbd24176c4a9939 100644 --- a/src/test/java/de/ozgcloud/admin/organisationseinheit/OrganisationsEinheitTestFactory.java +++ b/src/test/java/de/ozgcloud/admin/organisationseinheit/OrganisationsEinheitTestFactory.java @@ -34,4 +34,16 @@ public class OrganisationsEinheitTestFactory { .lastSyncTimestamp(LAST_SYNC_UPDATE); } + public static OrganisationsEinheit.OrganisationsEinheitBuilder createNewBuilder() { + return OrganisationsEinheit.builder() + .id(UUID.randomUUID().toString()) + .keycloakId(UUID.randomUUID().toString()) + .name(LoremIpsum.getInstance().getName()) + .organisationsEinheitId(UUID.randomUUID().toString()) + .parentId(UUID.randomUUID().toString()) + .zufiId(UUID.randomUUID().toString()) + .syncResult(SyncResult.DELETED) + .settings(OrganisationsEinheitSettingsTestFactory.createNewBuilder().build()) + .lastSyncTimestamp(LAST_SYNC_UPDATE - 10000); + } } diff --git a/src/test/java/de/ozgcloud/admin/organisationseinheit/SyncServiceTest.java b/src/test/java/de/ozgcloud/admin/organisationseinheit/SyncServiceTest.java index 52660504a334711babe2579bd5e7c4612bd2f763..fdba7d25b7d584197570e316becd1297584114c3 100644 --- a/src/test/java/de/ozgcloud/admin/organisationseinheit/SyncServiceTest.java +++ b/src/test/java/de/ozgcloud/admin/organisationseinheit/SyncServiceTest.java @@ -20,6 +20,8 @@ import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.Spy; +import com.thedeanda.lorem.LoremIpsum; + import de.ozgcloud.admin.keycloak.AddGroupData; import de.ozgcloud.admin.keycloak.AddGroupDataTestFactory; import de.ozgcloud.admin.keycloak.Group; @@ -54,7 +56,7 @@ class SyncServiceTest { @BeforeEach void setUp() { when(keycloakRemoteService.getGroupsWithOrganisationsEinheitId()).thenReturn(Stream.of(group)); - doNothing().when(service).syncGroups(any(), any(), anyLong()); + doNothing().when(service).syncGroupsWithSubGroups(any(), any(), anyLong()); } @Test @@ -68,7 +70,7 @@ class SyncServiceTest { void shouldSyncGroupsFromKeycloak() { callService(); - verify(service).syncGroups(group, null, syncTimestamp); + verify(service).syncGroupsWithSubGroups(group, null, syncTimestamp); } @Test @@ -85,7 +87,7 @@ class SyncServiceTest { } @Nested - class TestSyncGroups { + class TestSyncGroupsWithSubGroups { private final long syncTimestamp = Instant.now().toEpochMilli(); private final Group group = GroupTestFactory.create(); @@ -96,28 +98,28 @@ class SyncServiceTest { @BeforeEach void setUp() { doReturn(syncedOrganisationsEinheitGroup).when(service).syncGroup(group, null, syncTimestamp); - doReturn(savedOrganisationsEinheitGroup).when(service).saveSyncedOrganisationsEinheit(any()); + doReturn(savedOrganisationsEinheitGroup).when(service).saveSyncedOrganisationsEinheit(syncedOrganisationsEinheitGroup); } @Test void shouldSyncGroup() { - service.syncGroups(group, null, syncTimestamp); + service.syncGroupsWithSubGroups(group, null, syncTimestamp); verify(service).syncGroup(group, null, syncTimestamp); } @Test - void shouldSaveSyncedGroup() { - service.syncGroups(group, null, syncTimestamp); + void shouldSaveSyncedOrganisationsEinheit() { + service.syncGroupsWithSubGroups(group, null, syncTimestamp); verify(service).saveSyncedOrganisationsEinheit(syncedOrganisationsEinheitGroup); } @Test void shouldSyncSubGroupsWithSyncedOrganisationsEinheitAsParent() { - service.syncGroups(group, null, syncTimestamp); + service.syncGroupsWithSubGroups(group, null, syncTimestamp); - verify(service).syncGroups(group.getSubGroups().getFirst(), savedOrganisationsEinheitGroup, syncTimestamp); + verify(service).syncGroupsWithSubGroups(group.getSubGroups().getFirst(), savedOrganisationsEinheitGroup, syncTimestamp); } } @@ -129,14 +131,18 @@ class SyncServiceTest { private final OrganisationsEinheit parent = OrganisationsEinheitTestFactory.createBuilder().id(UUID.randomUUID().toString()).build(); private final OrganisationsEinheit pvogOrganisationsEinheit = OrganisationsEinheitTestFactory.createBuilder().zufiId(null).settings(null) .parentId(null).syncResult(null).build(); + private final String syncedName = LoremIpsum.getInstance().getWords(3); + private final SyncResult syncedSyncResult = SyncResult.OK; + private final String syncedZufiId = UUID.randomUUID().toString(); @Nested class ParentGroup { @BeforeEach void setUp() { - doReturn(OrganisationsEinheitTestFactory.NAME).when(service).syncName(anyList(), any()); - doReturn(SyncResult.OK).when(service).evaluateSyncResult(anyList(), any()); + doReturn(syncedName).when(service).syncName(List.of(pvogOrganisationsEinheit), group); + doReturn(syncedSyncResult).when(service).evaluateSyncResult(List.of(pvogOrganisationsEinheit), group); + doReturn(syncedZufiId).when(service).syncZufiId(List.of(pvogOrganisationsEinheit)); when(organisationsEinheitRemoteService.getByOrganisationsEinheitId(GroupTestFactory.ORGANISATIONS_EINHEIT_ID)).thenReturn( List.of(pvogOrganisationsEinheit)); } @@ -150,16 +156,18 @@ class SyncServiceTest { @Test void shouldSyncName() { - service.syncGroup(group, null, syncTimestamp); + var synced = service.syncGroup(group, null, syncTimestamp); verify(service).syncName(List.of(pvogOrganisationsEinheit), group); + assertThat(synced.getName()).isEqualTo(syncedName); } @Test void shouldEvaluateSyncResult() { - service.syncGroup(group, null, syncTimestamp); + var synced = service.syncGroup(group, null, syncTimestamp); verify(service).evaluateSyncResult(List.of(pvogOrganisationsEinheit), group); + assertThat(synced.getSyncResult()).isEqualTo(syncedSyncResult); } @Test @@ -169,11 +177,19 @@ class SyncServiceTest { verify(organisationsEinheitRemoteService).getByOrganisationsEinheitId(GroupTestFactory.ORGANISATIONS_EINHEIT_ID); } + @Test + void shouldSetOrganisationsEinheitId() { + var synced = service.syncGroup(group, null, syncTimestamp); + + assertThat(synced.getOrganisationsEinheitId()).isEqualTo(group.getOrganisationsEinheitId()); + } + @Test void shouldSyncZufiId() { - service.syncGroup(group, null, syncTimestamp); + var synced = service.syncGroup(group, null, syncTimestamp); verify(service).syncZufiId(List.of(pvogOrganisationsEinheit)); + assertThat(synced.getZufiId()).isEqualTo(syncedZufiId); } @Test @@ -189,8 +205,9 @@ class SyncServiceTest { @BeforeEach void setUp() { - doReturn(OrganisationsEinheitTestFactory.NAME).when(service).syncName(anyList(), any()); - doReturn(SyncResult.OK).when(service).evaluateSyncResult(anyList(), any()); + doReturn(syncedName).when(service).syncName(List.of(pvogOrganisationsEinheit), group.getSubGroups().getFirst()); + doReturn(syncedSyncResult).when(service).evaluateSyncResult(List.of(pvogOrganisationsEinheit), group.getSubGroups().getFirst()); + doReturn(syncedZufiId).when(service).syncZufiId(List.of(pvogOrganisationsEinheit)); when(organisationsEinheitRemoteService.getByOrganisationsEinheitId(GroupTestFactory.SUB_GROUP_ORGANISATIONS_EINHEIT_ID)).thenReturn( List.of(pvogOrganisationsEinheit)); } @@ -204,23 +221,26 @@ class SyncServiceTest { @Test void shouldSyncName() { - service.syncGroup(group.getSubGroups().getFirst(), parent, syncTimestamp); + var synced = service.syncGroup(group.getSubGroups().getFirst(), parent, syncTimestamp); verify(service).syncName(List.of(pvogOrganisationsEinheit), group.getSubGroups().getFirst()); + assertThat(synced.getName()).isEqualTo(syncedName); } @Test void shouldEvaluateSyncResult() { - service.syncGroup(group.getSubGroups().getFirst(), parent, syncTimestamp); + var synced = service.syncGroup(group.getSubGroups().getFirst(), parent, syncTimestamp); verify(service).evaluateSyncResult(List.of(pvogOrganisationsEinheit), group.getSubGroups().getFirst()); + assertThat(synced.getSyncResult()).isEqualTo(syncedSyncResult); } @Test void shouldGetOrganisationsEinheit() { - service.syncGroup(group.getSubGroups().getFirst(), parent, syncTimestamp); + var synced = service.syncGroup(group.getSubGroups().getFirst(), parent, syncTimestamp); verify(organisationsEinheitRemoteService).getByOrganisationsEinheitId(GroupTestFactory.SUB_GROUP_ORGANISATIONS_EINHEIT_ID); + assertThat(synced.getOrganisationsEinheitId()).isEqualTo(group.getSubGroups().getFirst().getOrganisationsEinheitId()); } @Test @@ -232,9 +252,10 @@ class SyncServiceTest { @Test void shouldSyncZufiId() { - service.syncGroup(group.getSubGroups().getFirst(), parent, syncTimestamp); + var synced = service.syncGroup(group.getSubGroups().getFirst(), parent, syncTimestamp); verify(service).syncZufiId(List.of(pvogOrganisationsEinheit)); + assertThat(synced.getZufiId()).isEqualTo(syncedZufiId); } @Test @@ -377,7 +398,7 @@ class SyncServiceTest { @Nested class SyncedOrganisationsEinheitExists { - private final OrganisationsEinheit existingOrganisationsEinheit = OrganisationsEinheitTestFactory.create(); + private final OrganisationsEinheit existingOrganisationsEinheit = OrganisationsEinheitTestFactory.createNewBuilder().build(); @Captor private ArgumentCaptor<OrganisationsEinheit> savedOrganisationsEinheitArgumentCaptor;