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

Merge pull request 'OZG-3539-new-settings-for-mail-notification' (#126) from...

Merge pull request 'OZG-3539-new-settings-for-mail-notification' (#126) from OZG-3539-new-settings-for-mail-notification into master

Reviewed-on: https://git.ozg-sh.de/ozgcloud-app/user-manager/pulls/126


Reviewed-by: default avatarOZGCloud <ozgcloud@mgm-tp.com>
parents 741f1bde dbca6c25
No related branches found
No related tags found
No related merge requests found
Showing
with 377 additions and 24 deletions
...@@ -46,6 +46,8 @@ ...@@ -46,6 +46,8 @@
<ozgcloud.license.version>1.6.0</ozgcloud.license.version> <ozgcloud.license.version>1.6.0</ozgcloud.license.version>
<lombok.version>1.18.34</lombok.version> <lombok.version>1.18.34</lombok.version>
<quarkus.mongock.version>0.3.0</quarkus.mongock.version>
<!-- plugins --> <!-- plugins -->
<maven.compiler.release>21</maven.compiler.release> <maven.compiler.release>21</maven.compiler.release>
<jandex-maven-plugin-version>1.2.3</jandex-maven-plugin-version> <jandex-maven-plugin-version>1.2.3</jandex-maven-plugin-version>
......
...@@ -122,6 +122,11 @@ ...@@ -122,6 +122,11 @@
<groupId>io.quarkus</groupId> <groupId>io.quarkus</groupId>
<artifactId>quarkus-grpc</artifactId> <artifactId>quarkus-grpc</artifactId>
</dependency> </dependency>
<dependency>
<groupId>io.quarkiverse.mongock</groupId>
<artifactId>quarkus-mongock</artifactId>
<version>${quarkus.mongock.version}</version>
</dependency>
<!-- Logging --> <!-- Logging -->
<dependency> <dependency>
......
...@@ -50,6 +50,8 @@ import lombok.ToString; ...@@ -50,6 +50,8 @@ import lombok.ToString;
@RegisterForReflection @RegisterForReflection
public class User { public class User {
public static final String COLLECTION_NAME = "User";
public static final String EXTERNAL_ID_FIELD = "externalId"; public static final String EXTERNAL_ID_FIELD = "externalId";
public static final String KEYCLOAK_USER_ID = "keycloakUserId"; public static final String KEYCLOAK_USER_ID = "keycloakUserId";
public static final String EMAIL_FIELD = "email"; public static final String EMAIL_FIELD = "email";
...@@ -61,7 +63,7 @@ public class User { ...@@ -61,7 +63,7 @@ public class User {
public static final String FULL_NAME_REVERSED_FIELD = "fullNameReversed"; public static final String FULL_NAME_REVERSED_FIELD = "fullNameReversed";
public static final String USERNAME_FIELD = "username"; public static final String USERNAME_FIELD = "username";
public static final String ORGANISATIONS_EINHEIT_IDS_FIELD = "organisationsEinheitIds"; 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 @JsonIgnore
@BsonId @BsonId
......
...@@ -23,19 +23,22 @@ ...@@ -23,19 +23,22 @@
*/ */
package de.ozgcloud.user; package de.ozgcloud.user;
import java.util.Objects;
import java.util.Optional; import java.util.Optional;
import java.util.stream.Stream; import java.util.stream.Stream;
import jakarta.enterprise.context.ApplicationScoped;
import jakarta.inject.Inject;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import de.ozgcloud.common.logging.OzgCloudLogging; import de.ozgcloud.common.logging.OzgCloudLogging;
import de.ozgcloud.user.common.errorhandling.ResourceNotFoundException; import de.ozgcloud.user.common.errorhandling.ResourceNotFoundException;
import de.ozgcloud.user.common.errorhandling.TechnicalException; import de.ozgcloud.user.common.errorhandling.TechnicalException;
import de.ozgcloud.user.keycloak.KeycloakUserRemoteService; import de.ozgcloud.user.keycloak.KeycloakUserRemoteService;
import de.ozgcloud.user.settings.UserSettings;
import io.smallrye.mutiny.Uni; import io.smallrye.mutiny.Uni;
import io.smallrye.mutiny.infrastructure.Infrastructure; import io.smallrye.mutiny.infrastructure.Infrastructure;
import jakarta.enterprise.context.ApplicationScoped;
import jakarta.inject.Inject;
@ApplicationScoped @ApplicationScoped
@OzgCloudLogging @OzgCloudLogging
...@@ -48,10 +51,17 @@ public class UserService { ...@@ -48,10 +51,17 @@ public class UserService {
public User save(User user) { public User save(User user) {
findUser(user).ifPresentOrElse(persistedUser -> repository.updateUser(addIdUser(user, persistedUser)), findUser(user).ifPresentOrElse(persistedUser -> repository.updateUser(addIdUser(user, persistedUser)),
() -> repository.persist(user)); () -> saveNewUser(user));
return repository.refresh(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) { public Stream<User> findUsers(FindUserProfilesQuery query) {
return repository.findUsers(query.getSearchBy(), query.getLimit()); return repository.findUsers(query.getSearchBy(), query.getLimit());
} }
...@@ -79,8 +89,7 @@ public class UserService { ...@@ -79,8 +89,7 @@ public class UserService {
} }
private Optional<User> findUser(User user) { private Optional<User> findUser(User user) {
return repository.findByExternalId(user.getExternalId()) return repository.findByExternalId(user.getExternalId()).or(() -> findByEmail(user.getEmail()));
.or(() -> findByEmail(user.getEmail()));
} }
private Optional<User> findByEmail(String email) { private Optional<User> findByEmail(String email) {
......
package de.ozgcloud.user.common;
public class DocumentUtils {
public static String buildFieldPath(String... fields) {
return String.join(".", fields);
}
}
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
}
}
...@@ -4,17 +4,21 @@ import static de.ozgcloud.user.User.*; ...@@ -4,17 +4,21 @@ import static de.ozgcloud.user.User.*;
import java.util.List; import java.util.List;
import jakarta.enterprise.context.ApplicationScoped;
import de.ozgcloud.common.logging.OzgCloudLogging; import de.ozgcloud.common.logging.OzgCloudLogging;
import de.ozgcloud.user.User; import de.ozgcloud.user.User;
import de.ozgcloud.user.common.DocumentUtils;
import de.ozgcloud.user.settings.NotificationsSendFor; import de.ozgcloud.user.settings.NotificationsSendFor;
import de.ozgcloud.user.settings.UserSettings;
import io.quarkus.mongodb.panache.PanacheMongoRepository; import io.quarkus.mongodb.panache.PanacheMongoRepository;
import jakarta.enterprise.context.ApplicationScoped;
@ApplicationScoped @ApplicationScoped
@OzgCloudLogging @OzgCloudLogging
class RecipientRepository implements PanacheMongoRepository<User> { 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) { public List<User> findByOrganisationsEinheitId(String organisationseinheitId) {
return find(SEARCH_RECIPIENT_QUERY, organisationseinheitId, NotificationsSendFor.ALL.name()).list(); return find(SEARCH_RECIPIENT_QUERY, organisationseinheitId, NotificationsSendFor.ALL.name()).list();
......
...@@ -26,17 +26,35 @@ package de.ozgcloud.user.settings; ...@@ -26,17 +26,35 @@ package de.ozgcloud.user.settings;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Builder; import lombok.Builder;
import lombok.Getter; import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter; import lombok.Setter;
@Builder(toBuilder = true) @Builder(toBuilder = true)
@AllArgsConstructor
@NoArgsConstructor
@Getter @Getter
@Setter @Setter
@AllArgsConstructor
public class UserSettings { 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 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();
}
} }
...@@ -25,8 +25,6 @@ package de.ozgcloud.user.settings; ...@@ -25,8 +25,6 @@ package de.ozgcloud.user.settings;
import java.util.Objects; import java.util.Objects;
import de.ozgcloud.user.common.errorhandling.AccessForbiddenException;
import de.ozgcloud.user.common.errorhandling.FunctionalException;
import jakarta.inject.Inject; import jakarta.inject.Inject;
import jakarta.ws.rs.GET; import jakarta.ws.rs.GET;
import jakarta.ws.rs.PATCH; import jakarta.ws.rs.PATCH;
...@@ -43,6 +41,8 @@ import org.jboss.resteasy.reactive.common.util.RestMediaType; ...@@ -43,6 +41,8 @@ import org.jboss.resteasy.reactive.common.util.RestMediaType;
import de.ozgcloud.user.User; import de.ozgcloud.user.User;
import de.ozgcloud.user.UserService; import de.ozgcloud.user.UserService;
import de.ozgcloud.user.common.errorhandling.AccessForbiddenException;
import de.ozgcloud.user.common.errorhandling.FunctionalException;
import io.quarkus.hal.HalEntityWrapper; import io.quarkus.hal.HalEntityWrapper;
@Path(UserSettingsResource.USER_PATH) @Path(UserSettingsResource.USER_PATH)
...@@ -86,7 +86,7 @@ public class UserSettingsResource { ...@@ -86,7 +86,7 @@ public class UserSettingsResource {
throw new FunctionalException(() -> "Request Body missing."); throw new FunctionalException(() -> "Request Body missing.");
} }
return userSettingsService.updateByUserId(userSettings, userId) return userSettingsService.updateByUserId(userId, userSettings)
.map(updatedSettings -> resourceAssembler.toResource(updatedSettings, userId, userManagerUrl)) .map(updatedSettings -> resourceAssembler.toResource(updatedSettings, userId, userManagerUrl))
.orElseThrow(() -> new FunctionalException(() -> "Invalid user id")); .orElseThrow(() -> new FunctionalException(() -> "Invalid user id"));
} }
......
...@@ -40,8 +40,9 @@ class UserSettingsService { ...@@ -40,8 +40,9 @@ class UserSettingsService {
@Inject @Inject
UserSettingsRepository repository; UserSettingsRepository repository;
public Optional<UserSettings> updateByUserId(UserSettings userSettings, String userId) { public Optional<UserSettings> updateByUserId(String userId, UserSettings newSettings) {
return repository.updateByUserId(userId, userSettings); var settings = newSettings.toBuilder().vorgangCreated(newSettings.getNotificationsSendFor() == NotificationsSendFor.ALL).build();
return repository.updateByUserId(userId, settings);
} }
public UserSettings getByUserId(String userId) { public UserSettings getByUserId(String userId) {
......
...@@ -34,6 +34,9 @@ quarkus: ...@@ -34,6 +34,9 @@ quarkus:
management: management:
enabled: true enabled: true
port: 9002 port: 9002
mongock:
migrate-at-start: true
transaction-enabled: false
grpc: grpc:
server: server:
......
...@@ -45,6 +45,8 @@ import org.mockito.Spy; ...@@ -45,6 +45,8 @@ import org.mockito.Spy;
import de.ozgcloud.user.common.errorhandling.ResourceNotFoundException; import de.ozgcloud.user.common.errorhandling.ResourceNotFoundException;
import de.ozgcloud.user.common.errorhandling.TechnicalException; import de.ozgcloud.user.common.errorhandling.TechnicalException;
import de.ozgcloud.user.keycloak.KeycloakUserRemoteService; import de.ozgcloud.user.keycloak.KeycloakUserRemoteService;
import de.ozgcloud.user.settings.NotificationsSendFor;
import de.ozgcloud.user.settings.UserSettings;
class UserServiceTest { class UserServiceTest {
...@@ -365,4 +367,36 @@ class UserServiceTest { ...@@ -365,4 +367,36 @@ class UserServiceTest {
assertThatNoException().isThrownBy(() -> service.assertInactiveUser(user.build())); 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
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
...@@ -37,7 +37,9 @@ import org.mockito.Spy; ...@@ -37,7 +37,9 @@ import org.mockito.Spy;
import de.ozgcloud.user.User; import de.ozgcloud.user.User;
import de.ozgcloud.user.UserTestFactory; import de.ozgcloud.user.UserTestFactory;
import de.ozgcloud.user.common.DocumentUtils;
import de.ozgcloud.user.settings.NotificationsSendFor; import de.ozgcloud.user.settings.NotificationsSendFor;
import de.ozgcloud.user.settings.UserSettings;
import io.quarkus.mongodb.panache.PanacheQuery; import io.quarkus.mongodb.panache.PanacheQuery;
class RecipientRepositoryTest { class RecipientRepositoryTest {
...@@ -50,7 +52,8 @@ class RecipientRepositoryTest { ...@@ -50,7 +52,8 @@ class RecipientRepositoryTest {
@DisplayName("Test finding users by Organistationseinheit") @DisplayName("Test finding users by Organistationseinheit")
@Nested @Nested
class TestFindByOrganisationsEinheit { 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 @Test
void shouldCallFind() { void shouldCallFind() {
......
...@@ -168,7 +168,7 @@ class UserSettingsResourceTest { ...@@ -168,7 +168,7 @@ class UserSettingsResourceTest {
@BeforeEach @BeforeEach
void mockAccess() { void mockAccess() {
doNothing().when(resource).checkUserAccess(anyString()); 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 @Test
...@@ -184,7 +184,7 @@ class UserSettingsResourceTest { ...@@ -184,7 +184,7 @@ class UserSettingsResourceTest {
when(resourceAssembler.toResource(any(), anyString(), anyString())).thenReturn(new HalEntityWrapper(null)); when(resourceAssembler.toResource(any(), anyString(), anyString())).thenReturn(new HalEntityWrapper(null));
resource.updateUserSettings(USER_ID, userSettings); resource.updateUserSettings(USER_ID, userSettings);
verify(userSettingsService).updateByUserId(userSettings, USER_ID); verify(userSettingsService).updateByUserId(USER_ID, userSettings);
} }
@Test @Test
......
...@@ -66,7 +66,7 @@ class UserSettingsServiceITCase { ...@@ -66,7 +66,7 @@ class UserSettingsServiceITCase {
.notificationsSendFor(NotificationsSendFor.ALL) .notificationsSendFor(NotificationsSendFor.ALL)
.build(); .build();
var savedUserSettings = service.updateByUserId(userSettingsToSave, UserTestFactory.ID.toHexString()); var savedUserSettings = service.updateByUserId(UserTestFactory.ID.toHexString(), userSettingsToSave);
assertThat(savedUserSettings) assertThat(savedUserSettings)
.isPresent() .isPresent()
......
...@@ -33,6 +33,8 @@ import org.junit.jupiter.api.BeforeEach; ...@@ -33,6 +33,8 @@ import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Nested;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import org.mockito.ArgumentCaptor;
import org.mockito.Captor;
import org.mockito.InjectMocks; import org.mockito.InjectMocks;
import org.mockito.Mock; import org.mockito.Mock;
...@@ -56,11 +58,54 @@ class UserSettingsServiceTest { ...@@ -56,11 +58,54 @@ class UserSettingsServiceTest {
private final UserSettings userSettings = UserSettingsTestFactory.create(); private final UserSettings userSettings = UserSettingsTestFactory.create();
private final String userId = UUID.randomUUID().toString(); private final String userId = UUID.randomUUID().toString();
@Captor
private ArgumentCaptor<UserSettings> userSettingsArgumentCaptor;
@Test @Test
void shouldCallRepository() { 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);
} }
} }
......
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
...@@ -26,6 +26,10 @@ package de.ozgcloud.user.settings; ...@@ -26,6 +26,10 @@ package de.ozgcloud.user.settings;
public class UserSettingsTestFactory { public class UserSettingsTestFactory {
public static final NotificationsSendFor NOTIFICATIONS_SEND_FOR = NotificationsSendFor.NONE; 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() { public static UserSettings create() {
return createBuilder().build(); return createBuilder().build();
...@@ -33,6 +37,10 @@ public class UserSettingsTestFactory { ...@@ -33,6 +37,10 @@ public class UserSettingsTestFactory {
public static UserSettings.UserSettingsBuilder createBuilder() { public static UserSettings.UserSettingsBuilder createBuilder() {
return UserSettings.builder() 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
...@@ -17,6 +17,8 @@ quarkus: ...@@ -17,6 +17,8 @@ quarkus:
auth-server-url: https://sso.dev.by.ozg-cloud.de/realms/by-kiel-dev auth-server-url: https://sso.dev.by.ozg-cloud.de/realms/by-kiel-dev
management: management:
test-port: 9003 test-port: 9003
mongock:
enabled: false
keycloak: keycloak:
url: http://localhost:8088 url: http://localhost:8088
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment