diff --git a/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/common/migration/M011_SetDefaultCollaborationLevel.java b/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/common/migration/M011_SetDefaultCollaborationLevel.java new file mode 100644 index 0000000000000000000000000000000000000000..b87ca0ed026919f0c81ea26687e1eae8f82efdd5 --- /dev/null +++ b/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/common/migration/M011_SetDefaultCollaborationLevel.java @@ -0,0 +1,39 @@ +package de.ozgcloud.vorgang.common.migration; + +import org.springframework.data.mongodb.core.MongoTemplate; +import org.springframework.data.mongodb.core.query.Criteria; +import org.springframework.data.mongodb.core.query.Query; +import org.springframework.data.mongodb.core.query.Update; + +import io.mongock.api.annotations.ChangeUnit; +import io.mongock.api.annotations.Execution; +import io.mongock.api.annotations.RollbackExecution; + +@ChangeUnit(id = "2024-07-29 17:30:00 OZG-6259", order = "M011", author = "mkuester", runAlways = true) +public class M011_SetDefaultCollaborationLevel { // NOSONAR + + private static final String VORGANG_COLLECTION = "vorgang"; + + static final String HEADER_FIELD = "header"; + static final String COLLABORATION_LEVEL_FIELD = "collaborationLevel"; + static final String HEADER_COLLABORATION_LEVEL_FIELD = HEADER_FIELD + "." + COLLABORATION_LEVEL_FIELD; + private static final int DEFAULT_COLLABORATION_LEVEL = 0; + + @Execution + public void doMigration(MongoTemplate template) { + template.updateMulti(createFilterQuery(), createUpdate(), VORGANG_COLLECTION); + } + + private Query createFilterQuery() { + return new Query(Criteria.where(HEADER_COLLABORATION_LEVEL_FIELD).exists(false)); + } + + private Update createUpdate() { + return new Update().set(HEADER_COLLABORATION_LEVEL_FIELD, DEFAULT_COLLABORATION_LEVEL); + } + + @RollbackExecution + public void rollback() { + // kein rollback implementiert + } +} \ No newline at end of file diff --git a/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/common/migration/M011_SetDefaultCollaborationLevelITCase.java b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/common/migration/M011_SetDefaultCollaborationLevelITCase.java new file mode 100644 index 0000000000000000000000000000000000000000..9b5b8b9a499aaf17baf73c073dbf0f75ef7cc694 --- /dev/null +++ b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/common/migration/M011_SetDefaultCollaborationLevelITCase.java @@ -0,0 +1,142 @@ +package de.ozgcloud.vorgang.common.migration; + +import static org.assertj.core.api.Assertions.*; + +import org.bson.Document; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.mongodb.core.MongoTemplate; +import org.springframework.data.mongodb.core.query.Query; + +import com.thedeanda.lorem.LoremIpsum; + +import de.ozgcloud.common.test.DataITCase; + +@DataITCase +class M011_SetDefaultCollaborationLevelITCase { + + private final M011_SetDefaultCollaborationLevel migration = new M011_SetDefaultCollaborationLevel(); + + private final String nameField = "name"; + private final String nameFieldValue = LoremIpsum.getInstance().getWords(1); + + private final String organisationsEinheitField = "organisationsEinheitId"; + private final String organisationsEinheitFieldValue = LoremIpsum.getInstance().getWords(1); + + @Autowired + private MongoTemplate template; + @Autowired + private MigrationDbTestUtils dbTestUtils; + + @DisplayName("Do migration") + @Nested + class TestDoMigration { + + @BeforeEach + void mock() { + dbTestUtils.dropVorgangCollection(); + } + + @DisplayName("on missing collaboration level") + @Nested + class TestOnMissingCollaborationLevel { + + @BeforeEach + void initVorgang() { + dbTestUtils.saveVorgang(createVorgangWithName()); + } + + @Test + void shouldSetDefaultCollaborationLevel() { + migration.doMigration(template); + + assertThat(getVorgangHeader()).containsEntry(M011_SetDefaultCollaborationLevel.COLLABORATION_LEVEL_FIELD, 0); + } + + @Test + void shouldKeepVorgangData() { + migration.doMigration(template); + + assertThat(getVorgang()).containsEntry(nameField, nameFieldValue); + } + + @Test + void shouldKeepHeaderData() { + migration.doMigration(template); + + assertThat(getVorgangHeader()).containsEntry(organisationsEinheitField, + organisationsEinheitFieldValue); + } + } + + @DisplayName("on existing collaboration level") + @Nested + class TestOnExistingCollaborationLevel { + + @BeforeEach + void initVorgang() { + dbTestUtils.saveVorgang(createVorgangWithCollaborationLevel()); + } + + @Test + void shouldKeepCollaborationLevel() { + migration.doMigration(template); + + assertThat(getVorgangHeader()).containsEntry(M011_SetDefaultCollaborationLevel.COLLABORATION_LEVEL_FIELD, 1); + } + + @Test + void shouldKeepVorgangData() { + migration.doMigration(template); + + assertThat(getVorgang()).containsEntry(nameField, nameFieldValue); + } + + @Test + void shouldKeepHeaderData() { + migration.doMigration(template); + + assertThat(getVorgangHeader()).containsEntry(organisationsEinheitField, + organisationsEinheitFieldValue); + } + } + + private Document createVorgangWithCollaborationLevel() { + var vorgang = createVorgangWithName(); + vorgang.append(M011_SetDefaultCollaborationLevel.HEADER_FIELD, createHeaderWithCollaborationLevel()); + return vorgang; + } + + private Document createHeaderWithCollaborationLevel() { + var header = createHeaderWithOrganisationsEinheitId(); + header.append(M011_SetDefaultCollaborationLevel.COLLABORATION_LEVEL_FIELD, 1); + return header; + } + + private Document createVorgangWithName() { + var vorgang = new Document(); + vorgang.append(nameField, nameFieldValue); + vorgang.append(M011_SetDefaultCollaborationLevel.HEADER_FIELD, createHeaderWithOrganisationsEinheitId()); + return vorgang; + } + + private Document createHeaderWithOrganisationsEinheitId() { + var header = new Document(); + header.append(organisationsEinheitField, organisationsEinheitFieldValue); + return header; + } + + private Document getVorgangHeader() { + return (Document) getVorgang().get(M011_SetDefaultCollaborationLevel.HEADER_FIELD); + } + + private Document getVorgang() { + var vorgaenge = dbTestUtils.findVorgang(new Query()); + assertThat(vorgaenge).hasSize(1); + return vorgaenge.get(0); + } + } +} \ No newline at end of file