diff --git a/pom.xml b/pom.xml index 3f0b57afc37093b3413ccd0ca2e77fb922f720da..75cb93d9f7aa640cdef0cee88d93124caa2a3101 100644 --- a/pom.xml +++ b/pom.xml @@ -46,6 +46,8 @@ <ozgcloud.license.version>1.6.0</ozgcloud.license.version> <lombok.version>1.18.34</lombok.version> + <quarkus.mongock.version>0.3.0</quarkus.mongock.version> + <!-- plugins --> <maven.compiler.release>21</maven.compiler.release> <jandex-maven-plugin-version>1.2.3</jandex-maven-plugin-version> diff --git a/user-manager-server/pom.xml b/user-manager-server/pom.xml index 5c919c5270be1c2c999fb00484ebeaff1cfcb3b0..9ae6f04364246aeb50383a357bb3b6ced675832b 100644 --- a/user-manager-server/pom.xml +++ b/user-manager-server/pom.xml @@ -122,6 +122,11 @@ <groupId>io.quarkus</groupId> <artifactId>quarkus-grpc</artifactId> </dependency> + <dependency> + <groupId>io.quarkiverse.mongock</groupId> + <artifactId>quarkus-mongock</artifactId> + <version>${quarkus.mongock.version}</version> + </dependency> <!-- Logging --> <dependency> diff --git a/user-manager-server/src/main/java/de/ozgcloud/user/User.java b/user-manager-server/src/main/java/de/ozgcloud/user/User.java index 0d645513f212f4958a4b2e712c0428046d63e995..fe2eba2fe1c36f077e18aeab4cd953775c68b977 100644 --- a/user-manager-server/src/main/java/de/ozgcloud/user/User.java +++ b/user-manager-server/src/main/java/de/ozgcloud/user/User.java @@ -50,6 +50,8 @@ import lombok.ToString; @RegisterForReflection public class User { + public static final String COLLECTION_NAME = "User"; + public static final String EXTERNAL_ID_FIELD = "externalId"; public static final String KEYCLOAK_USER_ID = "keycloakUserId"; public static final String EMAIL_FIELD = "email"; @@ -61,7 +63,7 @@ public class User { public static final String FULL_NAME_REVERSED_FIELD = "fullNameReversed"; public static final String USERNAME_FIELD = "username"; public static final String ORGANISATIONS_EINHEIT_IDS_FIELD = "organisationsEinheitIds"; - public static final String NOTIFICATION_SEND_FOR_FIELD = "userSettings.notificationsSendFor"; + public static final String USER_SETTINGS_FIELD = "userSettings"; @JsonIgnore @BsonId diff --git a/user-manager-server/src/main/java/de/ozgcloud/user/UserService.java b/user-manager-server/src/main/java/de/ozgcloud/user/UserService.java index deab57205f2d89612c0bbe2b5d8f5f71f69a02d4..27edabcc7dc9d0d1e2be4c549065298f1c4eca3e 100644 --- a/user-manager-server/src/main/java/de/ozgcloud/user/UserService.java +++ b/user-manager-server/src/main/java/de/ozgcloud/user/UserService.java @@ -23,19 +23,22 @@ */ package de.ozgcloud.user; +import java.util.Objects; import java.util.Optional; import java.util.stream.Stream; +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.inject.Inject; + import org.apache.commons.lang3.StringUtils; import de.ozgcloud.common.logging.OzgCloudLogging; import de.ozgcloud.user.common.errorhandling.ResourceNotFoundException; import de.ozgcloud.user.common.errorhandling.TechnicalException; import de.ozgcloud.user.keycloak.KeycloakUserRemoteService; +import de.ozgcloud.user.settings.UserSettings; import io.smallrye.mutiny.Uni; import io.smallrye.mutiny.infrastructure.Infrastructure; -import jakarta.enterprise.context.ApplicationScoped; -import jakarta.inject.Inject; @ApplicationScoped @OzgCloudLogging @@ -48,10 +51,17 @@ public class UserService { public User save(User user) { findUser(user).ifPresentOrElse(persistedUser -> repository.updateUser(addIdUser(user, persistedUser)), - () -> repository.persist(user)); + () -> saveNewUser(user)); return repository.refresh(user); } + void saveNewUser(User user) { + if (Objects.isNull(user.getUserSettings())) { + user.setUserSettings(UserSettings.createDefault()); + } + repository.persist(user); + } + public Stream<User> findUsers(FindUserProfilesQuery query) { return repository.findUsers(query.getSearchBy(), query.getLimit()); } @@ -79,8 +89,7 @@ public class UserService { } private Optional<User> findUser(User user) { - return repository.findByExternalId(user.getExternalId()) - .or(() -> findByEmail(user.getEmail())); + return repository.findByExternalId(user.getExternalId()).or(() -> findByEmail(user.getEmail())); } private Optional<User> findByEmail(String email) { diff --git a/user-manager-server/src/main/java/de/ozgcloud/user/common/DocumentUtils.java b/user-manager-server/src/main/java/de/ozgcloud/user/common/DocumentUtils.java new file mode 100644 index 0000000000000000000000000000000000000000..11e45a77b6e24c07879f59db2b4deac17615b382 --- /dev/null +++ b/user-manager-server/src/main/java/de/ozgcloud/user/common/DocumentUtils.java @@ -0,0 +1,8 @@ +package de.ozgcloud.user.common; + +public class DocumentUtils { + + public static String buildFieldPath(String... fields) { + return String.join(".", fields); + } +} diff --git a/user-manager-server/src/main/java/de/ozgcloud/user/common/migration/M001_SetNewAndMigrateUserSettings.java b/user-manager-server/src/main/java/de/ozgcloud/user/common/migration/M001_SetNewAndMigrateUserSettings.java new file mode 100644 index 0000000000000000000000000000000000000000..321c642e900d7375f711924034c5d6a3e33afd57 --- /dev/null +++ b/user-manager-server/src/main/java/de/ozgcloud/user/common/migration/M001_SetNewAndMigrateUserSettings.java @@ -0,0 +1,70 @@ +package de.ozgcloud.user.common.migration; + +import static de.ozgcloud.user.common.DocumentUtils.*; + +import java.util.Map; + +import org.bson.Document; + +import com.mongodb.client.MongoCollection; +import com.mongodb.client.MongoDatabase; + +import de.ozgcloud.user.User; +import de.ozgcloud.user.settings.UserSettings; +import io.mongock.api.annotations.ChangeUnit; +import io.mongock.api.annotations.Execution; +import io.mongock.api.annotations.RollbackExecution; +import lombok.RequiredArgsConstructor; + +@RequiredArgsConstructor +@ChangeUnit(id = "2024-09-22 12:00:00 OZG-3539", order = "M001", author = "sbergandy", systemVersion = "1") +public class M001_SetNewAndMigrateUserSettings { + + private final MongoDatabase mongoDatabase; + + @Execution + public void migrationMethod() { + var userCollection = mongoDatabase.getCollection(User.COLLECTION_NAME); + migrateNotificationsSendForALL(userCollection); + migrateNotificationsSendForNONE(userCollection); + migrateEmptySettings(userCollection); + } + + private void migrateNotificationsSendForALL(MongoCollection<Document> userCollection) { + userCollection.updateMany( + new Document(Map.of(buildFieldPath(User.USER_SETTINGS_FIELD, UserSettings.NOTIFICATIONS_SEND_FOR_FIELD), "ALL")), + new Document(Map.of("$set", Map.of(User.USER_SETTINGS_FIELD, + Map.of(UserSettings.NOTIFICATIONS_SEND_FOR_FIELD, "ALL", + UserSettings.VORGANG_CREATED_FIELD, true, + UserSettings.VORGANG_ASSIGNED_TO_USER_FIELD, true, + UserSettings.POSTFACH_NACHRICHT_FROM_ANTRAGSTELLER_FIELD, true, + UserSettings.WIEDERVORLAGE_OVERDUE_FIELD, true))))); + } + + private void migrateNotificationsSendForNONE(MongoCollection<Document> userCollection) { + userCollection.updateMany( + new Document(Map.of(buildFieldPath(User.USER_SETTINGS_FIELD, UserSettings.NOTIFICATIONS_SEND_FOR_FIELD), "NONE")), + new Document(Map.of("$set", Map.of(User.USER_SETTINGS_FIELD, + Map.of(UserSettings.NOTIFICATIONS_SEND_FOR_FIELD, "NONE", + UserSettings.VORGANG_CREATED_FIELD, false, + UserSettings.VORGANG_ASSIGNED_TO_USER_FIELD, true, + UserSettings.POSTFACH_NACHRICHT_FROM_ANTRAGSTELLER_FIELD, true, + UserSettings.WIEDERVORLAGE_OVERDUE_FIELD, true))))); + } + + private void migrateEmptySettings(MongoCollection<Document> userCollection) { + userCollection.updateMany( + new Document(Map.of(buildFieldPath(User.USER_SETTINGS_FIELD, UserSettings.NOTIFICATIONS_SEND_FOR_FIELD), Map.of("$exists", false))), + new Document(Map.of("$set", Map.of(User.USER_SETTINGS_FIELD, + Map.of(UserSettings.NOTIFICATIONS_SEND_FOR_FIELD, "NONE", + UserSettings.VORGANG_CREATED_FIELD, false, + UserSettings.VORGANG_ASSIGNED_TO_USER_FIELD, true, + UserSettings.POSTFACH_NACHRICHT_FROM_ANTRAGSTELLER_FIELD, true, + UserSettings.WIEDERVORLAGE_OVERDUE_FIELD, true))))); + } + + @RollbackExecution + public void rollback() { + // kein rollback implementiert + } +} diff --git a/user-manager-server/src/main/java/de/ozgcloud/user/recipient/RecipientRepository.java b/user-manager-server/src/main/java/de/ozgcloud/user/recipient/RecipientRepository.java index 417e715de7e0aedead84a84a4484ee123c796f55..17482b933b614b1c6f36c61b58b064846937b907 100644 --- a/user-manager-server/src/main/java/de/ozgcloud/user/recipient/RecipientRepository.java +++ b/user-manager-server/src/main/java/de/ozgcloud/user/recipient/RecipientRepository.java @@ -4,17 +4,21 @@ import static de.ozgcloud.user.User.*; import java.util.List; +import jakarta.enterprise.context.ApplicationScoped; + import de.ozgcloud.common.logging.OzgCloudLogging; import de.ozgcloud.user.User; +import de.ozgcloud.user.common.DocumentUtils; import de.ozgcloud.user.settings.NotificationsSendFor; +import de.ozgcloud.user.settings.UserSettings; import io.quarkus.mongodb.panache.PanacheMongoRepository; -import jakarta.enterprise.context.ApplicationScoped; @ApplicationScoped @OzgCloudLogging class RecipientRepository implements PanacheMongoRepository<User> { - private static final String SEARCH_RECIPIENT_QUERY = ORGANISATIONS_EINHEIT_IDS_FIELD + " = ?1 and " + NOTIFICATION_SEND_FOR_FIELD + " = ?2"; + private static final String SEARCH_RECIPIENT_QUERY = ORGANISATIONS_EINHEIT_IDS_FIELD + " = ?1 and " + + DocumentUtils.buildFieldPath(USER_SETTINGS_FIELD, UserSettings.NOTIFICATIONS_SEND_FOR_FIELD) + " = ?2"; public List<User> findByOrganisationsEinheitId(String organisationseinheitId) { return find(SEARCH_RECIPIENT_QUERY, organisationseinheitId, NotificationsSendFor.ALL.name()).list(); diff --git a/user-manager-server/src/main/java/de/ozgcloud/user/settings/UserSettings.java b/user-manager-server/src/main/java/de/ozgcloud/user/settings/UserSettings.java index 08fd9756f5144f793b456c047e14d988233518e0..112258b7c08abc6bb258579d22a2318ed9dd5198 100644 --- a/user-manager-server/src/main/java/de/ozgcloud/user/settings/UserSettings.java +++ b/user-manager-server/src/main/java/de/ozgcloud/user/settings/UserSettings.java @@ -26,17 +26,35 @@ package de.ozgcloud.user.settings; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Getter; -import lombok.NoArgsConstructor; import lombok.Setter; @Builder(toBuilder = true) -@AllArgsConstructor -@NoArgsConstructor @Getter @Setter +@AllArgsConstructor public class UserSettings { - static final String NOTIFICATIONS_SEND_FOR_FIELD = "notificationsSendFor"; + public static final String NOTIFICATIONS_SEND_FOR_FIELD = "notificationsSendFor"; + public static final String VORGANG_CREATED_FIELD = "vorgangCreated"; + public static final String VORGANG_ASSIGNED_TO_USER_FIELD = "vorgangAssignedToUser"; + public static final String POSTFACH_NACHRICHT_FROM_ANTRAGSTELLER_FIELD = "postfachNachrichtFromAntragsteller"; + public static final String WIEDERVORLAGE_OVERDUE_FIELD = "wiedervorlageOverdue"; private NotificationsSendFor notificationsSendFor; + private boolean vorgangCreated; + private boolean vorgangAssignedToUser; + private boolean postfachNachrichtFromAntragsteller; + private boolean wiedervorlageOverdue; + + public UserSettings(NotificationsSendFor notificationsSendFor) { + this(notificationsSendFor, notificationsSendFor == NotificationsSendFor.ALL, true, true, true); + } + + public UserSettings() { + this(NotificationsSendFor.NONE); + } + + public static UserSettings createDefault() { + return new UserSettings(); + } } diff --git a/user-manager-server/src/main/java/de/ozgcloud/user/settings/UserSettingsResource.java b/user-manager-server/src/main/java/de/ozgcloud/user/settings/UserSettingsResource.java index de7b344a71ef2ea1874a55ef8f4bee02592f4e2a..a1bf4dc8f02c0ecce2efd7be84e25b74cd7004c1 100644 --- a/user-manager-server/src/main/java/de/ozgcloud/user/settings/UserSettingsResource.java +++ b/user-manager-server/src/main/java/de/ozgcloud/user/settings/UserSettingsResource.java @@ -25,8 +25,6 @@ package de.ozgcloud.user.settings; import java.util.Objects; -import de.ozgcloud.user.common.errorhandling.AccessForbiddenException; -import de.ozgcloud.user.common.errorhandling.FunctionalException; import jakarta.inject.Inject; import jakarta.ws.rs.GET; import jakarta.ws.rs.PATCH; @@ -43,6 +41,8 @@ import org.jboss.resteasy.reactive.common.util.RestMediaType; import de.ozgcloud.user.User; import de.ozgcloud.user.UserService; +import de.ozgcloud.user.common.errorhandling.AccessForbiddenException; +import de.ozgcloud.user.common.errorhandling.FunctionalException; import io.quarkus.hal.HalEntityWrapper; @Path(UserSettingsResource.USER_PATH) @@ -86,7 +86,7 @@ public class UserSettingsResource { throw new FunctionalException(() -> "Request Body missing."); } - return userSettingsService.updateByUserId(userSettings, userId) + return userSettingsService.updateByUserId(userId, userSettings) .map(updatedSettings -> resourceAssembler.toResource(updatedSettings, userId, userManagerUrl)) .orElseThrow(() -> new FunctionalException(() -> "Invalid user id")); } diff --git a/user-manager-server/src/main/java/de/ozgcloud/user/settings/UserSettingsService.java b/user-manager-server/src/main/java/de/ozgcloud/user/settings/UserSettingsService.java index 11459e7a474a80d80823df6f7945661ddd3b0416..d7aa65b6ecb7546f5a70a42555e417124dcd8a46 100644 --- a/user-manager-server/src/main/java/de/ozgcloud/user/settings/UserSettingsService.java +++ b/user-manager-server/src/main/java/de/ozgcloud/user/settings/UserSettingsService.java @@ -40,8 +40,9 @@ class UserSettingsService { @Inject UserSettingsRepository repository; - public Optional<UserSettings> updateByUserId(UserSettings userSettings, String userId) { - return repository.updateByUserId(userId, userSettings); + public Optional<UserSettings> updateByUserId(String userId, UserSettings newSettings) { + var settings = newSettings.toBuilder().vorgangCreated(newSettings.getNotificationsSendFor() == NotificationsSendFor.ALL).build(); + return repository.updateByUserId(userId, settings); } public UserSettings getByUserId(String userId) { diff --git a/user-manager-server/src/main/resources/application.yaml b/user-manager-server/src/main/resources/application.yaml index c5f0bca40745037a671471028db8c950b57c93fd..3e78b8d22c234f4a2565cf3d6a9058c47e5ba665 100644 --- a/user-manager-server/src/main/resources/application.yaml +++ b/user-manager-server/src/main/resources/application.yaml @@ -34,6 +34,9 @@ quarkus: management: enabled: true port: 9002 + mongock: + migrate-at-start: true + transaction-enabled: false grpc: server: diff --git a/user-manager-server/src/test/java/de/ozgcloud/user/UserServiceTest.java b/user-manager-server/src/test/java/de/ozgcloud/user/UserServiceTest.java index a78a6738176d01b09e0d4af4b7a829e958c10afd..434d355536c0ccc3b261ad8557e9aeab7eda031d 100644 --- a/user-manager-server/src/test/java/de/ozgcloud/user/UserServiceTest.java +++ b/user-manager-server/src/test/java/de/ozgcloud/user/UserServiceTest.java @@ -45,6 +45,8 @@ import org.mockito.Spy; import de.ozgcloud.user.common.errorhandling.ResourceNotFoundException; import de.ozgcloud.user.common.errorhandling.TechnicalException; import de.ozgcloud.user.keycloak.KeycloakUserRemoteService; +import de.ozgcloud.user.settings.NotificationsSendFor; +import de.ozgcloud.user.settings.UserSettings; class UserServiceTest { @@ -365,4 +367,36 @@ class UserServiceTest { assertThatNoException().isThrownBy(() -> service.assertInactiveUser(user.build())); } } + + @Nested + class TestSaveNewUser { + + @Test + void shouldSetDefaultUserSettings() { + var user = UserTestFactory.createBuilder().userSettings(null).build(); + + service.saveNewUser(user); + + assertThat(user.getUserSettings()).usingRecursiveComparison().isEqualTo(UserSettings.createDefault()); + } + + @Test + void shouldNotSetDefaultUserSettings() { + var settings = UserSettings.builder().notificationsSendFor(NotificationsSendFor.ALL).build(); + var user = createBuilder().userSettings(settings).build(); + + service.saveNewUser(user); + + assertThat(user.getUserSettings()).isEqualTo(settings); + } + + @Test + void shouldPersistUser() { + var user = UserTestFactory.create(); + + service.saveNewUser(user); + + verify(repository).persist(user); + } + } } \ No newline at end of file diff --git a/user-manager-server/src/test/java/de/ozgcloud/user/common/migration/M001_SetNewAndMigrateUserSettingsITCase.java b/user-manager-server/src/test/java/de/ozgcloud/user/common/migration/M001_SetNewAndMigrateUserSettingsITCase.java new file mode 100644 index 0000000000000000000000000000000000000000..d0b74814a531148c13e186562aa9077b03f560ec --- /dev/null +++ b/user-manager-server/src/test/java/de/ozgcloud/user/common/migration/M001_SetNewAndMigrateUserSettingsITCase.java @@ -0,0 +1,94 @@ +package de.ozgcloud.user.common.migration; + +import static org.assertj.core.api.Assertions.*; + +import java.util.Map; + +import jakarta.inject.Inject; + +import org.bson.Document; +import org.eclipse.microprofile.config.inject.ConfigProperty; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import com.mongodb.client.MongoClient; +import com.mongodb.client.MongoCollection; + +import de.ozgcloud.user.User; +import de.ozgcloud.user.common.MongoDbTestProfile; +import de.ozgcloud.user.settings.UserSettings; +import io.quarkus.test.junit.QuarkusTest; +import io.quarkus.test.junit.TestProfile; + +@QuarkusTest +@TestProfile(MongoDbTestProfile.class) +class M001_SetNewAndMigrateUserSettingsITCase { + + @ConfigProperty(name = "quarkus.mongodb.database") + String database; + + @Inject + MongoClient mongoClient; + + private M001_SetNewAndMigrateUserSettings migration; + private MongoCollection<Document> userCollection; + + @BeforeEach + void setUp() { + migration = new M001_SetNewAndMigrateUserSettings(mongoClient.getDatabase(database)); + } + + @BeforeEach + void initDatabase() { + userCollection = mongoClient.getDatabase(database).getCollection(User.COLLECTION_NAME); + userCollection.drop(); + userCollection.insertOne(new Document( + Map.of(User.USERNAME_FIELD, "alluser", + User.USER_SETTINGS_FIELD, Map.of(UserSettings.NOTIFICATIONS_SEND_FOR_FIELD, "ALL")))); + userCollection.insertOne(new Document(Map.of(User.USERNAME_FIELD, "noneuser", + User.USER_SETTINGS_FIELD, Map.of(UserSettings.NOTIFICATIONS_SEND_FOR_FIELD, "NONE")))); + userCollection.insertOne(new Document(Map.of(User.USERNAME_FIELD, "nosettings"))); + } + + @Test + void shouldMigrateNotificationSendFor_ALL() { + migration.migrationMethod(); + + var user = userCollection.find(new Document(Map.of(User.USERNAME_FIELD, "alluser"))); + assertThat(user.first()).contains( + entry(User.USER_SETTINGS_FIELD, new Document(Map.of( + UserSettings.NOTIFICATIONS_SEND_FOR_FIELD, "ALL", + UserSettings.VORGANG_CREATED_FIELD, true, + UserSettings.VORGANG_ASSIGNED_TO_USER_FIELD, true, + UserSettings.POSTFACH_NACHRICHT_FROM_ANTRAGSTELLER_FIELD, true, + UserSettings.WIEDERVORLAGE_OVERDUE_FIELD, true)))); + } + + @Test + void shouldMigrateNotificationSendFor_NONE() { + migration.migrationMethod(); + + var user = userCollection.find(new Document(Map.of(User.USERNAME_FIELD, "noneuser"))); + assertThat(user.first()).contains( + entry(User.USER_SETTINGS_FIELD, new Document(Map.of( + UserSettings.NOTIFICATIONS_SEND_FOR_FIELD, "NONE", + UserSettings.VORGANG_CREATED_FIELD, false, + UserSettings.VORGANG_ASSIGNED_TO_USER_FIELD, true, + UserSettings.POSTFACH_NACHRICHT_FROM_ANTRAGSTELLER_FIELD, true, + UserSettings.WIEDERVORLAGE_OVERDUE_FIELD, true)))); + } + + @Test + void shouldSetDefaultSettings() { + migration.migrationMethod(); + + var user = userCollection.find(new Document(Map.of(User.USERNAME_FIELD, "nosettings"))); + assertThat(user.first()).contains( + entry(User.USER_SETTINGS_FIELD, new Document(Map.of( + UserSettings.NOTIFICATIONS_SEND_FOR_FIELD, "NONE", + UserSettings.VORGANG_CREATED_FIELD, false, + UserSettings.VORGANG_ASSIGNED_TO_USER_FIELD, true, + UserSettings.POSTFACH_NACHRICHT_FROM_ANTRAGSTELLER_FIELD, true, + UserSettings.WIEDERVORLAGE_OVERDUE_FIELD, true)))); + } +} \ No newline at end of file diff --git a/user-manager-server/src/test/java/de/ozgcloud/user/recipient/RecipientRepositoryTest.java b/user-manager-server/src/test/java/de/ozgcloud/user/recipient/RecipientRepositoryTest.java index addd8cf25b5a30a51bc2a54f58ce0228798e9c58..c1e0c5da10499a826110aa997f430acea78577b8 100644 --- a/user-manager-server/src/test/java/de/ozgcloud/user/recipient/RecipientRepositoryTest.java +++ b/user-manager-server/src/test/java/de/ozgcloud/user/recipient/RecipientRepositoryTest.java @@ -37,7 +37,9 @@ import org.mockito.Spy; import de.ozgcloud.user.User; import de.ozgcloud.user.UserTestFactory; +import de.ozgcloud.user.common.DocumentUtils; import de.ozgcloud.user.settings.NotificationsSendFor; +import de.ozgcloud.user.settings.UserSettings; import io.quarkus.mongodb.panache.PanacheQuery; class RecipientRepositoryTest { @@ -50,7 +52,8 @@ class RecipientRepositoryTest { @DisplayName("Test finding users by Organistationseinheit") @Nested class TestFindByOrganisationsEinheit { - private static final String QUERY = ORGANISATIONS_EINHEIT_IDS_FIELD + " = ?1 and " + NOTIFICATION_SEND_FOR_FIELD + " = ?2"; + private static final String QUERY = ORGANISATIONS_EINHEIT_IDS_FIELD + " = ?1 and " + + DocumentUtils.buildFieldPath(USER_SETTINGS_FIELD, UserSettings.NOTIFICATIONS_SEND_FOR_FIELD) + " = ?2"; @Test void shouldCallFind() { diff --git a/user-manager-server/src/test/java/de/ozgcloud/user/settings/UserSettingsResourceTest.java b/user-manager-server/src/test/java/de/ozgcloud/user/settings/UserSettingsResourceTest.java index df8ea4ff0e9ed34e051c28903e2ab78476f99f62..3cde1320d243fb4191cb5d7b7ef54447cc8d2774 100644 --- a/user-manager-server/src/test/java/de/ozgcloud/user/settings/UserSettingsResourceTest.java +++ b/user-manager-server/src/test/java/de/ozgcloud/user/settings/UserSettingsResourceTest.java @@ -168,7 +168,7 @@ class UserSettingsResourceTest { @BeforeEach void mockAccess() { doNothing().when(resource).checkUserAccess(anyString()); - when(userSettingsService.updateByUserId(any(UserSettings.class), anyString())).thenReturn(Optional.of(updatedUserSettings)); + when(userSettingsService.updateByUserId(anyString(), any(UserSettings.class))).thenReturn(Optional.of(updatedUserSettings)); } @Test @@ -184,7 +184,7 @@ class UserSettingsResourceTest { when(resourceAssembler.toResource(any(), anyString(), anyString())).thenReturn(new HalEntityWrapper(null)); resource.updateUserSettings(USER_ID, userSettings); - verify(userSettingsService).updateByUserId(userSettings, USER_ID); + verify(userSettingsService).updateByUserId(USER_ID, userSettings); } @Test diff --git a/user-manager-server/src/test/java/de/ozgcloud/user/settings/UserSettingsServiceITCase.java b/user-manager-server/src/test/java/de/ozgcloud/user/settings/UserSettingsServiceITCase.java index 6f0d5f1d6744d4c813b16e7a4e0285577a34f112..c3fcc2884cdf15e25ec77559d394ab01b088f613 100644 --- a/user-manager-server/src/test/java/de/ozgcloud/user/settings/UserSettingsServiceITCase.java +++ b/user-manager-server/src/test/java/de/ozgcloud/user/settings/UserSettingsServiceITCase.java @@ -66,7 +66,7 @@ class UserSettingsServiceITCase { .notificationsSendFor(NotificationsSendFor.ALL) .build(); - var savedUserSettings = service.updateByUserId(userSettingsToSave, UserTestFactory.ID.toHexString()); + var savedUserSettings = service.updateByUserId(UserTestFactory.ID.toHexString(), userSettingsToSave); assertThat(savedUserSettings) .isPresent() diff --git a/user-manager-server/src/test/java/de/ozgcloud/user/settings/UserSettingsServiceTest.java b/user-manager-server/src/test/java/de/ozgcloud/user/settings/UserSettingsServiceTest.java index 5eeac12fb8fda7f6ca0cdeceb3f74c6171acdace..f46eafb7f7832577f64ffe395dab72158741bea2 100644 --- a/user-manager-server/src/test/java/de/ozgcloud/user/settings/UserSettingsServiceTest.java +++ b/user-manager-server/src/test/java/de/ozgcloud/user/settings/UserSettingsServiceTest.java @@ -33,6 +33,8 @@ 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.mockito.ArgumentCaptor; +import org.mockito.Captor; import org.mockito.InjectMocks; import org.mockito.Mock; @@ -56,11 +58,54 @@ class UserSettingsServiceTest { private final UserSettings userSettings = UserSettingsTestFactory.create(); private final String userId = UUID.randomUUID().toString(); + @Captor + private ArgumentCaptor<UserSettings> userSettingsArgumentCaptor; + @Test void shouldCallRepository() { - service.updateByUserId(userSettings, userId); + service.updateByUserId(userId, userSettings); + + verify(repository).updateByUserId(eq(userId), any(UserSettings.class)); + } - verify(repository).updateByUserId(userId, userSettings); + @Test + void shouldSetVorgangCreated() { + service.updateByUserId(userId, userSettings.toBuilder().notificationsSendFor(NotificationsSendFor.ALL).vorgangCreated(false).build()); + + verify(repository).updateByUserId(eq(userId), userSettingsArgumentCaptor.capture()); + assertThat(userSettingsArgumentCaptor.getValue()) + .extracting( + UserSettings::getNotificationsSendFor, + UserSettings::isVorgangCreated, + UserSettings::isVorgangAssignedToUser, + UserSettings::isPostfachNachrichtFromAntragsteller, + UserSettings::isWiedervorlageOverdue) + .containsExactly( + NotificationsSendFor.ALL, + true, + UserSettingsTestFactory.VORGANG_ASSIGNED_TO_USER, + UserSettingsTestFactory.POSTFACH_NACHRICHT_FROM_ANTRAGSTELLER, + UserSettingsTestFactory.WIEDERVORLAGE_OVERDUE); + } + + @Test + void shouldUnsetVorgangCreated() { + service.updateByUserId(userId, userSettings.toBuilder().notificationsSendFor(NotificationsSendFor.NONE).vorgangCreated(true).build()); + + verify(repository).updateByUserId(eq(userId), userSettingsArgumentCaptor.capture()); + assertThat(userSettingsArgumentCaptor.getValue()) + .extracting( + UserSettings::getNotificationsSendFor, + UserSettings::isVorgangCreated, + UserSettings::isVorgangAssignedToUser, + UserSettings::isPostfachNachrichtFromAntragsteller, + UserSettings::isWiedervorlageOverdue) + .containsExactly( + NotificationsSendFor.NONE, + false, + UserSettingsTestFactory.VORGANG_ASSIGNED_TO_USER, + UserSettingsTestFactory.POSTFACH_NACHRICHT_FROM_ANTRAGSTELLER, + UserSettingsTestFactory.WIEDERVORLAGE_OVERDUE); } } diff --git a/user-manager-server/src/test/java/de/ozgcloud/user/settings/UserSettingsTest.java b/user-manager-server/src/test/java/de/ozgcloud/user/settings/UserSettingsTest.java new file mode 100644 index 0000000000000000000000000000000000000000..f017b39bb68b5c89d24450ca9a1be6c0ff8573d1 --- /dev/null +++ b/user-manager-server/src/test/java/de/ozgcloud/user/settings/UserSettingsTest.java @@ -0,0 +1,45 @@ +package de.ozgcloud.user.settings; + +import static org.assertj.core.api.Assertions.*; + +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; + +class UserSettingsTest { + + @Nested + class TestConstructor { + @Test + void shouldCreateWithVorgangCreatedSet() { + var userSettings = new UserSettings(NotificationsSendFor.ALL); + + assertThat(userSettings.isVorgangCreated()).isTrue(); + } + + @Test + void shouldCreateWithVorgangCreatedUnset() { + var userSettings = new UserSettings(NotificationsSendFor.NONE); + + assertThat(userSettings.isVorgangCreated()).isFalse(); + } + + @Test + void shouldCreateWithDefaultValues() { + var userSettings = new UserSettings(); + + assertThat(userSettings).usingRecursiveComparison().isEqualTo(UserSettings.createDefault()); + } + } + + @Nested + class TestCreateDefault { + + @Test + void shouldHaveDefaultSettings() { + assertThat(UserSettings.createDefault()).usingRecursiveComparison().isEqualTo( + UserSettings.builder().notificationsSendFor(NotificationsSendFor.NONE).vorgangCreated(false).vorgangAssignedToUser(true) + .postfachNachrichtFromAntragsteller(true).wiedervorlageOverdue(true).build()); + } + + } +} \ No newline at end of file diff --git a/user-manager-server/src/test/java/de/ozgcloud/user/settings/UserSettingsTestFactory.java b/user-manager-server/src/test/java/de/ozgcloud/user/settings/UserSettingsTestFactory.java index 5e3c7ab6886cf791a36976a18e56776d0d4f56a9..db31c9ee8a14ce97b014ee3ac1edfce64c311f6a 100644 --- a/user-manager-server/src/test/java/de/ozgcloud/user/settings/UserSettingsTestFactory.java +++ b/user-manager-server/src/test/java/de/ozgcloud/user/settings/UserSettingsTestFactory.java @@ -26,6 +26,10 @@ package de.ozgcloud.user.settings; public class UserSettingsTestFactory { public static final NotificationsSendFor NOTIFICATIONS_SEND_FOR = NotificationsSendFor.NONE; + public static final boolean VORGANG_CREATED = false; + public static final boolean VORGANG_ASSIGNED_TO_USER = true; + public static final boolean POSTFACH_NACHRICHT_FROM_ANTRAGSTELLER = true; + public static final boolean WIEDERVORLAGE_OVERDUE = true; public static UserSettings create() { return createBuilder().build(); @@ -33,6 +37,10 @@ public class UserSettingsTestFactory { public static UserSettings.UserSettingsBuilder createBuilder() { return UserSettings.builder() - .notificationsSendFor(NOTIFICATIONS_SEND_FOR); + .notificationsSendFor(NOTIFICATIONS_SEND_FOR) + .vorgangCreated(VORGANG_CREATED) + .vorgangAssignedToUser(VORGANG_ASSIGNED_TO_USER) + .postfachNachrichtFromAntragsteller(POSTFACH_NACHRICHT_FROM_ANTRAGSTELLER) + .wiedervorlageOverdue(WIEDERVORLAGE_OVERDUE); } } \ No newline at end of file diff --git a/user-manager-server/src/test/resources/application.yml b/user-manager-server/src/test/resources/application.yml index bb3a56bcf9202539a99a364b521f5411408c71f0..1efbf87b728c5b3813ea9f58e2c7f73ec9b749d4 100644 --- a/user-manager-server/src/test/resources/application.yml +++ b/user-manager-server/src/test/resources/application.yml @@ -17,6 +17,8 @@ quarkus: auth-server-url: https://sso.dev.by.ozg-cloud.de/realms/by-kiel-dev management: test-port: 9003 + mongock: + enabled: false keycloak: url: http://localhost:8088