From 9c38b3ed052410affa68c00a89a25593d4130dac Mon Sep 17 00:00:00 2001 From: RIHTARSIC Joze <joze.rihtarsic@ext.ec.europa.eu> Date: Tue, 25 Jul 2023 16:43:28 +0200 Subject: [PATCH] Add unit tests --- .../smp/auth/UILoginAuthenticationToken.java | 11 - .../ec/edelivery/smp/data/dao/GroupDao.java | 22 +- .../edelivery/smp/security/ResourceGuard.java | 27 -- .../edelivery/smp/testutil/TestROUtils.java | 5 +- smp-webapp/pom.xml | 23 +- .../smp/ui/edit/DomainEditController.java | 22 +- .../smp/auth/URLCsrfMatcherTest.java | 1 - .../smp/test/PropertiesTestConfig.java | 13 +- .../smp/test/testutils/MockMvcUtils.java | 28 +- .../smp/test/testutils/TestROUtils.java | 26 ++ .../smp/ui/AbstractControllerTest.java | 20 +- .../smp/ui/edit/DomainEditControllerTest.java | 180 +++++++++++ .../GroupEditControllerIntegrationTest.java | 288 ++++++++++++++++++ .../DomainResourceIntegrationTest.java | 2 +- .../smp/ui/external/UserControllerTest.java | 30 +- .../KeystoreResourceIntegrationTest.java | 16 +- .../TruststoreAdminControllerTest.java | 13 +- .../webapp_integration_test_data.sql | 32 +- 18 files changed, 614 insertions(+), 145 deletions(-) create mode 100644 smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/test/testutils/TestROUtils.java create mode 100644 smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/ui/edit/DomainEditControllerTest.java create mode 100644 smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/ui/edit/GroupEditControllerIntegrationTest.java diff --git a/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/auth/UILoginAuthenticationToken.java b/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/auth/UILoginAuthenticationToken.java index fbf31f7af..43ce5a29d 100644 --- a/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/auth/UILoginAuthenticationToken.java +++ b/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/auth/UILoginAuthenticationToken.java @@ -1,6 +1,5 @@ package eu.europa.ec.edelivery.smp.auth; -import eu.europa.ec.edelivery.security.utils.SecurityUtils; import eu.europa.ec.edelivery.smp.logging.SMPLogger; import eu.europa.ec.edelivery.smp.logging.SMPLoggerFactory; import org.springframework.security.authentication.AbstractAuthenticationToken; @@ -17,7 +16,6 @@ import java.util.Objects; * @since 4.2 */ public class UILoginAuthenticationToken extends UsernamePasswordAuthenticationToken { - private static final SMPLogger LOG = SMPLoggerFactory.getLogger(UILoginAuthenticationToken.class); SMPUserDetails userDetails; public UILoginAuthenticationToken(Object principal, Object credentials, SMPUserDetails userDetails) { @@ -26,15 +24,6 @@ public class UILoginAuthenticationToken extends UsernamePasswordAuthenticationTo this.userDetails = userDetails; } - public SecurityUtils.Secret getSecret() { - - if (userDetails == null) { - LOG.warn("Can not retrieve security token for session. User details is null!"); - return null; - } - return userDetails.getSessionSecret(); - } - public SMPUserDetails getUserDetails() { return userDetails; } diff --git a/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/data/dao/GroupDao.java b/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/data/dao/GroupDao.java index 6294be956..2d7853442 100644 --- a/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/data/dao/GroupDao.java +++ b/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/data/dao/GroupDao.java @@ -16,13 +16,12 @@ package eu.europa.ec.edelivery.smp.data.dao; import eu.europa.ec.edelivery.smp.data.enums.MembershipRoleType; import eu.europa.ec.edelivery.smp.data.model.DBDomain; import eu.europa.ec.edelivery.smp.data.model.DBGroup; -import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Repository; +import org.springframework.transaction.annotation.Transactional; import javax.persistence.NoResultException; import javax.persistence.NonUniqueResultException; import javax.persistence.TypedQuery; -import org.springframework.transaction.annotation.Transactional; import java.util.Arrays; import java.util.List; import java.util.Optional; @@ -30,8 +29,8 @@ import java.util.Optional; import static eu.europa.ec.edelivery.smp.data.dao.QueryNames.*; import static eu.europa.ec.edelivery.smp.exceptions.ErrorCode.ILLEGAL_STATE_DOMAIN_GROUP_MULTIPLE_ENTRY; import static eu.europa.ec.edelivery.smp.exceptions.ErrorCode.ILLEGAL_STATE_DOMAIN_MULTIPLE_ENTRY; -import static org.apache.commons.lang3.StringUtils.*; import static org.apache.commons.lang3.StringUtils.lowerCase; +import static org.apache.commons.lang3.StringUtils.trim; /** * The group of resources with shared resource management rights. The user with group admin has rights to create/delete @@ -74,9 +73,8 @@ public class GroupDao extends BaseDao<DBGroup> { /** * Returns the group or Optional.empty() if there is no group for name and domain. * - * @param name is the group name + * @param name is the group name * @param domain where the group is registered - * * @return the only single record for name from smp_group table or empty value * @throws IllegalStateException if no group is not configured */ @@ -87,9 +85,8 @@ public class GroupDao extends BaseDao<DBGroup> { /** * Returns the group or Optional.empty() if there is no group for name and domain. * - * @param name is the group name + * @param name is the group name * @param domainId where the group is registered - * * @return the only single record for name from smp_group table or empty value * @throws IllegalStateException if no group is not configured */ @@ -102,7 +99,7 @@ public class GroupDao extends BaseDao<DBGroup> { } catch (NoResultException e) { return Optional.empty(); } catch (NonUniqueResultException e) { - throw new IllegalStateException(ILLEGAL_STATE_DOMAIN_GROUP_MULTIPLE_ENTRY.getMessage(name,domainId)); + throw new IllegalStateException(ILLEGAL_STATE_DOMAIN_GROUP_MULTIPLE_ENTRY.getMessage(name, domainId)); } } @@ -110,9 +107,8 @@ public class GroupDao extends BaseDao<DBGroup> { /** * Returns the group or Optional.empty() if there is no group for name and domain code * - * @param name is the group name + * @param name is the group name * @param domainCode where the group is registered - * * @return the only single record for name from smp_group table or empty value * @throws IllegalStateException if no group is not configured */ @@ -125,7 +121,7 @@ public class GroupDao extends BaseDao<DBGroup> { } catch (NoResultException e) { return Optional.empty(); } catch (NonUniqueResultException e) { - throw new IllegalStateException(ILLEGAL_STATE_DOMAIN_MULTIPLE_ENTRY.getMessage(name,domainCode)); + throw new IllegalStateException(ILLEGAL_STATE_DOMAIN_MULTIPLE_ENTRY.getMessage(name, domainCode)); } } @@ -178,8 +174,8 @@ public class GroupDao extends BaseDao<DBGroup> { return false; } - public List<MembershipRoleType> toList(MembershipRoleType ... roleTypes){ - return Arrays.asList(roleTypes ==null || roleTypes.length==0 ?MembershipRoleType.values(): roleTypes); + public List<MembershipRoleType> toList(MembershipRoleType... roleTypes) { + return Arrays.asList(roleTypes == null || roleTypes.length == 0 || roleTypes[0] == null ? MembershipRoleType.values() : roleTypes); } } diff --git a/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/security/ResourceGuard.java b/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/security/ResourceGuard.java index d2380ceba..ec76779bf 100644 --- a/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/security/ResourceGuard.java +++ b/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/security/ResourceGuard.java @@ -14,7 +14,6 @@ import eu.europa.ec.edelivery.smp.data.model.doc.DBSubresource; import eu.europa.ec.edelivery.smp.data.model.user.DBUser; import eu.europa.ec.edelivery.smp.exceptions.ErrorCode; import eu.europa.ec.edelivery.smp.exceptions.SMPRuntimeException; -import eu.europa.ec.edelivery.smp.identifiers.Identifier; import eu.europa.ec.edelivery.smp.logging.SMPLogger; import eu.europa.ec.edelivery.smp.logging.SMPLoggerFactory; import eu.europa.ec.edelivery.smp.servlet.ResourceAction; @@ -41,7 +40,6 @@ public class ResourceGuard { this.identifierService = identifierService; } - /** * Method validates if the user is authorized for action on the resource * @@ -118,16 +116,6 @@ public class ResourceGuard { LOG.debug(SMPLogger.SECURITY_MARKER, "User [{}] authorized: [{}] to read private resource [{}]", user, isResourceMember, resource); return isResourceMember; } - /* - // if resource is internal the domain, group members and resource member can see it - if (resource.getVisibility() == VisibilityType.INTERNAL) { - - boolean isAuthorized = domainMemberDao.isUserDomainMember(dbuser, resource.getDomainResourceDef().getDomain()) - || groupMemberDao.isUserGroupMember(dbuser, Collections.singletonList(resource.getGroup())); - LOG.debug(SMPLogger.SECURITY_MARKER, "User [{}] authorized: [{}] to read internal resource [{}]", user, isAuthorized, resource); - return isAuthorized; - } -*/ LOG.debug(SMPLogger.SECURITY_MARKER, "User [{}] is not authorized to read resource [{}]", user, resource); return false; } @@ -192,19 +180,4 @@ public class ResourceGuard { // Subresource can be created by the resource admin, the same as for update return canUpdate(user, subresource); } - - /** - * Method validates if any of the service group users contains userID - * - * @param userId - * @param dbServiceGroup - * @return - */ - public boolean isResourceAdmin(Long userId, DBResource dbServiceGroup) { - /* return dbServiceGroup != null && - dbServiceGroup.getUsers().stream().filter(user -> user.getId().equals(userId)).findAny().isPresent(); - - */ - return false; - } } diff --git a/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/testutil/TestROUtils.java b/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/testutil/TestROUtils.java index e0e494ae2..d4b8239f3 100644 --- a/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/testutil/TestROUtils.java +++ b/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/testutil/TestROUtils.java @@ -2,7 +2,6 @@ package eu.europa.ec.edelivery.smp.testutil; import eu.europa.ec.edelivery.smp.conversion.X509CertificateToCertificateROConverter; import eu.europa.ec.edelivery.smp.data.enums.VisibilityType; -import eu.europa.ec.edelivery.smp.data.model.DBGroup; import eu.europa.ec.edelivery.smp.data.ui.CertificateRO; import eu.europa.ec.edelivery.smp.data.ui.GroupRO; import eu.europa.ec.edelivery.smp.data.ui.ResourceRO; @@ -32,7 +31,7 @@ public class TestROUtils { return CERT_CONVERTER.convert(cert); } - public static GroupRO createGroup(String groupName, VisibilityType visibility){ + public static GroupRO createGroup(String groupName, VisibilityType visibility) { GroupRO group = new GroupRO(); group.setGroupName(groupName); group.setGroupDescription(anyString()); @@ -41,7 +40,7 @@ public class TestROUtils { } - public static String anyString(){ + public static String anyString() { return UUID.randomUUID().toString(); } } diff --git a/smp-webapp/pom.xml b/smp-webapp/pom.xml index 7cb23c94b..d6446e72d 100644 --- a/smp-webapp/pom.xml +++ b/smp-webapp/pom.xml @@ -105,6 +105,21 @@ <artifactId>hamcrest-junit</artifactId> <scope>test</scope> </dependency> + <dependency> + <groupId>org.junit.jupiter</groupId> + <artifactId>junit-jupiter-engine</artifactId> + <scope>test</scope> + </dependency> + <dependency> + <groupId>org.junit.vintage</groupId> + <artifactId>junit-vintage-engine</artifactId> + <scope>test</scope> + </dependency> + <dependency> + <groupId>org.junit.jupiter</groupId> + <artifactId>junit-jupiter-params</artifactId> + <scope>test</scope> + </dependency> <!-- the default JDBC driver --> <dependency> <groupId>com.mysql</groupId> @@ -153,14 +168,6 @@ <configuration> <runOrder>alphabetical</runOrder> </configuration> - <dependencies> - <!-- Force using the latest JUnit 47 provider Remove this when moving to JUNIT5 --> - <dependency> - <groupId>org.apache.maven.surefire</groupId> - <artifactId>surefire-junit47</artifactId> - <version>${maven-surefire-plugin.version}</version> - </dependency> - </dependencies> </plugin> <plugin> diff --git a/smp-webapp/src/main/java/eu/europa/ec/edelivery/smp/ui/edit/DomainEditController.java b/smp-webapp/src/main/java/eu/europa/ec/edelivery/smp/ui/edit/DomainEditController.java index 7976b85e2..9bcc49a90 100644 --- a/smp-webapp/src/main/java/eu/europa/ec/edelivery/smp/ui/edit/DomainEditController.java +++ b/smp-webapp/src/main/java/eu/europa/ec/edelivery/smp/ui/edit/DomainEditController.java @@ -43,6 +43,7 @@ public class DomainEditController { /** * Method returns all domains where user is domain administrator. + * * @param userEncId encrypted user identifier * @return Domain list where user has role domain administrator */ @@ -51,7 +52,7 @@ public class DomainEditController { public List<DomainRO> getDomainsForUserType( @PathVariable(PATH_PARAM_ENC_USER_ID) String userEncId, @RequestParam(value = PARAM_NAME_TYPE, defaultValue = "domain-admin", required = false) String forRole) { - logAdminAccess("getDomainsForUserType ["+forRole+"]"); + logAdminAccess("getDomainsForUserType [" + forRole + "]"); Long userId = SessionSecurityUtils.decryptEntityId(userEncId); if (StringUtils.equals(forRole, "group-admin")) { @@ -63,7 +64,7 @@ public class DomainEditController { if (StringUtils.isBlank(forRole) || StringUtils.equals(forRole, "domain-admin")) { return uiDomainService.getAllDomainsForDomainAdminUser(userId); } - throw new SMPRuntimeException(ErrorCode.INVALID_REQUEST, "GetDomains", "Unknown parameter type ["+forRole+"]!"); + throw new SMPRuntimeException(ErrorCode.INVALID_REQUEST, "GetDomains", "Unknown parameter type [" + forRole + "]!"); } @@ -76,14 +77,14 @@ public class DomainEditController { @RequestParam(value = PARAM_PAGINATION_PAGE_SIZE, defaultValue = "10") int pageSize, @RequestParam(value = PARAM_PAGINATION_FILTER, defaultValue = "", required = false) String filter) { logAdminAccess("getDomainMemberList"); - LOG.info("Search for domain members with filter [{}], paging: [{}/{}], user: {}",filter, page, pageSize, userEncId); + LOG.info("Search for domain members with filter [{}], paging: [{}/{}], user: {}", filter, page, pageSize, userEncId); Long domainId = SessionSecurityUtils.decryptEntityId(domainEncId); - return uiDomainService.getDomainMembers(domainId, page, pageSize, filter); + return uiDomainService.getDomainMembers(domainId, page, pageSize, filter); } @PutMapping(path = SUB_CONTEXT_PATH_EDIT_DOMAIN_MEMBER_PUT, produces = MimeTypeUtils.APPLICATION_JSON_VALUE, consumes = MimeTypeUtils.APPLICATION_JSON_VALUE) @PreAuthorize("@smpAuthorizationService.isCurrentlyLoggedIn(#userEncId) and (@smpAuthorizationService.systemAdministrator or @smpAuthorizationService.isDomainAdministrator(#domainEncId))") - public MemberRO putDomainMember( + public MemberRO putDomainMember( @PathVariable(PATH_PARAM_ENC_USER_ID) String userEncId, @PathVariable(PATH_PARAM_ENC_DOMAIN_ID) String domainEncId, @RequestBody MemberRO memberRO) { @@ -91,7 +92,7 @@ public class DomainEditController { logAdminAccess("putDomainMember"); LOG.info("add or update domain member"); Long domainId = SessionSecurityUtils.decryptEntityId(domainEncId); - Long memberId = memberRO.getMemberId() == null?null: SessionSecurityUtils.decryptEntityId(memberRO.getMemberId()); + Long memberId = memberRO.getMemberId() == null ? null : SessionSecurityUtils.decryptEntityId(memberRO.getMemberId()); if (memberRO.getRoleType() == null) { memberRO.setRoleType(MembershipRoleType.VIEWER); } @@ -101,14 +102,14 @@ public class DomainEditController { @DeleteMapping(value = SUB_CONTEXT_PATH_EDIT_DOMAIN_MEMBER_DELETE) @PreAuthorize("@smpAuthorizationService.isCurrentlyLoggedIn(#userEncId) and (@smpAuthorizationService.systemAdministrator or @smpAuthorizationService.isDomainAdministrator(#domainEncId))") - public MemberRO deleteDomainMember( + public MemberRO deleteDomainMember( @PathVariable(PATH_PARAM_ENC_USER_ID) String userEncId, @PathVariable(PATH_PARAM_ENC_DOMAIN_ID) String domainEncId, @PathVariable(PATH_PARAM_ENC_MEMBER_ID) String memberEncId - ) { + ) { logAdminAccess("deleteDomainMember"); Long domainId = SessionSecurityUtils.decryptEntityId(domainEncId); - Long memberId= SessionSecurityUtils.decryptEntityId(memberEncId); + Long memberId = SessionSecurityUtils.decryptEntityId(memberEncId); // is user domain admin or system admin return uiDomainService.deleteMemberFromDomain(domainId, memberId); @@ -120,7 +121,7 @@ public class DomainEditController { "(@smpAuthorizationService.systemAdministrator or @smpAuthorizationService.isDomainAdministrator(#domainEncId) " + "or @smpAuthorizationService.isAnyDomainGroupAdministrator(#domainEncId)" + "or @smpAuthorizationService.isAnyResourceAdministrator)") - public List<ResourceDefinitionRO> getDomainResourceDefinitions( + public List<ResourceDefinitionRO> getDomainResourceDefinitions( @PathVariable(PATH_PARAM_ENC_USER_ID) String userEncId, @PathVariable(PATH_PARAM_ENC_DOMAIN_ID) String domainEncId ) { @@ -132,7 +133,6 @@ public class DomainEditController { } - protected void logAdminAccess(String action) { LOG.info(SMPLogger.SECURITY_MARKER, "Admin Domain action [{}] by user [{}], ", action, SessionSecurityUtils.getSessionUserDetails()); } diff --git a/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/auth/URLCsrfMatcherTest.java b/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/auth/URLCsrfMatcherTest.java index 4d8b2160e..318bec87f 100644 --- a/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/auth/URLCsrfMatcherTest.java +++ b/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/auth/URLCsrfMatcherTest.java @@ -12,7 +12,6 @@ import java.util.List; import static java.util.Arrays.asList; import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertTrue; @RunWith(Parameterized.class) public class URLCsrfMatcherTest { diff --git a/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/test/PropertiesTestConfig.java b/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/test/PropertiesTestConfig.java index d3e8c655d..a0e47597d 100644 --- a/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/test/PropertiesTestConfig.java +++ b/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/test/PropertiesTestConfig.java @@ -13,14 +13,13 @@ package eu.europa.ec.edelivery.smp.test; -import eu.europa.ec.edelivery.smp.config.enums.SMPEnvPropertyEnum; -import eu.europa.ec.edelivery.smp.config.enums.SMPPropertyEnum; -import org.springframework.context.annotation.*; -import org.springframework.context.support.PropertySourcesPlaceholderConfigurer; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.PropertySource; +import org.springframework.context.annotation.PropertySources; import java.nio.file.Path; import java.nio.file.Paths; -import java.util.Properties; import static eu.europa.ec.edelivery.smp.config.enums.SMPEnvPropertyEnum.*; import static eu.europa.ec.edelivery.smp.config.enums.SMPPropertyEnum.*; @@ -35,14 +34,14 @@ import static eu.europa.ec.edelivery.smp.config.enums.SMPPropertyEnum.*; }) @ComponentScan(basePackages = "eu.europa.ec.edelivery.smp") public class PropertiesTestConfig { - public static final String DATABASE_URL = "jdbc:h2:file:./target/DomiSmpWebDb;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=TRUE;AUTO_SERVER=TRUE;"; + public static final String DATABASE_URL = "jdbc:h2:file:./target/DomiSmpWebDb;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=TRUE;AUTO_SERVER=TRUE;Mode=MySQL"; public static final String DATABASE_USERNAME = "smp"; public static final String DATABASE_PASS = "smp"; public static final String DATABASE_DRIVER = "org.h2.Driver"; public static final String DATABASE_DIALECT = "org.hibernate.dialect.H2Dialect"; public static final String BUILD_FOLDER = "target"; - public static final Path SECURITY_PATH= Paths.get(BUILD_FOLDER, "keystores"); + public static final Path SECURITY_PATH = Paths.get(BUILD_FOLDER, "keystores"); static { System.setProperty(JDBC_DRIVER.getProperty(), DATABASE_DRIVER); diff --git a/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/test/testutils/MockMvcUtils.java b/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/test/testutils/MockMvcUtils.java index 04b9602d5..bb83b65e7 100644 --- a/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/test/testutils/MockMvcUtils.java +++ b/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/test/testutils/MockMvcUtils.java @@ -4,6 +4,8 @@ import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.json.JsonMapper; import com.fasterxml.jackson.databind.type.CollectionType; +import eu.europa.ec.edelivery.smp.data.ui.DomainRO; +import eu.europa.ec.edelivery.smp.data.ui.SearchUserRO; import eu.europa.ec.edelivery.smp.data.ui.UserRO; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -24,8 +26,7 @@ import java.io.IOException; import java.io.UnsupportedEncodingException; import java.util.List; -import static eu.europa.ec.edelivery.smp.ui.ResourceConstants.CONTEXT_PATH_PUBLIC_SECURITY; -import static eu.europa.ec.edelivery.smp.ui.ResourceConstants.CONTEXT_PATH_PUBLIC_SECURITY_AUTHENTICATION; +import static eu.europa.ec.edelivery.smp.ui.ResourceConstants.*; import static org.junit.Assert.assertNotNull; import static org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.csrf; import static org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.httpBasic; @@ -143,6 +144,29 @@ public class MockMvcUtils { return mapper.readValue(asByteArray, UserRO.class); } + public static List<DomainRO> geUserDomainsForRole(MockMvc mvc, MockHttpSession session, UserRO userRO, String forRole) throws Exception { + + MvcResult result = mvc.perform(get(CONTEXT_PATH_EDIT_DOMAIN, userRO.getUserId()) + .param(PARAM_NAME_TYPE, forRole) + .session(session) + .with(csrf())) + .andExpect(status().isOk()).andReturn(); + return getArrayFromResponse(result, DomainRO.class); + } + + public static List<SearchUserRO> geUsersByUsernameFilter(MockMvc mvc, MockHttpSession session, UserRO userRO, String username) throws Exception { + + MvcResult result = mvc.perform(get(CONTEXT_PATH_PUBLIC_USER + "/{user-id}/search", userRO.getUserId()) + .param(PARAM_PAGINATION_FILTER, username) + .session(session) + .with(csrf())) + .andExpect(status().isOk()).andReturn(); + return getArrayFromResponse(result, SearchUserRO.class); + } + + + + public static <T> T getObjectFromResponse(MvcResult result, Class<T> clazz) throws IOException { return mapper.readValue(result.getResponse().getContentAsByteArray(), clazz); diff --git a/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/test/testutils/TestROUtils.java b/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/test/testutils/TestROUtils.java new file mode 100644 index 000000000..6665f2a66 --- /dev/null +++ b/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/test/testutils/TestROUtils.java @@ -0,0 +1,26 @@ +package eu.europa.ec.edelivery.smp.test.testutils; + +import eu.europa.ec.edelivery.smp.data.enums.VisibilityType; +import eu.europa.ec.edelivery.smp.data.ui.GroupRO; + +import java.util.UUID; + +public class TestROUtils { + + public static GroupRO createGroup() { + return createGroup(anyString()); + } + + + public static GroupRO createGroup(String name) { + GroupRO groupRO = new GroupRO(); + groupRO.setGroupName(name); + groupRO.setGroupDescription(anyString()); + groupRO.setVisibility(VisibilityType.PRIVATE); + return groupRO; + } + + public static String anyString() { + return UUID.randomUUID().toString(); + } +} diff --git a/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/ui/AbstractControllerTest.java b/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/ui/AbstractControllerTest.java index e2ecfdbf4..9a4a27a84 100644 --- a/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/ui/AbstractControllerTest.java +++ b/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/ui/AbstractControllerTest.java @@ -6,27 +6,31 @@ import eu.europa.ec.edelivery.smp.data.dao.ConfigurationDao; import eu.europa.ec.edelivery.smp.test.SmpTestWebAppConfig; import eu.europa.ec.edelivery.smp.test.testutils.MockMvcUtils; import eu.europa.ec.edelivery.smp.test.testutils.X509CertificateTestUtils; -import org.junit.runner.RunWith; +import org.junit.jupiter.api.extension.ExtendWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.test.annotation.DirtiesContext; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.jdbc.Sql; -import org.springframework.test.context.junit4.SpringRunner; +import org.springframework.test.context.junit.jupiter.SpringExtension; import org.springframework.test.context.web.WebAppConfiguration; import org.springframework.test.web.servlet.MockMvc; import org.springframework.web.context.WebApplicationContext; import java.io.IOException; +import static org.springframework.test.context.jdbc.Sql.ExecutionPhase.BEFORE_TEST_METHOD; -@RunWith(SpringRunner.class) -@DirtiesContext +@ExtendWith(SpringExtension.class) @WebAppConfiguration @ContextConfiguration(classes = {SmpTestWebAppConfig.class}) +@DirtiesContext @Sql(scripts = { "classpath:/cleanup-database.sql", - "classpath:/webapp_integration_test_data.sql"}) + "classpath:/webapp_integration_test_data.sql"}, + executionPhase = BEFORE_TEST_METHOD) abstract public class AbstractControllerTest { + + protected ObjectMapper mapper = null; protected MockMvc mvc; @Autowired private WebApplicationContext webAppContext; @@ -40,8 +44,10 @@ abstract public class AbstractControllerTest { } public ObjectMapper getObjectMapper() { - ObjectMapper mapper = new ObjectMapper(); - mapper.registerModule(new JavaTimeModule()); + if (mapper == null) { + mapper = new ObjectMapper(); + mapper.registerModule(new JavaTimeModule()); + } return mapper; } } diff --git a/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/ui/edit/DomainEditControllerTest.java b/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/ui/edit/DomainEditControllerTest.java new file mode 100644 index 000000000..13a87b6b2 --- /dev/null +++ b/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/ui/edit/DomainEditControllerTest.java @@ -0,0 +1,180 @@ +package eu.europa.ec.edelivery.smp.ui.edit; + +import eu.europa.ec.edelivery.smp.data.enums.MembershipRoleType; +import eu.europa.ec.edelivery.smp.data.ui.DomainRO; +import eu.europa.ec.edelivery.smp.data.ui.MemberRO; +import eu.europa.ec.edelivery.smp.data.ui.ServiceResult; +import eu.europa.ec.edelivery.smp.data.ui.UserRO; +import eu.europa.ec.edelivery.smp.services.ui.UIGroupPublicService; +import eu.europa.ec.edelivery.smp.ui.AbstractControllerTest; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.CsvSource; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.MediaType; +import org.springframework.mock.web.MockHttpSession; +import org.springframework.test.web.servlet.MvcResult; + +import java.io.IOException; +import java.util.List; + +import static eu.europa.ec.edelivery.smp.test.testutils.MockMvcUtils.*; +import static eu.europa.ec.edelivery.smp.ui.ResourceConstants.*; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.csrf; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + + +public class DomainEditControllerTest extends AbstractControllerTest { + private static final String PATH = CONTEXT_PATH_EDIT_DOMAIN; + + @Autowired + protected UIGroupPublicService uiGroupPublicService; + + @BeforeEach + public void setup() throws IOException { + super.setup(); + } + + @ParameterizedTest + @CsvSource({ + ", 1", + "'', 1", + "domain-admin, 1", + "group-admin, 1", + "resource-admin, 0", + }) + public void testGetDomains(String roleType, int values) throws Exception { + // given when + MockHttpSession session = loginWithSystemAdmin(mvc); + UserRO userRO = getLoggedUserData(mvc, session); + List<DomainRO> domainsForUser = geUserDomainsForRole(mvc, session, userRO, null); + assertEquals(1, domainsForUser.size()); + DomainRO domainRO = domainsForUser.get(0); + // when + MvcResult result = mvc.perform(get(PATH, userRO.getUserId(), domainRO.getDomainId()) + .session(session) + .param(PARAM_NAME_TYPE, roleType) + .with(csrf())) + .andExpect(status().isOk()).andReturn(); + + //then + List<DomainRO> listDomains = getArrayFromResponse(result, DomainRO.class); + assertNotNull(listDomains); + assertEquals(values, listDomains.size()); + } + + + @Test + public void testGetDomainMembers() throws Exception { + // given + MockHttpSession session = loginWithSystemAdmin(mvc); + UserRO userRO = getLoggedUserData(mvc, session); + List<DomainRO> domainsForUser = geUserDomainsForRole(mvc, session, userRO, null); + assertEquals(1, domainsForUser.size()); + DomainRO domainRO = domainsForUser.get(0); + + // when + MvcResult result = mvc.perform(get(PATH + '/' + SUB_CONTEXT_PATH_EDIT_DOMAIN_MEMBER, userRO.getUserId(), domainRO.getDomainId()) + .session(session) + .with(csrf())) + .andExpect(status().isOk()).andReturn(); + + //then + ServiceResult serviceResult = getObjectFromResponse(result, ServiceResult.class); + assertNotNull(serviceResult); + assertEquals(1, serviceResult.getServiceEntities().size()); + MemberRO memberRO = getObjectMapper().convertValue(serviceResult.getServiceEntities().get(0), MemberRO.class); + + // the admin user who created group is automatically added as member + assertEquals(userRO.getUsername(), memberRO.getUsername()); + } + + @Test + public void testAddDomainMember() throws Exception { + // given + MockHttpSession session = loginWithSystemAdmin(mvc); + UserRO userRO = getLoggedUserData(mvc, session); + List<DomainRO> domainsForUser = geUserDomainsForRole(mvc, session, userRO, null); + assertEquals(1, domainsForUser.size()); + DomainRO domainRO = domainsForUser.get(0); + + //when + MemberRO response = addDomainMember(session, domainRO, userRO, SG_USER_USERNAME); + // then + assertNotNull(response); + assertEquals(SG_USER_USERNAME, response.getUsername()); + } + + @Test + public void testDeleteDomainMember() throws Exception { + // given + MockHttpSession session = loginWithSystemAdmin(mvc); + UserRO userRO = getLoggedUserData(mvc, session); + List<DomainRO> domainsForUser = geUserDomainsForRole(mvc, session, userRO, null); + assertEquals(1, domainsForUser.size()); + DomainRO domainRO = domainsForUser.get(0); + + MemberRO member = addDomainMember(session, domainRO, userRO, SG_USER_USERNAME); + + MvcResult deleteGroupMemberResult = mvc.perform(delete(PATH + '/' + SUB_CONTEXT_PATH_EDIT_DOMAIN_MEMBER_DELETE, userRO.getUserId(), domainRO.getDomainId(), member.getMemberId()) + .session(session) + .with(csrf())) + .andExpect(status().isOk()).andReturn(); + + //then + MemberRO response = getObjectFromResponse(deleteGroupMemberResult, MemberRO.class); + assertNotNull(response); + assertEquals(SG_USER_USERNAME, response.getUsername()); + } + + @Test + public void testUpdateDomainMember() throws Exception { + // given + MockHttpSession session = loginWithSystemAdmin(mvc); + UserRO userRO = getLoggedUserData(mvc, session); + List<DomainRO> domainsForUser = geUserDomainsForRole(mvc, session, userRO, null); + assertEquals(1, domainsForUser.size()); + DomainRO domainRO = domainsForUser.get(0); + MemberRO member = addDomainMember(session, domainRO, userRO, SG_USER_USERNAME); + assertEquals(MembershipRoleType.VIEWER, member.getRoleType()); + member.setRoleType(MembershipRoleType.ADMIN); + + + MvcResult deleteGroupMemberResult = mvc.perform(put(PATH + '/' + SUB_CONTEXT_PATH_EDIT_DOMAIN_MEMBER_PUT, userRO.getUserId(), domainRO.getDomainId(), member.getMemberId()) + .session(session) + .with(csrf()) + .contentType(MediaType.APPLICATION_JSON) + .content(getObjectMapper().writeValueAsBytes(member))) + .andExpect(status().isOk()).andReturn(); + + //then + MemberRO response = getObjectFromResponse(deleteGroupMemberResult, MemberRO.class); + assertNotNull(response); + assertEquals(SG_USER_USERNAME, response.getUsername()); + assertEquals(member.getRoleType(), response.getRoleType()); + } + + + public MemberRO addDomainMember(MockHttpSession session, DomainRO domainRO, UserRO domainAdminUser, String newMemberUsername) throws Exception { + + MemberRO memberToAdd = new MemberRO(); + memberToAdd.setRoleType(MembershipRoleType.VIEWER); + memberToAdd.setUsername(newMemberUsername); + + // when + MvcResult result = mvc.perform(put(PATH + '/' + SUB_CONTEXT_PATH_EDIT_DOMAIN_MEMBER_PUT, domainAdminUser.getUserId(), domainRO.getDomainId()) + .session(session) + .with(csrf()) + .contentType(MediaType.APPLICATION_JSON) + .content(getObjectMapper().writeValueAsBytes(memberToAdd))) + .andExpect(status().isOk()).andReturn(); + + //then + return getObjectFromResponse(result, MemberRO.class); + } + +} diff --git a/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/ui/edit/GroupEditControllerIntegrationTest.java b/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/ui/edit/GroupEditControllerIntegrationTest.java new file mode 100644 index 000000000..78f2a720e --- /dev/null +++ b/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/ui/edit/GroupEditControllerIntegrationTest.java @@ -0,0 +1,288 @@ +package eu.europa.ec.edelivery.smp.ui.edit; + +import eu.europa.ec.edelivery.smp.data.enums.MembershipRoleType; +import eu.europa.ec.edelivery.smp.data.enums.VisibilityType; +import eu.europa.ec.edelivery.smp.data.ui.*; +import eu.europa.ec.edelivery.smp.services.ui.UIGroupPublicService; +import eu.europa.ec.edelivery.smp.test.testutils.TestROUtils; +import eu.europa.ec.edelivery.smp.ui.AbstractControllerTest; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.CsvSource; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.MediaType; +import org.springframework.mock.web.MockHttpSession; +import org.springframework.test.web.servlet.MvcResult; + +import java.io.IOException; +import java.util.List; +import java.util.UUID; + +import static eu.europa.ec.edelivery.smp.test.testutils.MockMvcUtils.*; +import static eu.europa.ec.edelivery.smp.ui.ResourceConstants.*; +import static org.junit.jupiter.api.Assertions.*; +import static org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.csrf; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +/** + * For the test configuration see the webapp_integration_test_data.sql file. + * The system admin user is admin member of domain '1' and group '1'. + */ +public class GroupEditControllerIntegrationTest extends AbstractControllerTest { + private static final String PATH = CONTEXT_PATH_EDIT_GROUP; + + @Autowired + protected UIGroupPublicService uiGroupPublicService; + + @BeforeEach + public void setup() throws IOException { + super.setup(); + } + + @ParameterizedTest + @CsvSource({ + ", 2", + "'', 2", + "group-admin, 1", + "resource-admin, 0", + "group-viewer, 0", + "all-roles, 1" + }) + public void testGetGroup(String roleType, int values) throws Exception { + // given when + MockHttpSession session = loginWithSystemAdmin(mvc); + UserRO userRO = getLoggedUserData(mvc, session); + List<DomainRO> domainsForUser = geUserDomainsForRole(mvc, session, userRO, null); + assertEquals(1, domainsForUser.size()); + DomainRO domainRO = domainsForUser.get(0); + // when + MvcResult result = mvc.perform(get(PATH, userRO.getUserId(), domainRO.getDomainId()) + .session(session) + .param(PARAM_NAME_TYPE, roleType) + .with(csrf())) + .andExpect(status().isOk()).andReturn(); + + //then + List<GroupRO> listGroups = getArrayFromResponse(result, GroupRO.class); + assertNotNull(listGroups); + assertEquals(values, listGroups.size()); + } + + @Test + public void testPutGroup() throws Exception { + // given + MockHttpSession session = loginWithSystemAdmin(mvc); + UserRO userRO = getLoggedUserData(mvc, session); + List<DomainRO> domainsForUser = geUserDomainsForRole(mvc, session, userRO, null); + assertEquals(1, domainsForUser.size()); + DomainRO domainRO = domainsForUser.get(0); + GroupRO groupRO = new GroupRO(); + groupRO.setGroupName(UUID.randomUUID().toString()); + groupRO.setGroupDescription(UUID.randomUUID().toString()); + groupRO.setVisibility(VisibilityType.PRIVATE); + + int initialGroupSize = uiGroupPublicService.getAllGroupsForDomain(1L).size(); + // when + MvcResult result = mvc.perform(put(PATH + '/' + SUB_CONTEXT_PATH_EDIT_GROUP_CREATE, userRO.getUserId(), domainRO.getDomainId()) + .session(session) + .with(csrf()) + .contentType(MediaType.APPLICATION_JSON) + .content(getObjectMapper().writeValueAsBytes(groupRO))) + .andExpect(status().isOk()).andReturn(); + + //then + GroupRO response = getObjectFromResponse(result, GroupRO.class); + assertNotNull(response); + assertEquals(VisibilityType.PRIVATE, response.getVisibility()); + assertEquals(groupRO.getGroupName(), response.getGroupName()); + assertEquals(groupRO.getGroupDescription(), response.getGroupDescription()); + assertEquals(initialGroupSize + 1, uiGroupPublicService.getAllGroupsForDomain(1L).size()); + } + + @Test + public void testDeleteGroup() throws Exception { + // given + MockHttpSession session = loginWithSystemAdmin(mvc); + UserRO userRO = getLoggedUserData(mvc, session); + List<DomainRO> domainsForUser = geUserDomainsForRole(mvc, session, userRO, null); + assertEquals(1, domainsForUser.size()); + DomainRO domainRO = domainsForUser.get(0); + GroupRO groupRO = addGroupToDomain(session, domainRO, userRO); + + int initialGroupSize = uiGroupPublicService.getAllGroupsForDomain(1L).size(); + + // when + MvcResult result = mvc.perform(delete(PATH + '/' + SUB_CONTEXT_PATH_EDIT_GROUP_DELETE, userRO.getUserId(), domainRO.getDomainId(), groupRO.getGroupId()) + .session(session) + .with(csrf())) + .andExpect(status().isOk()).andReturn(); + + + GroupRO response = getObjectFromResponse(result, GroupRO.class); + assertNotNull(response); + assertEquals(VisibilityType.PRIVATE, response.getVisibility()); + assertEquals(groupRO.getGroupName(), response.getGroupName()); + assertEquals(groupRO.getGroupDescription(), response.getGroupDescription()); + assertEquals(initialGroupSize - 1, uiGroupPublicService.getAllGroupsForDomain(1L).size()); + } + + @Test + public void testUpdateGroup() throws Exception { + // given + MockHttpSession session = loginWithSystemAdmin(mvc); + UserRO userRO = getLoggedUserData(mvc, session); + List<DomainRO> domainsForUser = geUserDomainsForRole(mvc, session, userRO, null); + assertEquals(1, domainsForUser.size()); + DomainRO domainRO = domainsForUser.get(0); + GroupRO groupRO = addGroupToDomain(session, domainRO, userRO); + + groupRO.setVisibility(VisibilityType.PUBLIC); + groupRO.setGroupDescription(TestROUtils.anyString()); + groupRO.setGroupName(TestROUtils.anyString()); + + // when + MvcResult result = mvc.perform(post(PATH + '/' + SUB_CONTEXT_PATH_EDIT_GROUP_UPDATE, userRO.getUserId(), domainRO.getDomainId(), groupRO.getGroupId()) + .session(session) + .with(csrf()) + .contentType(MediaType.APPLICATION_JSON) + .content(getObjectMapper().writeValueAsBytes(groupRO))) + .andExpect(status().isOk()).andReturn(); + + + GroupRO response = getObjectFromResponse(result, GroupRO.class); + assertNotNull(response); + assertEquals(groupRO.getVisibility(), response.getVisibility()); + assertEquals(groupRO.getGroupName(), response.getGroupName()); + assertEquals(groupRO.getGroupDescription(), response.getGroupDescription()); + } + + + @Test + public void testGetGroupMembers() throws Exception { + // given + MockHttpSession session = loginWithSystemAdmin(mvc); + UserRO userRO = getLoggedUserData(mvc, session); + List<DomainRO> domainsForUser = geUserDomainsForRole(mvc, session, userRO, null); + assertEquals(1, domainsForUser.size()); + DomainRO domainRO = domainsForUser.get(0); + GroupRO groupRO = addGroupToDomain(session, domainRO, userRO); + + // when + MvcResult result = mvc.perform(get(PATH + '/' + SUB_CONTEXT_PATH_EDIT_GROUP_MEMBER, userRO.getUserId(), domainRO.getDomainId(), groupRO.getGroupId()) + .session(session) + .with(csrf())) + .andExpect(status().isOk()).andReturn(); + + //then + ServiceResult serviceResult = getObjectFromResponse(result, ServiceResult.class); + assertNotNull(serviceResult); + assertEquals(1, serviceResult.getServiceEntities().size()); + MemberRO memberRO = getObjectMapper().convertValue(serviceResult.getServiceEntities().get(0), MemberRO.class); + + // the admin user who created group is automatically added as member + assertEquals(userRO.getUsername(), memberRO.getUsername()); + } + + + @Test + public void testAddGroupMember() throws Exception { + // given + MockHttpSession session = loginWithSystemAdmin(mvc); + UserRO userRO = getLoggedUserData(mvc, session); + List<DomainRO> domainsForUser = geUserDomainsForRole(mvc, session, userRO, null); + assertEquals(1, domainsForUser.size()); + DomainRO domainRO = domainsForUser.get(0); + GroupRO groupRO = addGroupToDomain(session, domainRO, userRO); + + //when + MemberRO response = addGroupMember(session, domainRO, groupRO, userRO, SG_USER_USERNAME); + // then + assertNotNull(response); + assertEquals(SG_USER_USERNAME, response.getUsername()); + } + + @Test + public void testDeleteGroupMember() throws Exception { + // given + MockHttpSession session = loginWithSystemAdmin(mvc); + UserRO userRO = getLoggedUserData(mvc, session); + List<DomainRO> domainsForUser = geUserDomainsForRole(mvc, session, userRO, null); + assertEquals(1, domainsForUser.size()); + DomainRO domainRO = domainsForUser.get(0); + GroupRO groupRO = addGroupToDomain(session, domainRO, userRO); + MemberRO member = addGroupMember(session, domainRO, groupRO, userRO, SG_USER_USERNAME); + + MvcResult deleteGroupMemberResult = mvc.perform(delete(PATH + '/' + SUB_CONTEXT_PATH_EDIT_GROUP_MEMBER_DELETE, userRO.getUserId(), domainRO.getDomainId(), groupRO.getGroupId(), member.getMemberId()) + .session(session) + .with(csrf())) + .andExpect(status().isOk()).andReturn(); + + //then + MemberRO response = getObjectFromResponse(deleteGroupMemberResult, MemberRO.class); + assertNotNull(response); + assertEquals(SG_USER_USERNAME, response.getUsername()); + } + + @Test + public void testUpdateGroupMember() throws Exception { + // given + MockHttpSession session = loginWithSystemAdmin(mvc); + UserRO userRO = getLoggedUserData(mvc, session); + List<DomainRO> domainsForUser = geUserDomainsForRole(mvc, session, userRO, null); + assertEquals(1, domainsForUser.size()); + DomainRO domainRO = domainsForUser.get(0); + GroupRO groupRO = addGroupToDomain(session, domainRO, userRO); + MemberRO member = addGroupMember(session, domainRO, groupRO, userRO, SG_USER_USERNAME); + assertEquals(MembershipRoleType.VIEWER, member.getRoleType()); + member.setRoleType(MembershipRoleType.ADMIN); + + + MvcResult deleteGroupMemberResult = mvc.perform(put(PATH + '/' + SUB_CONTEXT_PATH_EDIT_GROUP_MEMBER_PUT, userRO.getUserId(), domainRO.getDomainId(), groupRO.getGroupId(), member.getMemberId()) + .session(session) + .with(csrf()) + .contentType(MediaType.APPLICATION_JSON) + .content(getObjectMapper().writeValueAsBytes(member))) + .andExpect(status().isOk()).andReturn(); + + //then + MemberRO response = getObjectFromResponse(deleteGroupMemberResult, MemberRO.class); + assertNotNull(response); + assertEquals(SG_USER_USERNAME, response.getUsername()); + assertEquals(member.getRoleType(), response.getRoleType()); + } + + + public GroupRO addGroupToDomain(MockHttpSession session, DomainRO domainRO, UserRO domainAdminUser) throws Exception { + + + GroupRO groupRO = TestROUtils.createGroup(); + MvcResult addGroupResult = mvc.perform(put(PATH + '/' + SUB_CONTEXT_PATH_EDIT_GROUP_CREATE, domainAdminUser.getUserId(), domainRO.getDomainId()) + .session(session) + .with(csrf()) + .contentType(MediaType.APPLICATION_JSON) + .content(getObjectMapper().writeValueAsBytes(groupRO))) + .andExpect(status().isOk()).andReturn(); + return getObjectFromResponse(addGroupResult, GroupRO.class); + } + + public MemberRO addGroupMember(MockHttpSession session, DomainRO domainRO, GroupRO groupRO, UserRO domainAdminUser, String newMemberUsername) throws Exception { + + MemberRO memberToAdd = new MemberRO(); + memberToAdd.setRoleType(MembershipRoleType.VIEWER); + memberToAdd.setUsername(newMemberUsername); + + // when + MvcResult result = mvc.perform(put(PATH + '/' + SUB_CONTEXT_PATH_EDIT_GROUP_MEMBER_PUT, domainAdminUser.getUserId(), domainRO.getDomainId(), groupRO.getGroupId()) + .session(session) + .with(csrf()) + .contentType(MediaType.APPLICATION_JSON) + .content(getObjectMapper().writeValueAsBytes(memberToAdd))) + .andExpect(status().isOk()).andReturn(); + + //then + return getObjectFromResponse(result, MemberRO.class); + } + +} diff --git a/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/ui/external/DomainResourceIntegrationTest.java b/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/ui/external/DomainResourceIntegrationTest.java index ffad2c65c..fe034ae9f 100644 --- a/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/ui/external/DomainResourceIntegrationTest.java +++ b/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/ui/external/DomainResourceIntegrationTest.java @@ -66,7 +66,7 @@ public class DomainResourceIntegrationTest { .with(csrf())) .andExpect(status().isOk()).andReturn(); - //them + //then ObjectMapper mapper = new ObjectMapper(); ServiceResult res = mapper.readValue(result.getResponse().getContentAsString(), ServiceResult.class); diff --git a/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/ui/external/UserControllerTest.java b/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/ui/external/UserControllerTest.java index ca2472210..d6a89a82d 100644 --- a/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/ui/external/UserControllerTest.java +++ b/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/ui/external/UserControllerTest.java @@ -5,9 +5,8 @@ import eu.europa.ec.edelivery.smp.data.ui.SearchUserRO; import eu.europa.ec.edelivery.smp.data.ui.UserRO; import eu.europa.ec.edelivery.smp.services.ui.UIUserService; import eu.europa.ec.edelivery.smp.ui.AbstractControllerTest; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.mock.web.MockHttpSession; import org.springframework.test.web.servlet.MvcResult; @@ -19,6 +18,7 @@ import java.util.stream.Collectors; import static eu.europa.ec.edelivery.smp.test.testutils.MockMvcUtils.*; import static eu.europa.ec.edelivery.smp.ui.ResourceConstants.CONTEXT_PATH_PUBLIC_USER; +import static org.junit.jupiter.api.Assertions.*; import static org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.csrf; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; @@ -30,7 +30,7 @@ public class UserControllerTest extends AbstractControllerTest { @Autowired protected UIUserService uiUserService; - @Before + @BeforeEach public void setup() throws IOException { super.setup(); } @@ -48,10 +48,10 @@ public class UserControllerTest extends AbstractControllerTest { NavigationTreeNodeRO result = getObjectFromResponse(response, NavigationTreeNodeRO.class); - Assert.assertNotNull(result); - Assert.assertEquals(4, result.getChildren().size()); + assertNotNull(result); + assertEquals(4, result.getChildren().size()); List<String> childrenNames = result.getChildren().stream().map(NavigationTreeNodeRO::getName).collect(Collectors.toList()); - Assert.assertEquals(Arrays.asList("Search", "Administration", "System settings", "User Settings"), childrenNames); + assertEquals(Arrays.asList("Search", "Administration", "System settings", "User Settings"), childrenNames); } @Test @@ -66,10 +66,10 @@ public class UserControllerTest extends AbstractControllerTest { NavigationTreeNodeRO result = getObjectFromResponse(response, NavigationTreeNodeRO.class); - Assert.assertNotNull(result); - Assert.assertEquals(3, result.getChildren().size()); + assertNotNull(result); + assertEquals(3, result.getChildren().size()); List<String> childrenNames = result.getChildren().stream().map(NavigationTreeNodeRO::getName).collect(Collectors.toList()); - Assert.assertEquals(Arrays.asList("Search", "Administration", "User Settings"), childrenNames); + assertEquals(Arrays.asList("Search", "Administration", "User Settings"), childrenNames); } @Test @@ -83,8 +83,8 @@ public class UserControllerTest extends AbstractControllerTest { List<SearchUserRO> result = getArrayFromResponse(response, SearchUserRO.class); - Assert.assertNotNull(result); - Assert.assertTrue(result.size()>5); + assertNotNull(result); + assertTrue(result.size() > 5); } @Test @@ -98,8 +98,8 @@ public class UserControllerTest extends AbstractControllerTest { List<SearchUserRO> result = getArrayFromResponse(response, SearchUserRO.class); - Assert.assertNotNull(result); - Assert.assertEquals(1, result.size()); - Assert.assertEquals(userRO.getUsername(), result.get(0).getUsername()); + assertNotNull(result); + assertEquals(1, result.size()); + assertEquals(userRO.getUsername(), result.get(0).getUsername()); } } diff --git a/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/ui/internal/KeystoreResourceIntegrationTest.java b/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/ui/internal/KeystoreResourceIntegrationTest.java index 7bf7eb852..4d8c2b2e4 100644 --- a/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/ui/internal/KeystoreResourceIntegrationTest.java +++ b/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/ui/internal/KeystoreResourceIntegrationTest.java @@ -3,14 +3,13 @@ package eu.europa.ec.edelivery.smp.ui.internal; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; import eu.europa.ec.edelivery.smp.data.ui.CertificateRO; import eu.europa.ec.edelivery.smp.data.ui.KeystoreImportResult; import eu.europa.ec.edelivery.smp.data.ui.UserRO; import eu.europa.ec.edelivery.smp.services.ui.UIKeystoreService; import eu.europa.ec.edelivery.smp.ui.AbstractControllerTest; -import org.junit.Before; -import org.junit.Test; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.mock.web.MockHttpSession; import org.springframework.test.web.servlet.MvcResult; @@ -23,10 +22,10 @@ import java.util.List; import static eu.europa.ec.edelivery.smp.test.testutils.MockMvcUtils.*; import static eu.europa.ec.edelivery.smp.ui.ResourceConstants.CONTEXT_PATH_INTERNAL_KEYSTORE; -import static org.junit.Assert.*; +import static org.junit.jupiter.api.Assertions.*; import static org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.csrf; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; public class KeystoreResourceIntegrationTest extends AbstractControllerTest { private static final String PATH = CONTEXT_PATH_INTERNAL_KEYSTORE; @@ -35,7 +34,7 @@ public class KeystoreResourceIntegrationTest extends AbstractControllerTest { @Autowired private UIKeystoreService uiKeystoreService; - @Before + @BeforeEach public void setup() throws IOException { super.setup(); uiKeystoreService.refreshData(); @@ -54,7 +53,8 @@ public class KeystoreResourceIntegrationTest extends AbstractControllerTest { //then ObjectMapper mapper = getObjectMapper(); - List<CertificateRO> listCerts = mapper.readValue(result.getResponse().getContentAsString(), new TypeReference<List<CertificateRO>>(){}); + List<CertificateRO> listCerts = mapper.readValue(result.getResponse().getContentAsString(), new TypeReference<List<CertificateRO>>() { + }); assertNotNull(listCerts); assertEquals(countStart, listCerts.size()); @@ -90,7 +90,7 @@ public class KeystoreResourceIntegrationTest extends AbstractControllerTest { public void uploadKeystoreInvalidPassword() throws Exception { // login MockHttpSession session = loginWithSystemAdmin(mvc); - UserRO userRO = (UserRO)session.getAttribute(MOCK_LOGGED_USER); + UserRO userRO = (UserRO) session.getAttribute(MOCK_LOGGED_USER); // given when MvcResult result = mvc.perform(post(PATH + "/" + userRO.getUserId() + "/upload/JKS/NewPassword1234") .session(session) diff --git a/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/ui/internal/TruststoreAdminControllerTest.java b/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/ui/internal/TruststoreAdminControllerTest.java index 29706842d..1864ede10 100644 --- a/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/ui/internal/TruststoreAdminControllerTest.java +++ b/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/ui/internal/TruststoreAdminControllerTest.java @@ -3,15 +3,14 @@ package eu.europa.ec.edelivery.smp.ui.internal; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; import eu.europa.ec.edelivery.smp.data.ui.CertificateRO; import eu.europa.ec.edelivery.smp.data.ui.UserRO; import eu.europa.ec.edelivery.smp.data.ui.enums.EntityROStatus; import eu.europa.ec.edelivery.smp.services.ui.UITruststoreService; import eu.europa.ec.edelivery.smp.test.testutils.X509CertificateTestUtils; import eu.europa.ec.edelivery.smp.ui.AbstractControllerTest; -import org.junit.Before; -import org.junit.Test; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.mock.web.MockHttpSession; import org.springframework.test.web.servlet.MvcResult; @@ -23,7 +22,7 @@ import java.util.UUID; import static eu.europa.ec.edelivery.smp.test.testutils.MockMvcUtils.*; import static eu.europa.ec.edelivery.smp.ui.ResourceConstants.CONTEXT_PATH_INTERNAL_TRUSTSTORE; -import static org.junit.Assert.*; +import static org.junit.jupiter.api.Assertions.*; import static org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.csrf; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; @@ -35,7 +34,7 @@ public class TruststoreAdminControllerTest extends AbstractControllerTest { @Autowired private UITruststoreService uiTruststoreService; - @Before + @BeforeEach public void setup() throws IOException { super.setup(); uiTruststoreService.refreshData(); @@ -54,7 +53,8 @@ public class TruststoreAdminControllerTest extends AbstractControllerTest { //then ObjectMapper mapper = getObjectMapper(); - List<CertificateRO> listCerts = mapper.readValue(result.getResponse().getContentAsString(), new TypeReference<List<CertificateRO>>() {}); + List<CertificateRO> listCerts = mapper.readValue(result.getResponse().getContentAsString(), new TypeReference<List<CertificateRO>>() { + }); assertNotNull(listCerts); assertEquals(countStart, listCerts.size()); @@ -134,7 +134,6 @@ public class TruststoreAdminControllerTest extends AbstractControllerTest { assertEquals(countStart, uiTruststoreService.getCertificateROEntriesList().size()); } - @Test public void testDeleteCertificateOK() throws Exception { diff --git a/smp-webapp/src/test/resources/webapp_integration_test_data.sql b/smp-webapp/src/test/resources/webapp_integration_test_data.sql index 850c4356b..31e818486 100644 --- a/smp-webapp/src/test/resources/webapp_integration_test_data.sql +++ b/smp-webapp/src/test/resources/webapp_integration_test_data.sql @@ -78,28 +78,6 @@ insert into SMP_CREDENTIAL (ID, FK_USER_ID, CREDENTIAL_ACTIVE, CREDENTIAL_NAME, insert into SMP_CERTIFICATE (ID, CERTIFICATE_ID, VALID_FROM, VALID_TO, CREATED_ON, LAST_UPDATED_ON) values (18, 'CN=utf-8_z_SMP,O=EC,C=BE:0000000000000666', null,null, NOW(), NOW()); - - --- insert into SMP_USER(ID, USERNAME, ROLE, ACTIVE, CREATED_ON, LAST_UPDATED_ON) values (8, 'Cert3', 'SMP_ADMIN', 1, NOW(), NOW()); --- insert into SMP_CERTIFICATE (ID, CERTIFICATE_ID, VALID_FROM, VALID_TO, CREATED_ON, LAST_UPDATED_ON) values (8, 'CN=utf-8_ż_SMP,O=EC,C=BE:0000000000000666', null,null, NOW(), NOW()); - --- insert into SMP_USER(ID, USERNAME, ROLE, ACTIVE, CREATED_ON, LAST_UPDATED_ON) values (9, 'Cert4', 'SMP_ADMIN', 1, NOW(), NOW()); --- insert into SMP_CERTIFICATE (ID, CERTIFICATE_ID, VALID_FROM, VALID_TO, CREATED_ON, LAST_UPDATED_ON) values (9, 'CN=EHEALTH_SMP_EC,O=European Commission,C=BE:f71ee8b11cb3b787', null,null, NOW(), NOW()); - --- insert into SMP_USER(ID, USERNAME, PASSWORD, ROLE, ACTIVE, CREATED_ON, LAST_UPDATED_ON) values (10, 'cert5', '', 'SMP_ADMIN', 1, NOW(), NOW()); --- insert into SMP_CERTIFICATE (ID, CERTIFICATE_ID, VALID_FROM, VALID_TO, CREATED_ON, LAST_UPDATED_ON) values (10, 'CN=common name UPPER database SN,O=org,C=BE:000000000000BB66', null,null, NOW(), NOW()); - --- insert into SMP_USER(ID, USERNAME, PASSWORD, ROLE, ACTIVE, CREATED_ON, LAST_UPDATED_ON) values (11, 'cert6', '', 'SMP_ADMIN', 1, NOW(), NOW()); --- insert into SMP_CERTIFICATE (ID, CERTIFICATE_ID, VALID_FROM, VALID_TO, CREATED_ON, LAST_UPDATED_ON) values (11, 'CN=ncp.fi.ehealth.testa.eu,O=Kansanelakelaitos,C=FI:f71ee8b11cb3b787', null,null, NOW(), NOW()); - --- insert into SMP_USER(ID, USERNAME, PASSWORD, ROLE, ACTIVE, CREATED_ON, LAST_UPDATED_ON) values (12, 'cert7', '', 'SMP_ADMIN', 1, NOW(), NOW()); --- insert into SMP_CERTIFICATE (ID, CERTIFICATE_ID, VALID_FROM, VALID_TO, CREATED_ON, LAST_UPDATED_ON) values (12, 'CN=Internal Business CA 2,O=T-Systems International GmbH,C=DE:f71ee8b11cb3b787', null,null, NOW(), NOW()); - --- insert into SMP_USER(ID, USERNAME, PASSWORD, ROLE, ACTIVE, CREATED_ON, LAST_UPDATED_ON) values (13, 'cert8', '', 'SMP_ADMIN', 1, NOW(), NOW()); --- insert into SMP_CERTIFICATE (ID, CERTIFICATE_ID, VALID_FROM, VALID_TO, CREATED_ON, LAST_UPDATED_ON) values (13, 'CN=GRP:test_proxy_01,O=European Commission,C=BE:0000000000001234', null,null, NOW(), NOW()); - --- insert into SMP_USER(ID, USERNAME, PASSWORD, ROLE, ACTIVE, CREATED_ON, LAST_UPDATED_ON) values (14, 'cert9', '', 'SMP_ADMIN', 1, NOW(), NOW()); --- insert into SMP_CERTIFICATE (ID, CERTIFICATE_ID, VALID_FROM, VALID_TO, CREATED_ON, LAST_UPDATED_ON) values (14, 'CN=GRP:TEST_\+\,& \=eau!,O=European Commission,C=BE:0000000000001234', null,null, NOW(), NOW()); -- -------------- -- Configure domains insert into SMP_DOMAIN (ID, VISIBILITY, DOMAIN_CODE, SML_SUBDOMAIN, SML_SMP_ID, SIGNATURE_KEY_ALIAS,SML_REGISTERED,SML_CLIENT_CERT_AUTH, CREATED_ON, LAST_UPDATED_ON) values @@ -107,7 +85,8 @@ insert into SMP_DOMAIN (ID, VISIBILITY, DOMAIN_CODE, SML_SUBDOMAIN, SML_SMP_ID, (2, 'PUBLIC', 'domainTwo','newdomain', 'CEF-SMP-002','single_domain_key',0,1,NOW(), NOW()); insert into SMP_GROUP (ID, FK_DOMAIN_ID, NAME, VISIBILITY, CREATED_ON, LAST_UPDATED_ON) values -(1, 1, 'domain group', 'PUBLIC', NOW(), NOW()); +(1, 1, 'domain group', 'PUBLIC', NOW(), NOW()), +(2, 1, 'Second group', 'PUBLIC', NOW(), NOW()); -- -------------- -- configure extension and document types service group and servicemetadata @@ -123,6 +102,7 @@ insert into SMP_SUBRESOURCE_DEF (ID,FK_RESOURCE_DEF_ID,URL_SEGMENT, IDENTIFIER, insert into SMP_DOMAIN_RESOURCE_DEF (ID, FK_RESOURCE_DEF_ID, FK_DOMAIN_ID,CREATED_ON, LAST_UPDATED_ON ) values (1, 1, 1, NOW(), NOW()); + -- ---------------------------------- -- add documents insert into SMP_DOCUMENT (ID, CURRENT_VERSION, MIME_TYPE, NAME,CREATED_ON, LAST_UPDATED_ON) values @@ -142,8 +122,12 @@ insert into SMP_RESOURCE ( ID, FK_GROUP_ID, FK_DOCUMENT_ID, FK_DOREDEF_ID, IDEN insert into SMP_SUBRESOURCE (ID, FK_RESOURCE_ID,FK_SUREDEF_ID, FK_DOCUMENT_ID, IDENTIFIER_SCHEME, IDENTIFIER_VALUE, CREATED_ON, LAST_UPDATED_ON) values (-1, -1, 1, -3, 'busdox-docid-qn', 'doc_7', NOW(), NOW()); +insert into SMP_DOMAIN_MEMBER (ID, FK_DOMAIN_ID, FK_USER_ID, MEMBERSHIP_ROLE, CREATED_ON, LAST_UPDATED_ON) values +(1, 1, 3, 'ADMIN', NOW(), NOW()); + insert into SMP_GROUP_MEMBER (ID, FK_GROUP_ID, FK_USER_ID, MEMBERSHIP_ROLE, CREATED_ON, LAST_UPDATED_ON) values -(1, 1, 1, 'ADMIN', NOW(), NOW()); +(1, 1, 1, 'ADMIN', NOW(), NOW()), +(2, 1, 3, 'ADMIN', NOW(), NOW()); -- set ownership insert into SMP_RESOURCE_MEMBER (ID, FK_RESOURCE_ID, FK_USER_ID, MEMBERSHIP_ROLE, CREATED_ON, LAST_UPDATED_ON) values (-1, -1, 1, 'ADMIN', NOW(), NOW()), -- GitLab