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