From a57802e0fa76a62ff0e7d7720e2cbfce39f7282b Mon Sep 17 00:00:00 2001 From: OZGCloud <ozgcloud@mgm-tp.com> Date: Thu, 26 Sep 2024 14:55:37 +0200 Subject: [PATCH] OZG-3539 OZG-6824 add PUT method --- .../user/settings/UserSettingsResource.java | 18 ++++ .../settings/UserSettingsResourceTest.java | 84 +++++++++++++++++++ 2 files changed, 102 insertions(+) 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 a1bf4dc8..238146e1 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 @@ -28,6 +28,7 @@ import java.util.Objects; import jakarta.inject.Inject; import jakarta.ws.rs.GET; import jakarta.ws.rs.PATCH; +import jakarta.ws.rs.PUT; import jakarta.ws.rs.Path; import jakarta.ws.rs.PathParam; import jakarta.ws.rs.Produces; @@ -75,6 +76,7 @@ public class UserSettingsResource { return resourceAssembler.toResource(userSettingsService.getByUserId(userId), userId, userManagerUrl); } + @Deprecated @PATCH @ResponseStatus(200) @Path("/{id}/settings") @@ -91,6 +93,22 @@ public class UserSettingsResource { .orElseThrow(() -> new FunctionalException(() -> "Invalid user id")); } + @PUT + @ResponseStatus(200) + @Path("/{id}/settings") + @Produces({ MediaType.APPLICATION_JSON, RestMediaType.APPLICATION_HAL_JSON }) + public HalEntityWrapper putUserSettings(@PathParam("id") String userId, UserSettings userSettings) { + checkUserAccess(userId); + + if (Objects.isNull(userSettings)) { + throw new FunctionalException(() -> "Request Body missing."); + } + + return userSettingsService.updateByUserId(userId, userSettings) + .map(updatedSettings -> resourceAssembler.toResource(updatedSettings, userId, userManagerUrl)) + .orElseThrow(() -> new FunctionalException(() -> "Invalid user id")); + } + void checkUserAccess(String userId) { var user = userService.findByExternalId(jwt.getSubject()); 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 3cde1320..5919f450 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 @@ -198,6 +198,90 @@ class UserSettingsResourceTest { } } + @DisplayName("Update Usersettings") + @Nested + class TestPutUserSettings { + + private final UserSettings userSettings = UserSettingsTestFactory.create(); + private final UserSettings updatedUserSettings = UserSettingsTestFactory.create(); + + @DisplayName("with empty body") + @Nested + class TestOnEmptyBody { + + @BeforeEach + void mockAccess() { + doNothing().when(resource).checkUserAccess(anyString()); + } + + @Test + void shouldThrowFunctionalExceptionOnMissingBody() { + assertThatExceptionOfType(FunctionalException.class).isThrownBy(() -> resource.putUserSettings(USER_ID, null)) + .withMessageStartingWith("Functional error: Request Body missing"); + } + } + + @Nested + class TestUserIdNotExist { + @BeforeEach + void mockAccess() { + doNothing().when(resource).checkUserAccess(anyString()); + } + + @Test + void shouldThrowFunctionalExceptionIfInvalidUserId() { + var user = UserSettingsTestFactory.create(); + assertThatExceptionOfType(FunctionalException.class) + .isThrownBy(() -> resource.putUserSettings("wrong_id", user)) + .withMessageStartingWith("Functional error: Invalid user id"); + } + + @Test + void shouldThrowFunctionalExceptionIfEmptyUserId() { + var user = UserSettingsTestFactory.create(); + assertThatExceptionOfType(FunctionalException.class) + .isThrownBy(() -> resource.putUserSettings("", user)) + .withMessageStartingWith("Functional error: Invalid user id"); + } + } + + @DisplayName("with filled body") + @Nested + class TestFilledBody { + + @BeforeEach + void mockAccess() { + doNothing().when(resource).checkUserAccess(anyString()); + when(userSettingsService.updateByUserId(anyString(), any(UserSettings.class))).thenReturn(Optional.of(updatedUserSettings)); + } + + @Test + void shouldCheckAccess() { + when(resourceAssembler.toResource(any(), anyString(), anyString())).thenReturn(new HalEntityWrapper(null)); + resource.putUserSettings(USER_ID, userSettings); + + verify(resource).checkUserAccess(USER_ID); + } + + @Test + void shouldCallUserSettingsService() { + when(resourceAssembler.toResource(any(), anyString(), anyString())).thenReturn(new HalEntityWrapper(null)); + resource.putUserSettings(USER_ID, userSettings); + + verify(userSettingsService).updateByUserId(USER_ID, userSettings); + } + + @Test + void + shouldCallResourceAssembler() { + when(resourceAssembler.toResource(any(), anyString(), anyString())).thenReturn(new HalEntityWrapper(null)); + resource.putUserSettings(USER_ID, userSettings); + + verify(resourceAssembler).toResource(updatedUserSettings, USER_ID, USER_MANAGER_URL); + } + } + } + @DisplayName("Check User access") @Nested class TestCheckUserAccess { -- GitLab