Skip to content
Snippets Groups Projects
Commit 217a39e2 authored by OZGCloud's avatar OZGCloud
Browse files

Merge remote-tracking branch...

Merge remote-tracking branch 'origin/OZG-6867-organisationseinheit-management-sync' into OZG-6867-organisationseinheit-management-sync

# Conflicts:
#	src/test/java/de/ozgcloud/admin/organisationseinheit/SyncServiceTest.java
parents c3045fd0 1485a3c3
No related branches found
No related tags found
No related merge requests found
Showing
with 112 additions and 36 deletions
......@@ -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>
......
......@@ -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) {
......
......@@ -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"));
......
......@@ -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
......
......@@ -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);
}
}
......
......@@ -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
......@@ -15,4 +15,9 @@ public class OrganisationsEinheitSettingsTestFactory {
.signatur(SIGNATUR);
}
public static OrganisationsEinheitSettings.OrganisationsEinheitSettingsBuilder createNewBuilder() {
return OrganisationsEinheitSettings.builder()
.signatur(LoremIpsum.getInstance().getWords(3));
}
}
......@@ -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);
}
}
......@@ -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;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment