diff --git a/src/main/java/de/ozgcloud/admin/RootModelAssembler.java b/src/main/java/de/ozgcloud/admin/RootModelAssembler.java index b8bdafb814ac0f6f62d237f91263133fc694b621..a2bfee632f155abf5c8e0b747bde49767050e8ff 100644 --- a/src/main/java/de/ozgcloud/admin/RootModelAssembler.java +++ b/src/main/java/de/ozgcloud/admin/RootModelAssembler.java @@ -21,7 +21,7 @@ */ package de.ozgcloud.admin; -import de.ozgcloud.admin.common.user.CurrentUserHelper; +import de.ozgcloud.admin.common.user.CurrentUserService; import de.ozgcloud.admin.common.user.UserRole; import org.springframework.boot.autoconfigure.data.rest.RepositoryRestProperties; import org.springframework.hateoas.EntityModel; @@ -42,6 +42,8 @@ public class RootModelAssembler implements RepresentationModelAssembler<Root, En private final RepositoryRestProperties restProperties; + private final CurrentUserService currentUserService; + @Override public EntityModel<Root> toModel(Root root) { List<Link> links = buildRootModelLinks(); @@ -50,11 +52,11 @@ public class RootModelAssembler implements RepresentationModelAssembler<Root, En links); } - private List<Link> buildRootModelLinks() { + List<Link> buildRootModelLinks() { List<Link> links = new ArrayList<>(); var rootLinkBuilder = WebMvcLinkBuilder.linkTo(RootController.class); links.add(rootLinkBuilder.withSelfRel()); - if (CurrentUserHelper.hasRole(UserRole.ADMIN_USER)) { + if (currentUserService.hasRole(UserRole.ADMIN_USER)) { links.add(buildConfigLink(rootLinkBuilder)); } return links; diff --git a/src/main/java/de/ozgcloud/admin/common/user/CurrentUserHelper.java b/src/main/java/de/ozgcloud/admin/common/user/CurrentUserHelper.java index eff4ead661cd9b9ec9606d79e3710f293bf02097..97255bb37e082df573e85d532881a8ec951099f2 100644 --- a/src/main/java/de/ozgcloud/admin/common/user/CurrentUserHelper.java +++ b/src/main/java/de/ozgcloud/admin/common/user/CurrentUserHelper.java @@ -45,7 +45,7 @@ public class CurrentUserHelper { private static final Predicate<Authentication> IS_TRUSTED = auth -> !TRUST_RESOLVER.isAnonymous(auth); - public static boolean hasRole(String role) { + static boolean hasRole(String role) { var auth = getAuthentication(); if ((Objects.isNull(auth)) || (Objects.isNull(auth.getPrincipal()))) { diff --git a/src/main/java/de/ozgcloud/admin/common/user/CurrentUserService.java b/src/main/java/de/ozgcloud/admin/common/user/CurrentUserService.java new file mode 100644 index 0000000000000000000000000000000000000000..94912e9e4749fe871f4120477fe840fe617bb52b --- /dev/null +++ b/src/main/java/de/ozgcloud/admin/common/user/CurrentUserService.java @@ -0,0 +1,33 @@ +/* + * Copyright (C) 2024 Das Land Schleswig-Holstein vertreten durch das + * Ministerium für Energiewende, Klimaschutz, Umwelt und Natur + * Zentrales IT-Management + * + * Lizenziert unter der EUPL, Version 1.2 oder - sobald + * diese von der Europäischen Kommission genehmigt wurden - + * Folgeversionen der EUPL ("Lizenz"); + * Sie dürfen dieses Werk ausschließlich gemäß + * dieser Lizenz nutzen. + * Eine Kopie der Lizenz finden Sie hier: + * + * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 + * + * Sofern nicht durch anwendbare Rechtsvorschriften + * gefordert oder in schriftlicher Form vereinbart, wird + * die unter der Lizenz verbreitete Software "so wie sie + * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - + * ausdrücklich oder stillschweigend - verbreitet. + * Die sprachspezifischen Genehmigungen und Beschränkungen + * unter der Lizenz sind dem Lizenztext zu entnehmen. + */ + +package de.ozgcloud.admin.common.user; + +import org.springframework.stereotype.Service; + +@Service +public class CurrentUserService { + public boolean hasRole(String role) { + return CurrentUserHelper.hasRole(role); + } +} diff --git a/src/test/java/de/ozgcloud/admin/RootModelAssemblerTest.java b/src/test/java/de/ozgcloud/admin/RootModelAssemblerTest.java index 2a583e5dabee4474fa74eb71097f9f0e686c9b70..1b43452425c7245e6e7323eaeb7f9afb51ce7889 100644 --- a/src/test/java/de/ozgcloud/admin/RootModelAssemblerTest.java +++ b/src/test/java/de/ozgcloud/admin/RootModelAssemblerTest.java @@ -23,12 +23,12 @@ package de.ozgcloud.admin; import static de.ozgcloud.admin.RootModelAssembler.*; import static org.assertj.core.api.Assertions.*; -import static org.mockito.Mockito.*; import java.util.List; -import de.ozgcloud.admin.common.user.CurrentUserHelper; +import de.ozgcloud.admin.common.user.CurrentUserService; import de.ozgcloud.admin.common.user.UserRole; +import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; @@ -36,10 +36,8 @@ import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.*; import org.mockito.junit.jupiter.MockitoExtension; import org.springframework.boot.autoconfigure.data.rest.RepositoryRestProperties; -import org.springframework.hateoas.EntityModel; import org.springframework.hateoas.Link; - @ExtendWith(MockitoExtension.class) class RootModelAssemblerTest { @@ -50,43 +48,67 @@ class RootModelAssemblerTest { @Mock private RepositoryRestProperties restProperties; + @Mock + private CurrentUserService currentUserService; @DisplayName("Entity Model") @Nested class TestEntityModel { + @BeforeEach + void beforeEach() { + Mockito.when(currentUserService.hasRole(UserRole.ADMIN_USER)).thenReturn(true); + Mockito.when(restProperties.getBasePath()).thenReturn(BASE_PATH); + } @Test - void shouldHaveHrefToBasePathIfAuthorized() { - when(restProperties.getBasePath()).thenReturn(BASE_PATH); - try (MockedStatic<CurrentUserHelper> mockUserHelper = Mockito.mockStatic(CurrentUserHelper.class)) { - mockUserHelper.when(() -> CurrentUserHelper.hasRole(UserRole.ADMIN_USER)).thenReturn(true); + void entityRootModelHasRoot() { + var givenRoot = RootTestFactory.create(); + List<Link> links = List.of(); + Mockito.when(modelAssembler.buildRootModelLinks()).thenReturn(links); - List<Link> links = toModel().getLinks().toList(); + var resultRoot = modelAssembler.toModel(givenRoot).getContent(); - assertThat(links).containsExactly( - Link.of(RootController.PATH), - Link.of(BASE_PATH, REL_CONFIGURATION) - ); - } + assertThat(resultRoot).isEqualTo(givenRoot); } @Test - void shouldNotHaveHrefToBasePathIfUnauthorized() { - try (MockedStatic<CurrentUserHelper> mockUserHelper = Mockito.mockStatic(CurrentUserHelper.class)) { - mockUserHelper.when(() -> CurrentUserHelper.hasRole(UserRole.ADMIN_USER)).thenReturn(false); + void entityRootModelHasLinks() { + List<Link> links = List.of(Link.of(RootController.PATH)); + Mockito.when(modelAssembler.buildRootModelLinks()).thenReturn(links); - List<Link> links = toModel().getLinks().toList(); + var modelLinks = modelAssembler.toModel(RootTestFactory.create()).getLinks(); - assertThat(links).containsExactly( - Link.of(RootController.PATH) - ); - } + assertThat(modelLinks).containsAll(links); } + } + + @DisplayName("Root Model Links") + @Nested + class TestBuildRootModelLinks { - private EntityModel<Root> toModel() { - return modelAssembler.toModel(RootTestFactory.create()); + @Test + void shouldHaveHrefToBasePathIfAuthorized() { + Mockito.when(restProperties.getBasePath()).thenReturn(BASE_PATH); + Mockito.when(currentUserService.hasRole(UserRole.ADMIN_USER)).thenReturn(true); + + List<Link> links = modelAssembler.buildRootModelLinks(); + + assertThat(links).containsExactly( + Link.of(RootController.PATH), + Link.of(BASE_PATH, REL_CONFIGURATION) + ); } + @Test + void shouldNotHaveHrefToBasePathIfUnauthorized() { + Mockito.when(currentUserService.hasRole(UserRole.ADMIN_USER)).thenReturn(false); + + List<Link> links = modelAssembler.buildRootModelLinks(); + + assertThat(links).containsExactly( + Link.of(RootController.PATH) + ); + } } } \ No newline at end of file diff --git a/src/test/java/de/ozgcloud/admin/common/user/CurrentUserServiceTest.java b/src/test/java/de/ozgcloud/admin/common/user/CurrentUserServiceTest.java new file mode 100644 index 0000000000000000000000000000000000000000..4e2f38123a3f02741cf940974756366a86b7ab8b --- /dev/null +++ b/src/test/java/de/ozgcloud/admin/common/user/CurrentUserServiceTest.java @@ -0,0 +1,68 @@ +/* + * Copyright (C) 2024 Das Land Schleswig-Holstein vertreten durch das + * Ministerium für Energiewende, Klimaschutz, Umwelt und Natur + * Zentrales IT-Management + * + * Lizenziert unter der EUPL, Version 1.2 oder - sobald + * diese von der Europäischen Kommission genehmigt wurden - + * Folgeversionen der EUPL ("Lizenz"); + * Sie dürfen dieses Werk ausschließlich gemäß + * dieser Lizenz nutzen. + * Eine Kopie der Lizenz finden Sie hier: + * + * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 + * + * Sofern nicht durch anwendbare Rechtsvorschriften + * gefordert oder in schriftlicher Form vereinbart, wird + * die unter der Lizenz verbreitete Software "so wie sie + * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - + * ausdrücklich oder stillschweigend - verbreitet. + * Die sprachspezifischen Genehmigungen und Beschränkungen + * unter der Lizenz sind dem Lizenztext zu entnehmen. + */ + +package de.ozgcloud.admin.common.user; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; +import org.mockito.MockedStatic; +import org.mockito.Mockito; + +import static org.assertj.core.api.Assertions.assertThat; + +public class CurrentUserServiceTest { + private final CurrentUserService currentUserService = new CurrentUserService(); + + @DisplayName("Has role") + @Nested + class TestHasRole { + @Test + void shouldNotHaveRole() { + try (MockedStatic<CurrentUserHelper> mockUserHelper = Mockito.mockStatic( + CurrentUserHelper.class) + ){ + mockUserHelper.when(() -> CurrentUserHelper.hasRole(Mockito.anyString())) + .thenReturn(false); + + boolean hasRole = currentUserService.hasRole(UserRole.ADMIN_USER); + + assertThat(hasRole).isFalse(); + } + } + + @Test + void shouldHaveRole() { + try (MockedStatic<CurrentUserHelper> mockUserHelper = Mockito.mockStatic( + CurrentUserHelper.class) + ){ + mockUserHelper.when(() -> CurrentUserHelper.hasRole(Mockito.anyString())) + .thenReturn(true); + + boolean hasRole = currentUserService.hasRole(UserRole.ADMIN_USER); + + assertThat(hasRole).isTrue(); + } + } + } +}