From 31586c802a2be0d24531b0ed090c8379ef14c464 Mon Sep 17 00:00:00 2001
From: RIHTARSIC Joze <joze.rihtarsic@ext.ec.europa.eu>
Date: Wed, 26 Jul 2023 16:59:40 +0200
Subject: [PATCH] add unit tests

---
 .../edelivery/smp/security/DomainGuard.java   |  24 +--
 .../resource/ResourceHandlerService.java      |   4 +-
 .../services/resource/ResourceService.java    |   1 +
 .../services/ui/UIDomainPublicService.java    |  34 ++--
 .../smp/security/DomainGuardTest.java         | 114 ++++++++++++
 .../resource/ResourceServiceTest.java         | 168 ++++++++++++++++++
 .../ui/UIDomainPublicServiceTest.java         |  95 ++++++++++
 .../ui/UIDomainServiceIntegrationTest.java    |  23 +--
 8 files changed, 419 insertions(+), 44 deletions(-)
 create mode 100644 smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/security/DomainGuardTest.java
 create mode 100644 smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/services/resource/ResourceServiceTest.java
 create mode 100644 smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/services/ui/UIDomainPublicServiceTest.java

diff --git a/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/security/DomainGuard.java b/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/security/DomainGuard.java
index 08eff34c9..2e903b54c 100644
--- a/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/security/DomainGuard.java
+++ b/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/security/DomainGuard.java
@@ -58,13 +58,16 @@ public class DomainGuard {
      * Purpose of the method is to guard domain resources. It validates if users has any "rights to" execute the action
      * on the domain resources and subresources
      *
-     * @param user
-     * @param action
-     * @param domain
-     * @return
+     * @param user  user to be authorized
+     * @param action action to be executed
+     * @param domain domain to be authorized
+     * @return true if user is authorized to execute the action on the domain
      */
     public boolean isUserIsAuthorizedForDomainResourceAction(DBDomain domain, SMPUserDetails user, ResourceAction action) {
         LOG.debug("Authorize check for user [{}], domain [{}] and action [{}]", user, domain, action);
+        if (action == null) {
+            throw new SMPRuntimeException(ErrorCode.INVALID_REQUEST, "Null http action", "Action cannot be null!");
+        }
         switch (action) {
             case READ:
                 return canRead(user, domain);
@@ -109,10 +112,9 @@ public class DomainGuard {
      * Method validates of the user can delete resources on the domain! Only users with group admin role can delete
      * domain resources
      *
-     *
-     * @param user
-     * @param domain
-     * @return
+     * @param user    user to be authorized
+     * @param domain domain to be authorized
+     * @return true if user is authorized to execute the action on the domain
      */
     public boolean canDelete(SMPUserDetails user, DBDomain domain) {
         LOG.info(SMPLogger.SECURITY_MARKER, "User: [{}] is trying to delete resource from domain: [{}]", user, domain);
@@ -131,9 +133,9 @@ public class DomainGuard {
      * Method validates of the user can create/update resources on the domain! Only users with group admin role can create and users with admin resource role
      * can update
      *
-     * @param user
-     * @param domain
-     * @return
+     * @param user   user to be authorized
+     * @param domain domain to be authorized
+     * @return  true if user is authorized to execute the action on the domain
      */
     public boolean canCreateUpdate(SMPUserDetails user, DBDomain domain) {
         LOG.info(SMPLogger.SECURITY_MARKER, "User: [{}] is trying to create/update resource from domain: [{}]", user, domain);
diff --git a/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/services/resource/ResourceHandlerService.java b/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/services/resource/ResourceHandlerService.java
index 37147ec79..88b802f49 100644
--- a/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/services/resource/ResourceHandlerService.java
+++ b/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/services/resource/ResourceHandlerService.java
@@ -134,7 +134,7 @@ public class ResourceHandlerService extends AbstractResourceHandler {
             }
         }
         // set headers to response
-        responseData.getHttpHeaders().entrySet().stream()
+        responseData.getHttpHeaders().entrySet()
                 .forEach(entry -> resourceResponse.setHttpHeader(entry.getKey(), entry.getValue()));
         // determinate status before resource is stored to database!
         resourceResponse.setHttpStatus(getHttpStatusForCreateUpdate(isNewResource, responseData));
@@ -232,7 +232,7 @@ public class ResourceHandlerService extends AbstractResourceHandler {
         // locate the resource handler
         ResolvedData resolvedData = resourceRequest.getResolvedData();
         DBResource resource = resolvedData.getResource();
-        integrationService.unregisterParticipant(resource, resolvedData.domain);
+        integrationService.unregisterParticipant(resource, resolvedData.getDomain());
         resourceStorage.deleteResource(resource);
     }
 
diff --git a/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/services/resource/ResourceService.java b/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/services/resource/ResourceService.java
index 9a01a2a4d..6e1f671db 100644
--- a/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/services/resource/ResourceService.java
+++ b/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/services/resource/ResourceService.java
@@ -23,6 +23,7 @@ import static eu.europa.ec.edelivery.smp.exceptions.ErrorCode.INVALID_OWNER;
 import static org.apache.commons.lang3.StringUtils.isNotBlank;
 
 /**
+ *
  * @author Joze Rihtarsic
  * @since 5.0
  */
diff --git a/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/services/ui/UIDomainPublicService.java b/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/services/ui/UIDomainPublicService.java
index ad78a9ac6..2141a2025 100644
--- a/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/services/ui/UIDomainPublicService.java
+++ b/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/services/ui/UIDomainPublicService.java
@@ -41,7 +41,7 @@ public class UIDomainPublicService extends UIServiceBase<DBDomain, DomainPublicR
     private final ConversionService conversionService;
 
 
-    public UIDomainPublicService(DomainDao domainDao, DomainMemberDao domainMemberDao,ConversionService conversionService, UserDao userDao) {
+    public UIDomainPublicService(DomainDao domainDao, DomainMemberDao domainMemberDao, ConversionService conversionService, UserDao userDao) {
         this.domainDao = domainDao;
         this.domainMemberDao = domainMemberDao;
         this.conversionService = conversionService;
@@ -56,12 +56,12 @@ public class UIDomainPublicService extends UIServiceBase<DBDomain, DomainPublicR
     /**
      * Method returns Domain resource object list for page.
      *
-     * @param page
-     * @param pageSize
-     * @param sortField
-     * @param sortOrder
-     * @param filter
-     * @return
+     * @param page     - page number
+     * @param pageSize - page size
+     * @param sortField - sort field
+     * @param sortOrder - sort order
+     * @param filter  - filter
+     * @return ServiceResult<DomainPublicRO> - list of domain resource objects
      */
     @Override
     public ServiceResult<DomainPublicRO> getTableList(int page, int pageSize,
@@ -94,18 +94,18 @@ public class UIDomainPublicService extends UIServiceBase<DBDomain, DomainPublicR
 
     @Transactional
     public ServiceResult<MemberRO> getDomainMembers(Long domainId, int page, int pageSize,
-                                                   String filter) {
+                                                    String filter) {
         Long count = domainMemberDao.getDomainMemberCount(domainId, filter);
-        ServiceResult<MemberRO> result =  new ServiceResult<>();
+        ServiceResult<MemberRO> result = new ServiceResult<>();
         result.setPage(page);
         result.setPageSize(pageSize);
-        if (count<1) {
+        if (count < 1) {
             result.setCount(0L);
             return result;
         }
         result.setCount(count);
         List<DBDomainMember> memberROS = domainMemberDao.getDomainMembers(domainId, page, pageSize, filter);
-        List<MemberRO> memberList = memberROS.stream().map(member-> conversionService.convert(member, MemberRO.class)).collect(Collectors.toList());
+        List<MemberRO> memberList = memberROS.stream().map(member -> conversionService.convert(member, MemberRO.class)).collect(Collectors.toList());
 
         result.getServiceEntities().addAll(memberList);
         return result;
@@ -115,18 +115,18 @@ public class UIDomainPublicService extends UIServiceBase<DBDomain, DomainPublicR
     public MemberRO addMemberToDomain(Long domainId, MemberRO memberRO, Long memberId) {
         LOG.info("Add member [{}] to domain [{}]", memberRO.getUsername(), domainId);
         DBUser user = userDao.findUserByUsername(memberRO.getUsername())
-                .orElseThrow(() -> new SMPRuntimeException(ErrorCode.INVALID_REQUEST, "Add/edit membership", "User ["+memberRO.getUsername()+"] does not exists!"));
+                .orElseThrow(() -> new SMPRuntimeException(ErrorCode.INVALID_REQUEST, "Add/edit membership", "User [" + memberRO.getUsername() + "] does not exists!"));
 
         DBDomainMember domainMember;
-        if (memberId !=null) {
+        if (memberId != null) {
             domainMember = domainMemberDao.find(memberId);
             domainMember.setRole(memberRO.getRoleType());
         } else {
             DBDomain domain = domainDao.find(domainId);
             if (domainMemberDao.isUserDomainMember(user, domain)) {
-                throw new SMPRuntimeException(ErrorCode.INVALID_REQUEST, "Add membership", "User ["+memberRO.getUsername()+"] is already a member!");
+                throw new SMPRuntimeException(ErrorCode.INVALID_REQUEST, "Add membership", "User [" + memberRO.getUsername() + "] is already a member!");
             }
-            domainMember = domainMemberDao.addMemberToDomain(domain, user,memberRO.getRoleType() );
+            domainMember = domainMemberDao.addMemberToDomain(domain, user, memberRO.getRoleType());
         }
         return conversionService.convert(domainMember, MemberRO.class);
     }
@@ -138,7 +138,7 @@ public class UIDomainPublicService extends UIServiceBase<DBDomain, DomainPublicR
         if (domainMember == null) {
             throw new SMPRuntimeException(ErrorCode.INVALID_REQUEST, "Membership", "Membership does not exists!");
         }
-        if (!Objects.equals(domainMember.getDomain().getId(),domainId  )){
+        if (!Objects.equals(domainMember.getDomain().getId(), domainId)) {
             throw new SMPRuntimeException(ErrorCode.INVALID_REQUEST, "Membership", "Membership does not belong to domain!");
         }
 
@@ -156,7 +156,7 @@ public class UIDomainPublicService extends UIServiceBase<DBDomain, DomainPublicR
 
         //filter and validate resources to be removed
         List<DBDomainResourceDef> domainResourceDefs = domain.getDomainResourceDefs();
-        return domainResourceDefs.stream().map(domRef -> domRef.getResourceDef()).map(resourceDef ->
+        return domainResourceDefs.stream().map(DBDomainResourceDef::getResourceDef).map(resourceDef ->
                 conversionService.convert(resourceDef, ResourceDefinitionRO.class)).collect(Collectors.toList());
     }
 }
diff --git a/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/security/DomainGuardTest.java b/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/security/DomainGuardTest.java
new file mode 100644
index 000000000..13ea2e83c
--- /dev/null
+++ b/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/security/DomainGuardTest.java
@@ -0,0 +1,114 @@
+package eu.europa.ec.edelivery.smp.security;
+
+import eu.europa.ec.edelivery.smp.auth.SMPUserDetails;
+import eu.europa.ec.edelivery.smp.data.dao.AbstractJunit5BaseDao;
+import eu.europa.ec.edelivery.smp.data.model.DBDomain;
+import eu.europa.ec.edelivery.smp.exceptions.SMPRuntimeException;
+import eu.europa.ec.edelivery.smp.servlet.ResourceAction;
+import eu.europa.ec.edelivery.smp.servlet.ResourceRequest;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.mockito.Mockito;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.authentication.AuthenticationServiceException;
+
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.containsString;
+import static org.junit.jupiter.api.Assertions.*;
+import static org.mockito.Mockito.when;
+
+class DomainGuardTest extends AbstractJunit5BaseDao {
+
+    @Autowired
+    DomainGuard testInstance;
+
+    ResourceRequest resourceRequest = Mockito.mock(ResourceRequest.class);
+    SMPUserDetails user = Mockito.mock(SMPUserDetails.class);
+
+    @BeforeEach
+    public void prepareDatabase() {
+        testUtilsDao.clearData();
+        testUtilsDao.creatDomainMemberships();
+        testUtilsDao.createGroupMemberships();
+        testUtilsDao.createResourceMemberships();
+    }
+
+    @Test
+    void testResolveAndAuthorizeForDomainInvalidRequestMissingAction() {
+
+        SMPRuntimeException result = assertThrows(SMPRuntimeException.class,
+                () -> testInstance.resolveAndAuthorizeForDomain(resourceRequest, user));
+
+        assertThat(result.getMessage(), containsString("Invalid request"));
+    }
+
+    @Test
+    void testResolveAndAuthorizeForDomainDeleteInvalidRequestNotUser() {
+        when(resourceRequest.getAction()).thenReturn(ResourceAction.DELETE);
+        AuthenticationServiceException result = assertThrows(AuthenticationServiceException.class,
+                () -> testInstance.resolveAndAuthorizeForDomain(resourceRequest, user));
+
+        assertThat(result.getMessage(), containsString("User is not authorized for the domain!"));
+    }
+
+    @Test
+    void testResolveAndAuthorizeForDomainDeleteInvalidRequestUserNotAuthorized() {
+        when(user.getUser()).thenReturn(testUtilsDao.getUser3());
+        when(resourceRequest.getAction()).thenReturn(ResourceAction.DELETE);
+        AuthenticationServiceException result = assertThrows(AuthenticationServiceException.class,
+                () -> testInstance.resolveAndAuthorizeForDomain(resourceRequest, user));
+
+        assertThat(result.getMessage(), containsString("User is not authorized for the domain!"));
+    }
+
+    @Test
+    void testResolveAndAuthorizeForDomainCreateInvalidRequestUserNotAuthorized() {
+        when(user.getUser()).thenReturn(testUtilsDao.getUser3());
+        when(resourceRequest.getAction()).thenReturn(ResourceAction.CREATE_UPDATE);
+        AuthenticationServiceException result = assertThrows(AuthenticationServiceException.class,
+                () -> testInstance.resolveAndAuthorizeForDomain(resourceRequest, user));
+
+        assertThat(result.getMessage(), containsString("User is not authorized for the domain!"));
+    }
+
+    @Test
+    void testResolveAndAuthorizeForDomainDeleteUserAuthorized() {
+        when(user.getUser()).thenReturn(testUtilsDao.getUser1());
+        when(resourceRequest.getAction()).thenReturn(ResourceAction.DELETE);
+        DBDomain domain = testInstance.resolveAndAuthorizeForDomain(resourceRequest, user);
+        assertNotNull(domain);
+    }
+
+    @Test
+    void testResolveAndAuthorizeForDomainDeleteCreateAuthorized() {
+        when(user.getUser()).thenReturn(testUtilsDao.getUser1());
+        when(resourceRequest.getAction()).thenReturn(ResourceAction.CREATE_UPDATE);
+        DBDomain domain = testInstance.resolveAndAuthorizeForDomain(resourceRequest, user);
+        assertNotNull(domain);
+    }
+
+    @Test
+    void testResolveAndAuthorizeForDomainCreateInvalidRequestNotUser() {
+        when(resourceRequest.getAction()).thenReturn(ResourceAction.CREATE_UPDATE);
+        AuthenticationServiceException result = assertThrows(AuthenticationServiceException.class,
+                () -> testInstance.resolveAndAuthorizeForDomain(resourceRequest, user));
+
+        assertThat(result.getMessage(), containsString("User is not authorized for the domain!"));
+    }
+
+    @Test
+    void testResolveAndAuthorizeForDomainNoUserOK() {
+        when(resourceRequest.getAction()).thenReturn(ResourceAction.READ);
+        DBDomain domain = testInstance.resolveAndAuthorizeForDomain(resourceRequest, user);
+        assertNotNull(domain);
+    }
+
+    @Test
+    void testResolveAndAuthorizeForDomain() {
+        when(user.getUser()).thenReturn(testUtilsDao.getUser1());
+        when(resourceRequest.getAction()).thenReturn(ResourceAction.READ);
+        DBDomain domain = testInstance.resolveAndAuthorizeForDomain(resourceRequest, user);
+        assertNotNull(domain);
+    }
+
+}
diff --git a/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/services/resource/ResourceServiceTest.java b/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/services/resource/ResourceServiceTest.java
new file mode 100644
index 000000000..cdb8ae53c
--- /dev/null
+++ b/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/services/resource/ResourceServiceTest.java
@@ -0,0 +1,168 @@
+package eu.europa.ec.edelivery.smp.services.resource;
+
+import eu.europa.ec.edelivery.smp.auth.SMPUserDetails;
+import eu.europa.ec.edelivery.smp.data.dao.AbstractJunit5BaseDao;
+import eu.europa.ec.edelivery.smp.data.model.user.DBUser;
+import eu.europa.ec.edelivery.smp.exceptions.MalformedIdentifierException;
+import eu.europa.ec.edelivery.smp.exceptions.SMPRuntimeException;
+import eu.europa.ec.edelivery.smp.servlet.ResourceAction;
+import eu.europa.ec.edelivery.smp.servlet.ResourceRequest;
+import eu.europa.ec.edelivery.smp.servlet.ResourceResponse;
+import eu.europa.ec.edelivery.smp.testutil.TestConstants;
+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.mockito.Mockito;
+import org.springframework.beans.factory.annotation.Autowired;
+
+import java.util.Arrays;
+
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.containsString;
+import static org.junit.jupiter.api.Assertions.*;
+import static org.mockito.Mockito.when;
+
+class ResourceServiceTest extends AbstractJunit5BaseDao {
+    @Autowired
+    ResourceService testInstance;
+
+    ResourceRequest resourceRequest = Mockito.mock(ResourceRequest.class);
+    ResolvedData resolvedData = Mockito.mock(ResolvedData.class);
+    ResourceResponse resourceResponse = Mockito.mock(ResourceResponse.class);
+    SMPUserDetails user = Mockito.mock(SMPUserDetails.class);
+
+
+    @BeforeEach
+    public void prepareDatabase() {
+        testUtilsDao.clearData();
+        testUtilsDao.creatDomainMemberships();
+        testUtilsDao.createGroupMemberships();
+        testUtilsDao.createResourceMemberships();
+    }
+
+    @Test
+    void handleRequestFail() {
+        SMPRuntimeException result = assertThrows(SMPRuntimeException.class,
+                () -> testInstance.handleRequest(user, resourceRequest, resourceResponse));
+
+        assertThat(result.getMessage(), containsString("Invalid request"));
+    }
+
+    @ParameterizedTest
+    @CsvSource({
+            ", 'Location vector coordinates must not be null!'",
+            "1/2/3/4/5/6/7, 'More than max. count (5) of Resource Location vector coordinates!'",
+            TestConstants.TEST_DOMAIN_CODE_1 + ", 'Not enough path parameters to locate resource'",
+            TestConstants.TEST_DOMAIN_CODE_1 + "/" + TestConstants.TEST_RESOURCE_DEF_CPP + ", 'Not enough path parameters to locate resource'",
+            "badIdentifier, 'Malformed identifier, scheme and id should be delimited by double colon: badidentifier'",
+            "doc-type/badIdentifier, 'Malformed identifier, scheme and id should be delimited by double colon: doc-type'",
+            "domain/doc-type/badIdentifier, 'Malformed identifier, scheme and id should be delimited by double colon: domain'",
+    })
+    void handleRequestFailBadPath(String path, String errorMessage) {
+        when(resourceRequest.getUrlPathParameters()).thenReturn(path == null ? null : Arrays.asList(path.split("/")));
+        when(resourceRequest.getAuthorizedDomain()).thenReturn(testUtilsDao.getD1());
+
+        SMPRuntimeException result = assertThrows(SMPRuntimeException.class,
+                () -> testInstance.handleRequest(user, resourceRequest, resourceResponse));
+
+        assertThat(result.getMessage(), containsString(errorMessage));
+    }
+
+    @ParameterizedTest
+    @CsvSource({
+            "'', 'Can not parse empty identifier value!'"
+    }
+    )
+    void handleRequestFailBadIdentifier(String path, String errorMessage) {
+        when(resourceRequest.getUrlPathParameters()).thenReturn(path == null ? null : Arrays.asList(path.split("/")));
+        when(resourceRequest.getAuthorizedDomain()).thenReturn(testUtilsDao.getD1());
+
+        MalformedIdentifierException result = assertThrows(MalformedIdentifierException.class,
+                () -> testInstance.handleRequest(user, resourceRequest, resourceResponse));
+
+        assertThat(result.getMessage(), containsString(errorMessage));
+    }
+
+    @Test
+    void handleRequestReadOK() {
+        when(resourceRequest.getUrlPathParameters()).thenReturn(Arrays.asList(TestConstants.TEST_DOMAIN_CODE_1, TestConstants.TEST_SG_SCHEMA_1 + "::" + TestConstants.TEST_SG_ID_1));
+        when(resourceRequest.getAuthorizedDomain()).thenReturn(testUtilsDao.getD1());
+        when(resourceRequest.getAction()).thenReturn(ResourceAction.READ);
+        when(resourceRequest.getResolvedData()).thenReturn(resolvedData);
+        when(resolvedData.getResourceDef()).thenReturn(testUtilsDao.getResourceDefSmp());
+        when(resolvedData.getResource()).thenReturn(testUtilsDao.getResourceD1G1RD1());
+        when(resolvedData.getDomain()).thenReturn(testUtilsDao.getD1());
+        testInstance.handleRequest(user, resourceRequest, resourceResponse);
+    }
+
+    @Test
+    void handleRequestCreateOK() {
+        when(user.getUser()).thenReturn(testUtilsDao.getUser1());
+        when(resourceRequest.getUrlPathParameters()).thenReturn(Arrays.asList(TestConstants.TEST_DOMAIN_CODE_1, TestConstants.TEST_SG_SCHEMA_1 + "::0007:001:utest"));
+        when(resourceRequest.getAuthorizedDomain()).thenReturn(testUtilsDao.getD1());
+        when(resourceRequest.getAction()).thenReturn(ResourceAction.CREATE_UPDATE);
+        when(resourceRequest.getResolvedData()).thenReturn(resolvedData);
+        when(resolvedData.getResourceDef()).thenReturn(testUtilsDao.getResourceDefSmp());
+        when(resolvedData.getResource()).thenReturn(testUtilsDao.getResourceD1G1RD1());
+        when(resolvedData.getDomain()).thenReturn(testUtilsDao.getD1());
+        when(resourceRequest.getInputStream()).thenReturn(ResourceResolverServiceTest.class.getResourceAsStream("/examples/oasis-smp-1.0/ServiceGroupOK.xml"));
+        testInstance.handleRequest(user, resourceRequest, resourceResponse);
+    }
+
+    @Test
+    void handleRequestDeleteOK() {
+        when(user.getUser()).thenReturn(testUtilsDao.getUser1());
+        when(resourceRequest.getUrlPathParameters()).thenReturn(Arrays.asList(TestConstants.TEST_DOMAIN_CODE_1, TestConstants.TEST_SG_SCHEMA_1 + "::" + TestConstants.TEST_SG_ID_1));
+        when(resourceRequest.getAuthorizedDomain()).thenReturn(testUtilsDao.getD1());
+        when(resourceRequest.getAction()).thenReturn(ResourceAction.DELETE);
+        when(resourceRequest.getResolvedData()).thenReturn(resolvedData);
+        when(resolvedData.getResourceDef()).thenReturn(testUtilsDao.getResourceDefSmp());
+        when(resolvedData.getResource()).thenReturn(testUtilsDao.getResourceD1G1RD1());
+        when(resolvedData.getDomain()).thenReturn(testUtilsDao.getD1());
+
+        testInstance.handleRequest(user, resourceRequest, resourceResponse);
+    }
+
+    @Test
+    void handleRequestCreateNotAuthorized() {
+
+        when(resourceRequest.getUrlPathParameters()).thenReturn(Arrays.asList(TestConstants.TEST_DOMAIN_CODE_1, TestConstants.TEST_SG_SCHEMA_1 + "::0007:001:utest"));
+        when(resourceRequest.getAuthorizedDomain()).thenReturn(testUtilsDao.getD1());
+        when(resourceRequest.getAction()).thenReturn(ResourceAction.CREATE_UPDATE);
+        when(resourceRequest.getResolvedData()).thenReturn(resolvedData);
+        when(resolvedData.getResourceDef()).thenReturn(testUtilsDao.getResourceDefSmp());
+        when(resolvedData.getResource()).thenReturn(testUtilsDao.getResourceD1G1RD1());
+        when(resolvedData.getDomain()).thenReturn(testUtilsDao.getD1());
+        when(resourceRequest.getInputStream()).thenReturn(ResourceResolverServiceTest.class.getResourceAsStream("/examples/oasis-smp-1.0/ServiceGroupOK.xml"));
+        SMPRuntimeException result = assertThrows(SMPRuntimeException.class,
+                () -> testInstance.handleRequest(user, resourceRequest, resourceResponse));
+
+        assertThat(result.getMessage(), containsString("User not authorized"));
+    }
+
+
+    @Test
+    void testFindOwnerOK() {
+        DBUser user = testInstance.findOwner(testUtilsDao.getUser1().getUsername());
+        assertNotNull(user);
+        assertEquals(testUtilsDao.getUser1().getUsername(), user.getUsername());
+    }
+
+    @Test
+    void testFindOwnerNotExists() {
+        SMPRuntimeException result = assertThrows(SMPRuntimeException.class, () -> testInstance.findOwner("CN=User not exists,OU=Test Users,O=Test Domain,C=BE:1234567890"));
+        assertThat(result.getMessage(), containsString("Invalid owner id"));
+    }
+
+
+    @Test
+    void testSplitSerialFromSubject() {
+        String[] values =
+                ResourceService.splitSerialFromSubject("CN=Test User 1,OU=Test Users,O=Test Domain,C=BE:1234567890");
+        assertEquals(2, values.length);
+        assertEquals("CN=Test User 1,OU=Test Users,O=Test Domain,C=BE", values[0]);
+        assertEquals("1234567890", values[1]);
+    }
+
+}
diff --git a/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/services/ui/UIDomainPublicServiceTest.java b/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/services/ui/UIDomainPublicServiceTest.java
new file mode 100644
index 000000000..c07852542
--- /dev/null
+++ b/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/services/ui/UIDomainPublicServiceTest.java
@@ -0,0 +1,95 @@
+package eu.europa.ec.edelivery.smp.services.ui;
+
+import eu.europa.ec.edelivery.smp.data.dao.AbstractJunit5BaseDao;
+import eu.europa.ec.edelivery.smp.data.ui.*;
+import eu.europa.ec.edelivery.smp.exceptions.BadRequestException;
+import org.hamcrest.MatcherAssert;
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.test.context.ContextConfiguration;
+
+import java.util.List;
+
+import static org.junit.jupiter.api.Assertions.*;
+
+@ContextConfiguration(classes = UIDomainPublicService.class)
+class UIDomainPublicServiceTest   extends AbstractJunit5BaseDao {
+
+    @Autowired
+    UIDomainPublicService testInstance;
+
+    @BeforeEach
+    public void prepareDatabase() {
+        testUtilsDao.clearData();
+        testUtilsDao.creatDomainMemberships();
+        testUtilsDao.createGroupMemberships();
+        testUtilsDao.createResourceMemberships();
+
+    }
+
+    @Test
+    public void testGetTableList() {
+        ServiceResult<DomainPublicRO>  result = testInstance.getTableList(-1, -1, null, null, null);
+        assertEquals(2, result.getCount().intValue());
+    }
+
+    @Test
+    public void testGetAllDomainsForDomainAdminUser() {
+        List<DomainRO> result = testInstance.getAllDomainsForDomainAdminUser(testUtilsDao.getUser1().getId());
+        assertEquals(1, result.size());
+    }
+
+    @Test
+    public void testGetAllDomainsForDomainAdminUser3() {
+        List<DomainRO> result = testInstance.getAllDomainsForDomainAdminUser(testUtilsDao.getUser3().getId());
+        assertEquals(0, result.size());
+    }
+
+    @Test
+    public void testGetAllDomainsForGroupAdminUser() {
+        List<DomainRO> result = testInstance.getAllDomainsForGroupAdminUser(testUtilsDao.getUser1().getId());
+        assertEquals(1, result.size());
+    }
+
+    @Test
+    public void testGetAllDomainsForGroupAdminUser3() {
+        List<DomainRO> result = testInstance.getAllDomainsForGroupAdminUser(testUtilsDao.getUser3().getId());
+        assertEquals(0, result.size());
+    }
+
+    @Test
+    public void testGetAllDomainsForResourceAdminUser() {
+        List<DomainRO> result = testInstance.getAllDomainsForResourceAdminUser(testUtilsDao.getUser1().getId());
+        assertEquals(1, result.size());
+    }
+
+    @Test
+    public void testGetAllDomainsForResourceAdminUser3() {
+        List<DomainRO> result = testInstance.getAllDomainsForResourceAdminUser(testUtilsDao.getUser3().getId());
+        assertEquals(0, result.size());
+    }
+
+    @Test
+    public void testGetDomainMembers() {
+        ServiceResult<MemberRO>  result = testInstance.getDomainMembers(testUtilsDao.getD1().getId(), -1, -1, null);
+        assertEquals(1, result.getCount().intValue());
+        assertEquals(1, result.getServiceEntities().size());
+    }
+
+    @Test
+    public void testGetResourceDefDomainList() {
+        List<ResourceDefinitionRO>  result = testInstance.getResourceDefDomainList(testUtilsDao.getD1().getId());
+        assertEquals(2, result.size());
+    }
+
+    @Test
+    public void testGetResourceDefDomainListFal() {
+        BadRequestException result = assertThrows(BadRequestException.class, () ->
+            testInstance.getResourceDefDomainList(-100L));
+
+        MatcherAssert.assertThat(result.getMessage(), org.hamcrest.Matchers.containsString("Domain does not exist in database"));
+
+    }
+}
diff --git a/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/services/ui/UIDomainServiceIntegrationTest.java b/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/services/ui/UIDomainServiceIntegrationTest.java
index 807bcdc1e..548ba4128 100644
--- a/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/services/ui/UIDomainServiceIntegrationTest.java
+++ b/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/services/ui/UIDomainServiceIntegrationTest.java
@@ -2,13 +2,10 @@ package eu.europa.ec.edelivery.smp.services.ui;
 
 
 import eu.europa.ec.edelivery.smp.data.model.DBDomain;
-import eu.europa.ec.edelivery.smp.data.model.doc.DBResource;
-import eu.europa.ec.edelivery.smp.data.ui.DeleteEntityValidation;
 import eu.europa.ec.edelivery.smp.data.ui.DomainRO;
 import eu.europa.ec.edelivery.smp.data.ui.ServiceResult;
 import eu.europa.ec.edelivery.smp.services.AbstractServiceIntegrationTest;
 import eu.europa.ec.edelivery.smp.testutil.TestDBUtils;
-import org.junit.Ignore;
 import org.junit.Rule;
 import org.junit.Test;
 import org.junit.rules.ExpectedException;
@@ -19,30 +16,28 @@ import static org.junit.Assert.*;
 
 
 /**
- *  Purpose of class is to test UIDomainService base methods
+ * Purpose of class is to test UIDomainService base methods
  *
  * @author Joze Rihtarsic
  * @since 4.1
  */
-@ContextConfiguration(classes= UIDomainService.class)
+@ContextConfiguration(classes = UIDomainService.class)
 public class UIDomainServiceIntegrationTest extends AbstractServiceIntegrationTest {
-    @Rule
-    public ExpectedException expectedExeption = ExpectedException.none();
 
     @Autowired
     protected UIDomainService testInstance;
 
-    protected void insertDataObjects(int size){
-        for (int i=0; i < size; i++){
-            DBDomain d = TestDBUtils.createDBDomain("domain"+i);
+    protected void insertDataObjects(int size) {
+        for (int i = 0; i < size; i++) {
+            DBDomain d = TestDBUtils.createDBDomain("domain" + i);
             domainDao.persistFlushDetach(d);
         }
     }
 
     @Test
-    public void testGetTableListEmpty(){
+    public void testGetTableListEmpty() {
         // given when
-        ServiceResult<DomainRO> res = testInstance.getTableList(-1,-1,null, null, null);
+        ServiceResult<DomainRO> res = testInstance.getTableList(-1, -1, null, null, null);
         // then
         assertNotNull(res);
         assertEquals(0, res.getCount().intValue());
@@ -53,12 +48,12 @@ public class UIDomainServiceIntegrationTest extends AbstractServiceIntegrationTe
     }
 
     @Test
-    public void testGetTableList15(){
+    public void testGetTableList15() {
 
         // given
         insertDataObjects(15);
         //when
-        ServiceResult<DomainRO> res = testInstance.getTableList(-1,-1,null, null,null);
+        ServiceResult<DomainRO> res = testInstance.getTableList(-1, -1, null, null, null);
 
 
         // then
-- 
GitLab