From c70d4487b4886dad49543b7e315e258e0ddcb6fa Mon Sep 17 00:00:00 2001 From: RIHTARSIC Joze <joze.rihtarsic@ext.ec.europa.eu> Date: Mon, 31 Jul 2023 14:02:56 +0200 Subject: [PATCH] add unit tests --- .../smp/data/ui/ServiceGroupDomainRO.java | 60 ---- .../edelivery/smp/data/ui/ServiceGroupRO.java | 90 ------ .../smp/data/ui/ServiceGroupValidationRO.java | 74 ----- .../data/ui/ServiceMetadataValidationRO.java | 77 ----- .../edelivery/smp/security/ResourceGuard.java | 36 +-- .../services/ui/UIResourceSearchService.java | 1 - .../smp/data/dao/AbstractJunit5BaseDao.java | 15 +- .../edelivery/smp/data/dao/TestUtilsDao.java | 9 + .../smp/security/DomainGuardTest.java | 53 +++- .../smp/security/ResourceGuardTest.java | 104 +++++++ .../smp/services/CredentialServiceTest.java | 71 ++++- .../smp/services/DomainServiceSMLTest.java | 290 ------------------ .../smp/services/DomainServiceTest.java | 200 ++++++++++++ .../ui/UIResourceSearchServiceTest.java | 17 +- .../services/ui/UIResourceServiceTest.java | 97 +++++- .../ui/UIUserServiceIntegrationTest.java | 48 +++ 16 files changed, 578 insertions(+), 664 deletions(-) delete mode 100644 smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/data/ui/ServiceGroupDomainRO.java delete mode 100644 smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/data/ui/ServiceGroupRO.java delete mode 100644 smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/data/ui/ServiceGroupValidationRO.java delete mode 100644 smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/data/ui/ServiceMetadataValidationRO.java create mode 100644 smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/security/ResourceGuardTest.java delete mode 100644 smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/services/DomainServiceSMLTest.java create mode 100644 smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/services/DomainServiceTest.java diff --git a/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/data/ui/ServiceGroupDomainRO.java b/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/data/ui/ServiceGroupDomainRO.java deleted file mode 100644 index 69e12d89e..000000000 --- a/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/data/ui/ServiceGroupDomainRO.java +++ /dev/null @@ -1,60 +0,0 @@ -package eu.europa.ec.edelivery.smp.data.ui; - - -/** - * @author Joze Rihtarsic - * @since 4.1 - */ - - -public class ServiceGroupDomainRO extends BaseRO { - - - private static final long serialVersionUID = 9008583888835630014L; - private Long id; - private Long domainId; - String domainCode; - String smlSubdomain; - boolean smlRegistered; - - - public Long getId() { - return id; - } - - public void setId(Long id) { - this.id = id; - } - - public Long getDomainId() { - return domainId; - } - - public void setDomainId(Long domainId) { - this.domainId = domainId; - } - - public String getDomainCode() { - return domainCode; - } - - public void setDomainCode(String domainCode) { - this.domainCode = domainCode; - } - - public String getSmlSubdomain() { - return smlSubdomain; - } - - public void setSmlSubdomain(String smlSubdomain) { - this.smlSubdomain = smlSubdomain; - } - - public boolean isSmlRegistered() { - return smlRegistered; - } - - public void setSmlRegistered(boolean registered) { - this.smlRegistered = registered; - } -} diff --git a/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/data/ui/ServiceGroupRO.java b/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/data/ui/ServiceGroupRO.java deleted file mode 100644 index c01e68384..000000000 --- a/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/data/ui/ServiceGroupRO.java +++ /dev/null @@ -1,90 +0,0 @@ -package eu.europa.ec.edelivery.smp.data.ui; - - -import eu.europa.ec.edelivery.smp.data.ui.enums.EntityROStatus; - -import java.util.ArrayList; -import java.util.List; - -/** - * @author Joze Rihtarsic - * @since 4.1 - */ - - -public class ServiceGroupRO extends BaseRO { - - - private static final long serialVersionUID = 9008583888835630015L; - private Long id; - private String participantIdentifier; - private String participantScheme; - private boolean smlRegistered = false; - private List<UserRO> lstUser = new ArrayList<>(); - private List<ServiceGroupDomainRO> serviceGroupDomains = new ArrayList<>(); - // for UI service groups are in one list. - private List<ServiceMetadataRO> serviceMetadata = new ArrayList<>(); - private int extensionStatus = EntityROStatus.PERSISTED.getStatusNumber(); - private String extension; - - - public Long getId() { - return id; - } - - public void setId(Long id) { - this.id = id; - } - - public String getParticipantIdentifier() { - return participantIdentifier; - } - - public void setParticipantIdentifier(String participantIdentifier) { - this.participantIdentifier = participantIdentifier; - } - - public String getParticipantScheme() { - return participantScheme; - } - - public void setParticipantScheme(String participantScheme) { - this.participantScheme = participantScheme; - } - - public boolean isSmlRegistered() { - return smlRegistered; - } - - public void setSmlRegistered(boolean smlRegistered) { - this.smlRegistered = smlRegistered; - } - - public int getExtensionStatus() { - return extensionStatus; - } - - public void setExtensionStatus(int extensionStatus) { - this.extensionStatus = extensionStatus; - } - - public String getExtension() { - return extension; - } - - public void setExtension(String extension) { - this.extension = extension; - } - - public List<UserRO> getUsers() { - return lstUser; - } - - public List<ServiceGroupDomainRO> getServiceGroupDomains() { - return serviceGroupDomains; - } - - public List<ServiceMetadataRO> getServiceMetadata() { - return serviceMetadata; - } -} diff --git a/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/data/ui/ServiceGroupValidationRO.java b/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/data/ui/ServiceGroupValidationRO.java deleted file mode 100644 index 3d181ac20..000000000 --- a/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/data/ui/ServiceGroupValidationRO.java +++ /dev/null @@ -1,74 +0,0 @@ -package eu.europa.ec.edelivery.smp.data.ui; - -public class ServiceGroupValidationRO extends BaseRO { - private static final long serialVersionUID = 9008583888835630017L; - - public static final int ERROR_CODE_OK =0; - public static final int ERROR_CODE_SERVICE_GROUP_EXISTS =1; - public static final int ERROR_CODE_INVALID_EXTENSION =2; - - Long serviceGroupId; - String extension; - String errorMessage; - String participantScheme; - String participantIdentifier; - int statusAction = 0; - - int errorCode = ERROR_CODE_OK; - - public Long getServiceGroupId() { - return serviceGroupId; - } - - public void setServiceGroupId(Long serviceGroupId) { - this.serviceGroupId = serviceGroupId; - } - - public String getExtension() { - return extension; - } - - public void setExtension(String extension) { - this.extension = extension; - } - - public String getErrorMessage() { - return errorMessage; - } - - public void setErrorMessage(String errorMessage) { - this.errorMessage = errorMessage; - } - - public int getStatusAction() { - return statusAction; - } - - public void setStatusAction(int statusAction) { - this.statusAction = statusAction; - } - - public String getParticipantScheme() { - return participantScheme; - } - - public void setParticipantScheme(String participantScheme) { - this.participantScheme = participantScheme; - } - - public String getParticipantIdentifier() { - return participantIdentifier; - } - - public void setParticipantIdentifier(String participantIdentifier) { - this.participantIdentifier = participantIdentifier; - } - - public int getErrorCode() { - return errorCode; - } - - public void setErrorCode(int errorCode) { - this.errorCode = errorCode; - } -} diff --git a/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/data/ui/ServiceMetadataValidationRO.java b/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/data/ui/ServiceMetadataValidationRO.java deleted file mode 100644 index b454ec551..000000000 --- a/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/data/ui/ServiceMetadataValidationRO.java +++ /dev/null @@ -1,77 +0,0 @@ -package eu.europa.ec.edelivery.smp.data.ui; - -/** - * @author Joze Rihtarsic - * @since 4.1 - */ -public class ServiceMetadataValidationRO extends BaseRO { - - - private static final long serialVersionUID = 9008583888835630019L; - - String participantScheme; - String participantIdentifier; - String documentIdentifierScheme; - String documentIdentifier; - - String errorMessage; - String xmlContent; - - int statusAction = 0; - - public String getParticipantScheme() { - return participantScheme; - } - - public void setParticipantScheme(String participantScheme) { - this.participantScheme = participantScheme; - } - - public String getParticipantIdentifier() { - return participantIdentifier; - } - - public void setParticipantIdentifier(String participantIdentifier) { - this.participantIdentifier = participantIdentifier; - } - - public String getDocumentIdentifierScheme() { - return documentIdentifierScheme; - } - - public void setDocumentIdentifierScheme(String documentIdentifierScheme) { - this.documentIdentifierScheme = documentIdentifierScheme; - } - - public String getDocumentIdentifier() { - return documentIdentifier; - } - - public void setDocumentIdentifier(String documentIdentifier) { - this.documentIdentifier = documentIdentifier; - } - - public String getErrorMessage() { - return errorMessage; - } - - public void setErrorMessage(String errorMessage) { - this.errorMessage = errorMessage; - } - - public String getXmlContent() { - return xmlContent; - } - - public void setXmlContent(String xmlContent) { - this.xmlContent = xmlContent; - } - - public int getStatusAction() { - return statusAction; - } - - public void setStatusAction(int statusAction) { - this.statusAction = statusAction; - } -} 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 ec76779bf..74d3ec329 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 @@ -19,8 +19,6 @@ import eu.europa.ec.edelivery.smp.logging.SMPLoggerFactory; import eu.europa.ec.edelivery.smp.servlet.ResourceAction; import org.springframework.stereotype.Service; -import java.util.Collections; - /** * Service implements logic if user can activate action on the resource */ @@ -82,40 +80,21 @@ public class ResourceGuard { DBDomain domain = group.getDomain(); DBUser dbuser = user == null ? null : user.getUser(); // if domain is internal check if user is member of domain, or any internal resources, groups - if (domain.getVisibility() == VisibilityType.PRIVATE && - (dbuser == null || - !(domainMemberDao.isUserDomainMember(dbuser, domain) - || groupMemberDao.isUserAnyDomainGroupResourceMember(dbuser, domain) - || resourceMemberDao.isUserAnyDomainResourceMember(dbuser, domain))) + if ((resource.getVisibility() == null || domain.getVisibility() == VisibilityType.PRIVATE) + && (dbuser == null || + !(domainMemberDao.isUserDomainMember(dbuser, domain) + || groupMemberDao.isUserAnyDomainGroupResourceMember(dbuser, domain) + || resourceMemberDao.isUserAnyDomainResourceMember(dbuser, domain))) ) { LOG.debug(SMPLogger.SECURITY_MARKER, "User [{}] is not authorized to read internal domain [{}] resources", user, domain); return false; } - // if group is internal check if user is member of group, or any group resources, - if (group.getVisibility() == VisibilityType.PRIVATE && - (dbuser == null || - !(groupMemberDao.isUserGroupMember(dbuser, Collections.singletonList(group)) - || resourceMemberDao.isUserAnyGroupResourceMember(dbuser, group)) - )) { - LOG.debug(SMPLogger.SECURITY_MARKER, "User [{}] is not authorized to read internal group [{}] resources", user, domain); - return false; - } // if resource is public anybody can see it if (resource.getVisibility() == VisibilityType.PUBLIC) { LOG.debug(SMPLogger.SECURITY_MARKER, "User [{}] authorized to read public resource [{}]", user, resource); return true; } - if (dbuser == null) { - LOG.debug(SMPLogger.SECURITY_MARKER, "Anonymous user [{}] is not authorized to read resource [{}]", user, resource); - return false; - } - - if (resource.getVisibility() == null || resource.getVisibility() == VisibilityType.PRIVATE) { - boolean isResourceMember = resourceMemberDao.isUserResourceMember(user.getUser(), resource); - LOG.debug(SMPLogger.SECURITY_MARKER, "User [{}] authorized: [{}] to read private resource [{}]", user, isResourceMember, resource); - return isResourceMember; - } LOG.debug(SMPLogger.SECURITY_MARKER, "User [{}] is not authorized to read resource [{}]", user, resource); return false; } @@ -160,11 +139,6 @@ public class ResourceGuard { } - public boolean canCreate(SMPUserDetails user, DBSubresource subresource) { - LOG.debug(SMPLogger.SECURITY_MARKER, "User [{}] is trying to create subresource [{}]", user, subresource); - return canUpdate(user, subresource); - } - public boolean canDelete(SMPUserDetails user, DBResource resource, DBDomain domain) { LOG.debug(SMPLogger.SECURITY_MARKER, "User [{}] is trying to delete resource [{}]", user, resource); // same as for create diff --git a/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/services/ui/UIResourceSearchService.java b/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/services/ui/UIResourceSearchService.java index d5f38fd79..554d5eb3a 100644 --- a/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/services/ui/UIResourceSearchService.java +++ b/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/services/ui/UIResourceSearchService.java @@ -102,7 +102,6 @@ public class UIResourceSearchService extends UIServiceBase<DBResource, ServiceGr smdro.setDocumentIdentifier(subresource.getIdentifierValue()); smdro.setDocumentIdentifierScheme(subresource.getIdentifierScheme()); serviceGroupRo.getServiceMetadata().add(smdro); - }); return serviceGroupRo; diff --git a/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/data/dao/AbstractJunit5BaseDao.java b/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/data/dao/AbstractJunit5BaseDao.java index 5c06e1be4..4f1b49a3d 100644 --- a/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/data/dao/AbstractJunit5BaseDao.java +++ b/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/data/dao/AbstractJunit5BaseDao.java @@ -1,16 +1,15 @@ package eu.europa.ec.edelivery.smp.data.dao; import eu.europa.ec.edelivery.smp.config.SMPDatabaseConfig; +import eu.europa.ec.edelivery.smp.config.enums.SMPPropertyEnum; import eu.europa.ec.edelivery.smp.services.AbstractServiceTest; import org.apache.commons.io.FileUtils; import org.junit.jupiter.api.extension.ExtendWith; -import org.junit.runner.RunWith; 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.junit.jupiter.SpringExtension; -import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import java.io.IOException; import java.nio.file.Path; @@ -32,10 +31,14 @@ import static eu.europa.ec.edelivery.smp.config.enums.SMPEnvPropertyEnum.*; executionPhase = Sql.ExecutionPhase.BEFORE_TEST_METHOD) public abstract class AbstractJunit5BaseDao { + @Autowired + protected ConfigurationDao configurationDao; + @Autowired protected TestUtilsDao testUtilsDao; + public static final String BUILD_FOLDER = "target"; - public static final Path SECURITY_PATH= Paths.get(BUILD_FOLDER, "smp"); + public static final Path SECURITY_PATH = Paths.get(BUILD_FOLDER, "smp"); public static final String DATABASE_URL = "jdbc:h2:file:./target/DomiSmpTestDb;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=TRUE;AUTO_SERVER=TRUE;"; public static final String DATABASE_USERNAME = "smp"; public static final String DATABASE_PASS = "smp"; @@ -63,4 +66,10 @@ public abstract class AbstractJunit5BaseDao { FileUtils.copyDirectory(resourceDirectory.toFile(), SECURITY_PATH.toFile()); } + + public void setDatabaseProperty(SMPPropertyEnum prop, String value) { + configurationDao.setPropertyToDatabase(prop, value, "Test property"); + configurationDao.reloadPropertiesFromDatabase(); + } + } diff --git a/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/data/dao/TestUtilsDao.java b/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/data/dao/TestUtilsDao.java index 5b6ca57d5..45c18cf14 100644 --- a/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/data/dao/TestUtilsDao.java +++ b/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/data/dao/TestUtilsDao.java @@ -609,6 +609,15 @@ public class TestUtilsDao { } + @Transactional + public <E> E find(Class<E> clazz, Object id) { + LOG.debug("find entity: [{}] for type [{}]", id, clazz); + return memEManager.find(clazz, id); + } + + + + public void clear() { memEManager.clear(); } 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 index 13ea2e83c..036509253 100644 --- 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 @@ -2,7 +2,9 @@ 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.enums.VisibilityType; import eu.europa.ec.edelivery.smp.data.model.DBDomain; +import eu.europa.ec.edelivery.smp.data.model.user.DBUser; import eu.europa.ec.edelivery.smp.exceptions.SMPRuntimeException; import eu.europa.ec.edelivery.smp.servlet.ResourceAction; import eu.europa.ec.edelivery.smp.servlet.ResourceRequest; @@ -23,7 +25,7 @@ class DomainGuardTest extends AbstractJunit5BaseDao { DomainGuard testInstance; ResourceRequest resourceRequest = Mockito.mock(ResourceRequest.class); - SMPUserDetails user = Mockito.mock(SMPUserDetails.class); + SMPUserDetails userDetails = Mockito.mock(SMPUserDetails.class); @BeforeEach public void prepareDatabase() { @@ -37,7 +39,7 @@ class DomainGuardTest extends AbstractJunit5BaseDao { void testResolveAndAuthorizeForDomainInvalidRequestMissingAction() { SMPRuntimeException result = assertThrows(SMPRuntimeException.class, - () -> testInstance.resolveAndAuthorizeForDomain(resourceRequest, user)); + () -> testInstance.resolveAndAuthorizeForDomain(resourceRequest, userDetails)); assertThat(result.getMessage(), containsString("Invalid request")); } @@ -46,44 +48,44 @@ class DomainGuardTest extends AbstractJunit5BaseDao { void testResolveAndAuthorizeForDomainDeleteInvalidRequestNotUser() { when(resourceRequest.getAction()).thenReturn(ResourceAction.DELETE); AuthenticationServiceException result = assertThrows(AuthenticationServiceException.class, - () -> testInstance.resolveAndAuthorizeForDomain(resourceRequest, user)); + () -> testInstance.resolveAndAuthorizeForDomain(resourceRequest, userDetails)); assertThat(result.getMessage(), containsString("User is not authorized for the domain!")); } @Test void testResolveAndAuthorizeForDomainDeleteInvalidRequestUserNotAuthorized() { - when(user.getUser()).thenReturn(testUtilsDao.getUser3()); + when(userDetails.getUser()).thenReturn(testUtilsDao.getUser3()); when(resourceRequest.getAction()).thenReturn(ResourceAction.DELETE); AuthenticationServiceException result = assertThrows(AuthenticationServiceException.class, - () -> testInstance.resolveAndAuthorizeForDomain(resourceRequest, user)); + () -> testInstance.resolveAndAuthorizeForDomain(resourceRequest, userDetails)); assertThat(result.getMessage(), containsString("User is not authorized for the domain!")); } @Test void testResolveAndAuthorizeForDomainCreateInvalidRequestUserNotAuthorized() { - when(user.getUser()).thenReturn(testUtilsDao.getUser3()); + when(userDetails.getUser()).thenReturn(testUtilsDao.getUser3()); when(resourceRequest.getAction()).thenReturn(ResourceAction.CREATE_UPDATE); AuthenticationServiceException result = assertThrows(AuthenticationServiceException.class, - () -> testInstance.resolveAndAuthorizeForDomain(resourceRequest, user)); + () -> testInstance.resolveAndAuthorizeForDomain(resourceRequest, userDetails)); assertThat(result.getMessage(), containsString("User is not authorized for the domain!")); } @Test void testResolveAndAuthorizeForDomainDeleteUserAuthorized() { - when(user.getUser()).thenReturn(testUtilsDao.getUser1()); + when(userDetails.getUser()).thenReturn(testUtilsDao.getUser1()); when(resourceRequest.getAction()).thenReturn(ResourceAction.DELETE); - DBDomain domain = testInstance.resolveAndAuthorizeForDomain(resourceRequest, user); + DBDomain domain = testInstance.resolveAndAuthorizeForDomain(resourceRequest, userDetails); assertNotNull(domain); } @Test void testResolveAndAuthorizeForDomainDeleteCreateAuthorized() { - when(user.getUser()).thenReturn(testUtilsDao.getUser1()); + when(userDetails.getUser()).thenReturn(testUtilsDao.getUser1()); when(resourceRequest.getAction()).thenReturn(ResourceAction.CREATE_UPDATE); - DBDomain domain = testInstance.resolveAndAuthorizeForDomain(resourceRequest, user); + DBDomain domain = testInstance.resolveAndAuthorizeForDomain(resourceRequest, userDetails); assertNotNull(domain); } @@ -91,7 +93,7 @@ class DomainGuardTest extends AbstractJunit5BaseDao { void testResolveAndAuthorizeForDomainCreateInvalidRequestNotUser() { when(resourceRequest.getAction()).thenReturn(ResourceAction.CREATE_UPDATE); AuthenticationServiceException result = assertThrows(AuthenticationServiceException.class, - () -> testInstance.resolveAndAuthorizeForDomain(resourceRequest, user)); + () -> testInstance.resolveAndAuthorizeForDomain(resourceRequest, userDetails)); assertThat(result.getMessage(), containsString("User is not authorized for the domain!")); } @@ -99,16 +101,37 @@ class DomainGuardTest extends AbstractJunit5BaseDao { @Test void testResolveAndAuthorizeForDomainNoUserOK() { when(resourceRequest.getAction()).thenReturn(ResourceAction.READ); - DBDomain domain = testInstance.resolveAndAuthorizeForDomain(resourceRequest, user); + DBDomain domain = testInstance.resolveAndAuthorizeForDomain(resourceRequest, userDetails); assertNotNull(domain); } @Test void testResolveAndAuthorizeForDomain() { - when(user.getUser()).thenReturn(testUtilsDao.getUser1()); + when(userDetails.getUser()).thenReturn(testUtilsDao.getUser1()); when(resourceRequest.getAction()).thenReturn(ResourceAction.READ); - DBDomain domain = testInstance.resolveAndAuthorizeForDomain(resourceRequest, user); + DBDomain domain = testInstance.resolveAndAuthorizeForDomain(resourceRequest, userDetails); assertNotNull(domain); } + @Test + void testCanReadPrivateDomainAnonimous() { + DBDomain domain = Mockito.mock(DBDomain.class); + when(domain.getVisibility()).thenReturn(VisibilityType.PRIVATE); + when(userDetails.getUser()).thenReturn(null); + boolean result = testInstance.canRead(userDetails, domain); + assertFalse(result); + } + + @Test + void testCanReadPrivateDomainUnAuthorized() { + DBDomain domain = Mockito.mock(DBDomain.class); + DBUser user = Mockito.mock(DBUser.class); + when(domain.getVisibility()).thenReturn(VisibilityType.PRIVATE); + when(userDetails.getUser()).thenReturn(user); + when(user.getId()).thenReturn(-100L); + when(domain.getId()).thenReturn(-100L); + // then user is not authorized to read the domain + boolean result = testInstance.canRead(userDetails, domain); + assertFalse(result); + } } diff --git a/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/security/ResourceGuardTest.java b/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/security/ResourceGuardTest.java new file mode 100644 index 000000000..18865ac0e --- /dev/null +++ b/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/security/ResourceGuardTest.java @@ -0,0 +1,104 @@ +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.enums.VisibilityType; +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.hamcrest.CoreMatchers; +import org.hamcrest.MatcherAssert; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.ValueSource; +import org.mockito.Mockito; +import org.springframework.beans.factory.annotation.Autowired; + +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.Mockito.when; + +class ResourceGuardTest extends AbstractJunit5BaseDao { + + @Autowired + ResourceGuard testInstance; + + ResourceRequest resourceRequest = Mockito.mock(ResourceRequest.class); + SMPUserDetails userDetails = Mockito.mock(SMPUserDetails.class); + + @BeforeEach + public void prepareDatabase() { + testUtilsDao.clearData(); + testUtilsDao.createSubresources(); + testUtilsDao.creatDomainMemberships(); + testUtilsDao.createGroupMemberships(); + testUtilsDao.createResourceMemberships(); + } + + @ParameterizedTest + @ValueSource(strings = {"READ", "CREATE_UPDATE", "DELETE"}) + void testUserIsNotAuthorizedForActionOK(ResourceAction action) { + // given - user is authorized - see the createResourceMemberships + when(userDetails.getUser()).thenReturn(testUtilsDao.getUser1()); + boolean result1 = testInstance.userIsNotAuthorizedForAction(userDetails, action, testUtilsDao.getResourceD1G1RD1(), testUtilsDao.getD1()); + boolean result = testInstance.userIsAuthorizedForAction(userDetails, action, testUtilsDao.getResourceD1G1RD1(), testUtilsDao.getD1()); + + assertTrue(result); + assertEquals(result1, !result); + } + + @ParameterizedTest + @ValueSource(strings = {"READ", "DELETE"}) + void testUserIsAuthorizedForActionOK(ResourceAction action) { + // given - user is authorized - see the createResourceMemberships + when(userDetails.getUser()).thenReturn(testUtilsDao.getUser1()); + boolean result = testInstance.userIsAuthorizedForAction(userDetails, action, testUtilsDao.getSubresourceD1G1RD1_S1()); + // then + assertTrue(result); + } + + @ParameterizedTest + @ValueSource(strings = {"CREATE_UPDATE"}) + void testUserIsAuthorizedForActionNotSupported(ResourceAction action) { + // given - user is authorized - see the createResourceMemberships + when(userDetails.getUser()).thenReturn(testUtilsDao.getUser1()); + SMPRuntimeException result = assertThrows(SMPRuntimeException.class, + () -> testInstance.userIsAuthorizedForAction(userDetails, action, testUtilsDao.getSubresourceD1G1RD1_S1())); + + // then + MatcherAssert.assertThat(result.getMessage(), CoreMatchers.containsString("Action not supported")); + } + + @Test + void testCanReadResourceForPrivateDomainOK() { + // given - user is authorized - see the createResourceMemberships + testUtilsDao.getD1().setVisibility(VisibilityType.PRIVATE); + + when(userDetails.getUser()).thenReturn(testUtilsDao.getUser1()); + boolean result = testInstance.canRead(userDetails, testUtilsDao.getSubresourceD1G1RD1_S1()); + // then + assertTrue(result); + } + + @Test + void testCanReadResourceForPrivateDomainNotMember() { + // given + testUtilsDao.getD1().setVisibility(VisibilityType.PRIVATE); + + when(userDetails.getUser()).thenReturn(testUtilsDao.getUser2()); + boolean result = testInstance.canRead(userDetails, testUtilsDao.getSubresourceD1G1RD1_S1()); + // then + assertFalse(result); + } + + @Test + void testCanReadResourceForPrivateDomainAnonymous() { + // given + testUtilsDao.getD1().setVisibility(VisibilityType.PRIVATE); + + when(userDetails.getUser()).thenReturn(null); + boolean result = testInstance.canRead(userDetails, testUtilsDao.getSubresourceD1G1RD1_S1()); + // then + assertFalse(result); + } +} diff --git a/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/services/CredentialServiceTest.java b/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/services/CredentialServiceTest.java index 0eb49a718..525a889b3 100644 --- a/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/services/CredentialServiceTest.java +++ b/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/services/CredentialServiceTest.java @@ -3,42 +3,54 @@ package eu.europa.ec.edelivery.smp.services; import eu.europa.ec.edelivery.security.PreAuthenticatedCertificatePrincipal; import eu.europa.ec.edelivery.security.utils.X509CertificateUtils; +import eu.europa.ec.edelivery.smp.data.dao.AbstractJunit5BaseDao; +import eu.europa.ec.edelivery.smp.data.dao.ConfigurationDao; import eu.europa.ec.edelivery.smp.data.model.user.DBCredential; import eu.europa.ec.edelivery.smp.testutil.TestConstants; import eu.europa.ec.edelivery.smp.testutil.X509CertificateTestUtils; +import org.hamcrest.CoreMatchers; import org.hamcrest.MatcherAssert; -import org.junit.Before; -import org.junit.Ignore; -import org.junit.Test; -import org.junit.runner.RunWith; +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 org.springframework.security.authentication.BadCredentialsException; import org.springframework.security.core.Authentication; -import org.springframework.test.context.ContextConfiguration; -import org.springframework.test.context.junit4.SpringRunner; +import org.springframework.test.util.ReflectionTestUtils; import java.io.IOException; import java.math.BigInteger; import java.security.cert.X509Certificate; import java.time.OffsetDateTime; +import java.util.Arrays; import java.util.Collections; +import java.util.List; -import static org.junit.Assert.*; +import static eu.europa.ec.edelivery.smp.services.ui.UITruststoreServiceIntegrationTest.*; +import static org.junit.jupiter.api.Assertions.*; -@RunWith(SpringRunner.class) -@ContextConfiguration(classes = {CredentialService.class}) -public class CredentialServiceTest extends AbstractServiceIntegrationTest { +public class CredentialServiceTest extends AbstractJunit5BaseDao { @Autowired CredentialService testInstance; + @Autowired + ConfigurationService configurationService; + @Autowired + ConfigurationDao configurationDao; - @Before + ConfigurationService spyConfigurationService; + + @BeforeEach public void beforeMethods() throws IOException { testUtilsDao.clearData(); testUtilsDao.createUsers(); resetKeystore(); configurationDao.reloadPropertiesFromDatabase(); + + spyConfigurationService = Mockito.spy(configurationService); + ReflectionTestUtils.setField(testInstance, "configurationService", spyConfigurationService); } @Test @@ -66,7 +78,6 @@ public class CredentialServiceTest extends AbstractServiceIntegrationTest { } @Test - @Ignore public void authenticateByUsernamePasswordTestBadPassword() { // given String username = TestConstants.USERNAME_1; @@ -264,4 +275,40 @@ public class CredentialServiceTest extends AbstractServiceIntegrationTest { // then MatcherAssert.assertThat(result.getMessage(), org.hamcrest.Matchers.startsWith("Login failed")); } + + + @Test + public void testValidateCertificatePolicyLegacyMatchOk() { + String certID = "CN=SMP Test,OU=eDelivery,O=DIGITAL,C=BE:000111"; + Mockito.doReturn(Arrays.asList(CERTIFICATE_POLICY_QCP_LEGAL, CERTIFICATE_POLICY_QCP_NATURAL)) + .when(spyConfigurationService).getAllowedCertificatePolicies(); + List<String> certPolicies = Collections.singletonList(CERTIFICATE_POLICY_QCP_NATURAL); + testInstance.validateCertificatePolicyMatchLegacy(certID, certPolicies); + } + + @Test + public void testValidateCertificatePolicyLegacyMatchMatchEmpty() { + String certID = "CN=SMP Test,OU=eDelivery,O=DIGITAL,C=BE:000111"; + Mockito.doReturn(Arrays.asList(CERTIFICATE_POLICY_QCP_LEGAL, CERTIFICATE_POLICY_QCP_NATURAL)) + .when(spyConfigurationService).getAllowedCertificatePolicies(); + List<String> certPolicies = Collections.emptyList(); + + AuthenticationServiceException result = assertThrows(AuthenticationServiceException.class, + () -> testInstance.validateCertificatePolicyMatchLegacy(certID, certPolicies)); + MatcherAssert.assertThat(result.getMessage(), CoreMatchers.startsWith("Certificate [" + certID + "] does not have CertificatePolicy extension.")); + } + + @Test + public void testValidateCertificatePolicyLegacyMatchMismatch() { + String certID = "CN=SMP Test,OU=eDelivery,O=DIGITAL,C=BE:000111"; + Mockito.doReturn(Arrays.asList(CERTIFICATE_POLICY_QCP_LEGAL, CERTIFICATE_POLICY_QCP_NATURAL)) + .when(spyConfigurationService).getAllowedCertificatePolicies(); + List<String> certPolicies = Collections.singletonList(CERTIFICATE_POLICY_QCP_LEGAL_QSCD); + + AuthenticationServiceException result = assertThrows(AuthenticationServiceException.class, + () -> testInstance.validateCertificatePolicyMatchLegacy(certID, certPolicies)); + MatcherAssert.assertThat(result.getMessage(), CoreMatchers.startsWith("Certificate policy verification failed.")); + } + + } diff --git a/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/services/DomainServiceSMLTest.java b/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/services/DomainServiceSMLTest.java deleted file mode 100644 index 9943f3786..000000000 --- a/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/services/DomainServiceSMLTest.java +++ /dev/null @@ -1,290 +0,0 @@ -/* - * Copyright 2018 European Commission | CEF eDelivery - * - * Licensed under the EUPL, Version 1.2 or - as soon they will be approved by the European Commission - subsequent versions of the EUPL (the "Licence"); - * You may not use this work except in compliance with the Licence. - * - * You may obtain a copy of the Licence attached in file: LICENCE-EUPL-v1.2.pdf - * - * Unless required by applicable law or agreed to in writing, software distributed under the Licence is distributed on an "AS IS" basis, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the Licence for the specific language governing permissions and limitations under the Licence. - */ - -package eu.europa.ec.edelivery.smp.services; - -import eu.europa.ec.bdmsl.ws.soap.BadRequestFault; -import eu.europa.ec.bdmsl.ws.soap.InternalErrorFault; -import eu.europa.ec.bdmsl.ws.soap.NotFoundFault; -import eu.europa.ec.bdmsl.ws.soap.UnauthorizedFault; -import eu.europa.ec.edelivery.smp.config.SmlIntegrationConfiguration; -import eu.europa.ec.edelivery.smp.conversion.IdentifierService; -import eu.europa.ec.edelivery.smp.data.model.DBDomain; -import eu.europa.ec.edelivery.smp.data.model.DBDomainResourceDef; -import eu.europa.ec.edelivery.smp.config.enums.SMPPropertyEnum; -import eu.europa.ec.edelivery.smp.exceptions.ErrorCode; -import eu.europa.ec.edelivery.smp.exceptions.SMPRuntimeException; -import eu.europa.ec.edelivery.smp.sml.SmlConnector; -import eu.europa.ec.edelivery.smp.testutil.TestConstants; -import eu.europa.ec.edelivery.smp.testutil.TestDBUtils; -import org.apache.commons.lang3.exception.ExceptionUtils; -import org.junit.Before; -import org.junit.Ignore; -import org.junit.Rule; -import org.junit.Test; -import org.junit.rules.ExpectedException; -import org.junit.runner.RunWith; -import org.mockito.Mockito; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.test.context.ContextConfiguration; -import org.springframework.test.context.junit4.SpringRunner; -import org.springframework.test.util.ReflectionTestUtils; -import org.springframework.transaction.annotation.Transactional; - -import javax.xml.ws.http.HTTPException; -import java.io.IOException; -import java.util.regex.Pattern; - -import static eu.europa.ec.edelivery.smp.testutil.TestConstants.*; -import static org.junit.Assert.*; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.Mockito.verify; - -/** - * Purpose of class is to test ServiceGroupService base methods - * - * @author Joze Rihtarsic - * @since 4.1 - */ -@RunWith(SpringRunner.class) -@ContextConfiguration(classes = {SmlIntegrationConfiguration.class, - SmlConnector.class, DomainService.class}) -public class DomainServiceSMLTest extends AbstractServiceIntegrationTest { - - @Rule - public ExpectedException expectedExeption = ExpectedException.none(); - - @Autowired - IdentifierService identifierService; - @Autowired - SmlIntegrationConfiguration integrationMock; - @Autowired - SmlConnector smlConnector; - @Autowired - private SMLIntegrationService smlIntegrationService; - - - @Autowired - protected DomainService testInstance; - - @Before - public void prepareDatabase() throws IOException { - - smlConnector = Mockito.spy(smlConnector); - Mockito.doNothing().when(smlConnector).configureClient(any(), any(), any()); - - ReflectionTestUtils.setField(smlIntegrationService,"smlConnector",smlConnector); - ReflectionTestUtils.setField(testInstance,"smlIntegrationService",smlIntegrationService); - - ReflectionTestUtils.setField(smlIntegrationService,"identifierService",identifierService); - identifierService.configureParticipantIdentifierFormatter(null,false, Pattern.compile(".*")); - - resetKeystore(); - setDatabaseProperty(SMPPropertyEnum.SML_PHYSICAL_ADDRESS, "0.0.0.0"); - setDatabaseProperty(SMPPropertyEnum.SML_LOGICAL_ADDRESS, "http://localhost/smp"); - setDatabaseProperty(SMPPropertyEnum.SML_URL, "http://localhost/edelivery-sml"); - setDatabaseProperty(SMPPropertyEnum.SML_ENABLED, "true"); - - integrationMock.reset(); - prepareDatabaseForSingleDomainEnv(false); - - } - - @Test - public void getDomainForBlankCodeForSingleDomain() { - - // given - assertEquals(1, domainDao.getAllDomains().size()); - - //Only one domain is in database - get domain should return the one. - DBDomain dmn = testInstance.getDomain(null); - assertEquals(TEST_DOMAIN_CODE_1, dmn.getDomainCode()); - dmn = testInstance.getDomain(""); - assertEquals(TEST_DOMAIN_CODE_1, dmn.getDomainCode()); - dmn = testInstance.getDomain(" "); - assertEquals(TEST_DOMAIN_CODE_1, dmn.getDomainCode()); - } - - @Test - public void getDomainForBlankCodeForMultipleDomain() { - // given - DBDomain testDomain02 = TestDBUtils.createDBDomain(TEST_DOMAIN_CODE_2); - domainDao.persistFlushDetach(testDomain02); - assertEquals(2, domainDao.getAllDomains().size()); - expectedExeption.expect(SMPRuntimeException.class); - expectedExeption.expectMessage(ErrorCode.MISSING_DOMAIN.getMessage()); - - // when-then - //Multiple domains in database - get domain should return the SMPRuntimeException. - testInstance.getDomain(null); - } - - - @Test - public void registerDomainAndParticipantsOK() throws NotFoundFault, UnauthorizedFault, InternalErrorFault, BadRequestFault { - /* given (init database - check setup) - * Domain: TEST_DOMAIN_CODE_1 - * Users: USERNAME_1, USER_CERT_2 - * ServiceGroup1: TEST_SG_ID_1, TEST_SG_SCHEMA_1 - * - Domain: TEST_DOMAIN_CODE_1 - * ServiceGroup2: TEST_SG_ID_2, TEST_SG_SCHEMA_2 - * - Domain: TEST_DOMAIN_CODE_1 - * - Owners: USERNAME_1 - * - Metadata: / - * ServiceGroup3: TEST_SG_ID_NO_SCHEME, null - * - Domain: TEST_DOMAIN_CODE_1 - * - Owners: USERNAME_1, USER_CERT_2 - * - Metadata: / - - DBDomain testDomain01 = domainDao.getDomainByCode(TestConstants.TEST_DOMAIN_CODE_1).get(); - DBDomainResourceDef serviceGroupDomain = serviceGroupDao.findServiceGroupDomain( - TEST_SG_ID_1, TEST_SG_SCHEMA_1, TEST_DOMAIN_CODE_1).get(); - DBDomainResourceDef serviceGroupDomain2 = serviceGroupDao - .findServiceGroupDomain(TEST_SG_ID_2, TEST_SG_SCHEMA_2, TEST_DOMAIN_CODE_1).get(); - DBDomainResourceDef serviceGroupDomain3 = serviceGroupDao - .findServiceGroupDomain(TEST_SG_ID_NO_SCHEME, null, TEST_DOMAIN_CODE_1).get(); - assertFalse(testDomain01.isSmlRegistered()); - assertFalse(serviceGroupDomain.isSmlRegistered()); - assertFalse(serviceGroupDomain2.isSmlRegistered()); - assertFalse(serviceGroupDomain3.isSmlRegistered()); - - // when - testInstance.registerDomainAndParticipants(testDomain01); - - // then - serviceGroupDomain = serviceGroupDao.findServiceGroupDomain( - TEST_SG_ID_1, TEST_SG_SCHEMA_1, TEST_DOMAIN_CODE_1).get(); - serviceGroupDomain2 = serviceGroupDao - .findServiceGroupDomain(TEST_SG_ID_2, TEST_SG_SCHEMA_2, TEST_DOMAIN_CODE_1).get(); - serviceGroupDomain3 = serviceGroupDao - .findServiceGroupDomain(TEST_SG_ID_NO_SCHEME, null, TEST_DOMAIN_CODE_1).get(); - - assertTrue(testDomain01.isSmlRegistered()); - assertTrue(serviceGroupDomain.isSmlRegistered()); - assertTrue(serviceGroupDomain2.isSmlRegistered()); - assertTrue(serviceGroupDomain3.isSmlRegistered()); - - // one sml domain create and two participant create was called - assertEquals(1, integrationMock.getSmpManagerClientMocks().size()); - verify(integrationMock.getSmpManagerClientMocks().get(0)).create(any()); - Mockito.verifyNoMoreInteractions(integrationMock.getSmpManagerClientMocks().toArray()); - - assertEquals(3, integrationMock.getParticipantManagmentClientMocks().size()); - verify(integrationMock.getParticipantManagmentClientMocks().get(0)).create(any()); - verify(integrationMock.getParticipantManagmentClientMocks().get(1)).create(any()); - verify(integrationMock.getParticipantManagmentClientMocks().get(2)).create(any()); - Mockito.verifyNoMoreInteractions(integrationMock.getParticipantManagmentClientMocks().toArray()); - - - } - - @Test - public void registerDomainAndParticipantsFailed() throws NotFoundFault, UnauthorizedFault, InternalErrorFault, BadRequestFault { -/* - DBDomain testDomain01 = domainDao.getDomainByCode(TestConstants.TEST_DOMAIN_CODE_1).get(); - DBDomainResourceDef serviceGroupDomain = serviceGroupDao.findServiceGroupDomain( - TEST_SG_ID_1, TEST_SG_SCHEMA_1, TEST_DOMAIN_CODE_1).get(); - DBDomainResourceDef serviceGroupDomain2 = serviceGroupDao - .findServiceGroupDomain(TEST_SG_ID_2, TEST_SG_SCHEMA_2, TEST_DOMAIN_CODE_1).get(); - - assertFalse(testDomain01.isSmlRegistered()); - assertFalse(serviceGroupDomain.isSmlRegistered()); - assertFalse(serviceGroupDomain2.isSmlRegistered()); - integrationMock.setThrowExceptionAfterParticipantCallCount(1); - - - // when - try { - testInstance.registerDomainAndParticipants(testDomain01); - fail("Testcase should throw an error with code 400"); - } catch (Exception ex) { - ex.printStackTrace(); - assertEquals(400, ((HTTPException) ExceptionUtils.getRootCause(ex)).getStatusCode()); - } - - - // then - serviceGroupDomain = serviceGroupDao.findServiceGroupDomain( - TEST_SG_ID_1, TEST_SG_SCHEMA_1, TEST_DOMAIN_CODE_1).get(); - serviceGroupDomain2 = serviceGroupDao - .findServiceGroupDomain(TEST_SG_ID_2, TEST_SG_SCHEMA_2, TEST_DOMAIN_CODE_1).get(); - assertTrue(testDomain01.isSmlRegistered()); - assertTrue(serviceGroupDomain.isSmlRegistered()); - assertFalse(serviceGroupDomain2.isSmlRegistered()); - - // one sml domain create and two participant create was called - assertEquals(1, integrationMock.getSmpManagerClientMocks().size()); - verify(integrationMock.getSmpManagerClientMocks().get(0)).create(any()); - Mockito.verifyNoMoreInteractions(integrationMock.getSmpManagerClientMocks().toArray()); - - // only first succeeded - assertEquals(1, integrationMock.getParticipantManagmentClientMocks().size()); - verify(integrationMock.getParticipantManagmentClientMocks().get(0)).create(any()); - Mockito.verifyNoMoreInteractions(integrationMock.getParticipantManagmentClientMocks().toArray()); -*/ - } - - @Test - @Transactional - public void unregisterDomainAndParticipantsFromSmlOK() throws NotFoundFault, UnauthorizedFault, InternalErrorFault, BadRequestFault { - /* given (init database - check setup) - * Domain: TEST_DOMAIN_CODE_1 - * Users: USERNAME_1, USER_CERT_2 - * ServiceGroup1: TEST_SG_ID_1, TEST_SG_SCHEMA_1 - * - Domain: TEST_DOMAIN_CODE_1 - * - Owners: USERNAME_1, USER_CERT_2 - * - Metadata: - * - TEST_DOC_ID_1, TEST_DOC_SCHEMA_1 - * - * - * ServiceGroup2: TEST_SG_ID_2, TEST_SG_SCHEMA_2 - * - Domain: TEST_DOMAIN_CODE_1 - * - Owners: USERNAME_1 - * - Metadata: / - - DBDomain testDomain01 = domainDao.getDomainByCode(TestConstants.TEST_DOMAIN_CODE_1).get(); - DBDomainResourceDef serviceGroupDomain = serviceGroupDao.findServiceGroupDomain( - TEST_SG_ID_1, TEST_SG_SCHEMA_1, TEST_DOMAIN_CODE_1).get(); - DBDomainResourceDef serviceGroupDomain2 = serviceGroupDao - .findServiceGroupDomain(TEST_SG_ID_2, TEST_SG_SCHEMA_2, TEST_DOMAIN_CODE_1).get(); - testDomain01.setSmlRegistered(true); - serviceGroupDomain.setSmlRegistered(true); - serviceGroupDomain2.setSmlRegistered(true); - serviceGroupDao.updateServiceGroupDomain(serviceGroupDomain); - serviceGroupDao.updateServiceGroupDomain(serviceGroupDomain2); - - // when - testInstance.unregisterDomainAndParticipantsFromSml(testDomain01); - - // then - serviceGroupDomain = serviceGroupDao.findServiceGroupDomain( - TEST_SG_ID_1, TEST_SG_SCHEMA_1, TEST_DOMAIN_CODE_1).get(); - serviceGroupDomain2 = serviceGroupDao - .findServiceGroupDomain(TEST_SG_ID_2, TEST_SG_SCHEMA_2, TEST_DOMAIN_CODE_1).get(); - assertFalse(testDomain01.isSmlRegistered()); - assertFalse(serviceGroupDomain.isSmlRegistered()); - assertFalse(serviceGroupDomain2.isSmlRegistered()); - - // one sml domain create and two participant create was called - assertEquals(1, integrationMock.getSmpManagerClientMocks().size()); - verify(integrationMock.getSmpManagerClientMocks().get(0)).delete(testDomain01.getSmlSmpId()); - Mockito.verifyNoMoreInteractions(integrationMock.getSmpManagerClientMocks().toArray()); - - assertEquals(2, integrationMock.getParticipantManagmentClientMocks().size()); - verify(integrationMock.getParticipantManagmentClientMocks().get(0)).delete(any()); - verify(integrationMock.getParticipantManagmentClientMocks().get(1)).delete(any()); - Mockito.verifyNoMoreInteractions(integrationMock.getParticipantManagmentClientMocks().toArray()); - */ - } - -} diff --git a/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/services/DomainServiceTest.java b/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/services/DomainServiceTest.java new file mode 100644 index 000000000..e4aa39de0 --- /dev/null +++ b/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/services/DomainServiceTest.java @@ -0,0 +1,200 @@ +/* + * Copyright 2018 European Commission | CEF eDelivery + * + * Licensed under the EUPL, Version 1.2 or - as soon they will be approved by the European Commission - subsequent versions of the EUPL (the "Licence"); + * You may not use this work except in compliance with the Licence. + * + * You may obtain a copy of the Licence attached in file: LICENCE-EUPL-v1.2.pdf + * + * Unless required by applicable law or agreed to in writing, software distributed under the Licence is distributed on an "AS IS" basis, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the Licence for the specific language governing permissions and limitations under the Licence. + */ + +package eu.europa.ec.edelivery.smp.services; + +import eu.europa.ec.edelivery.smp.config.SmlIntegrationConfiguration; +import eu.europa.ec.edelivery.smp.config.enums.SMPPropertyEnum; +import eu.europa.ec.edelivery.smp.conversion.IdentifierService; +import eu.europa.ec.edelivery.smp.data.dao.AbstractJunit5BaseDao; +import eu.europa.ec.edelivery.smp.data.dao.DomainDao; +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.exceptions.ErrorCode; +import eu.europa.ec.edelivery.smp.exceptions.SMPRuntimeException; +import eu.europa.ec.edelivery.smp.sml.SmlConnector; +import eu.europa.ec.edelivery.smp.testutil.TestDBUtils; +import org.hamcrest.CoreMatchers; +import org.hamcrest.MatcherAssert; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.NullSource; +import org.junit.jupiter.params.provider.ValueSource; +import org.mockito.Mockito; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.test.util.ReflectionTestUtils; + +import java.io.IOException; +import java.util.regex.Pattern; + +import static eu.europa.ec.edelivery.smp.testutil.TestConstants.TEST_DOMAIN_CODE_1; +import static eu.europa.ec.edelivery.smp.testutil.TestConstants.TEST_DOMAIN_CODE_2; +import static org.junit.Assert.*; +import static org.mockito.ArgumentMatchers.any; + +/** + * Purpose of class is to test ServiceGroupService base methods + * + * @author Joze Rihtarsic + * @since 4.1 + */ + +public class DomainServiceTest extends AbstractJunit5BaseDao { + + @Autowired + IdentifierService identifierService; + @Autowired + SmlIntegrationConfiguration integrationMock; + @Autowired + SmlConnector smlConnector; + @Autowired + private SMLIntegrationService smlIntegrationService; + + + @Autowired + protected DomainDao domainDao; + + @Autowired + protected DomainService testInstance; + + + @BeforeEach + public void prepareDatabase() throws IOException { + smlConnector = Mockito.spy(smlConnector); + Mockito.doNothing().when(smlConnector).configureClient(any(), any(), any()); + + ReflectionTestUtils.setField(smlIntegrationService, "smlConnector", smlConnector); + ReflectionTestUtils.setField(testInstance, "smlIntegrationService", smlIntegrationService); + + ReflectionTestUtils.setField(smlIntegrationService, "identifierService", identifierService); + identifierService.configureParticipantIdentifierFormatter(null, false, Pattern.compile(".*")); + + resetKeystore(); + setDatabaseProperty(SMPPropertyEnum.SML_PHYSICAL_ADDRESS, "0.0.0.0"); + setDatabaseProperty(SMPPropertyEnum.SML_LOGICAL_ADDRESS, "http://localhost/smp"); + setDatabaseProperty(SMPPropertyEnum.SML_URL, "http://localhost/edelivery-sml"); + setDatabaseProperty(SMPPropertyEnum.SML_ENABLED, "true"); + + integrationMock.reset(); + + + } + + @ParameterizedTest + @NullSource + @ValueSource(strings = {"", " "}) + public void getDomainForBlankCodeForSingleDomain(String searchCode) { + + // given + DBDomain testDomain01 = testUtilsDao.createDomain(TEST_DOMAIN_CODE_1); + assertEquals(1, domainDao.getAllDomains().size()); + + //Only one domain is in database - get domain should return the one. + DBDomain dmn = testInstance.getDomain(searchCode); + assertEquals(testDomain01.getDomainCode(), dmn.getDomainCode()); + } + + @Test + public void getDomainForBlankCodeForMultipleDomain() { + // given + DBDomain testDomain01 = testUtilsDao.createDomain(TEST_DOMAIN_CODE_1); + DBDomain testDomain02 = TestDBUtils.createDBDomain(TEST_DOMAIN_CODE_2); + domainDao.persistFlushDetach(testDomain02); + assertEquals(2, domainDao.getAllDomains().size()); + + // when-then + //Multiple domains in database - get domain should return the SMPRuntimeException. + SMPRuntimeException result = assertThrows(SMPRuntimeException.class, + () -> testInstance.getDomain(null)); + + assertEquals(ErrorCode.MISSING_DOMAIN, result.getErrorCode()); + } + + @Test + public void getDomainForBlankCodeForMultipleDomainNotExists() { + // given + DBDomain testDomain01 = testUtilsDao.createDomain(TEST_DOMAIN_CODE_1); + DBDomain testDomain02 = TestDBUtils.createDBDomain(TEST_DOMAIN_CODE_2); + domainDao.persistFlushDetach(testDomain02); + assertEquals(2, domainDao.getAllDomains().size()); + String searchDomain = "DomainCodeNotExists"; + + // when-then + SMPRuntimeException result = assertThrows(SMPRuntimeException.class, + () -> testInstance.getDomain(searchDomain)); + + assertEquals(ErrorCode.DOMAIN_NOT_EXISTS, result.getErrorCode()); + } + + @Test + public void getDomainForInvalidCode() { + // given + DBDomain testDomain01 = testUtilsDao.createDomain(TEST_DOMAIN_CODE_1); + DBDomain testDomain02 = TestDBUtils.createDBDomain(TEST_DOMAIN_CODE_2); + domainDao.persistFlushDetach(testDomain02); + assertEquals(2, domainDao.getAllDomains().size()); + String searchDomain = "s2###Q23@#"; + + // when-then + //Multiple domains in database - get domain should return the SMPRuntimeException. + SMPRuntimeException result = assertThrows(SMPRuntimeException.class, + () -> testInstance.getDomain(searchDomain)); + assertEquals(ErrorCode.INVALID_DOMAIN_CODE, result.getErrorCode()); + MatcherAssert.assertThat(result.getMessage(), + CoreMatchers.containsString("Provided Domain Code '" + searchDomain + "' does not match required pattern")); + } + + @Test + public void testRegisterDomainAndParticipantsOK() { + // given + testUtilsDao.clearData(); + testUtilsDao.createResources(); + DBDomain testDomain = testUtilsDao.getD1(); + DBResource testResource = testUtilsDao.getResourceD1G1RD1(); + assertFalse(testDomain.isSmlRegistered()); + assertFalse(testResource.isSmlRegistered()); + + // when + testInstance.registerDomainAndParticipants(testDomain); + + // then + // update resource because testResource is detached + DBResource dbUpdatedResource = testUtilsDao.find(DBResource.class, testResource.getId()); + + assertTrue(testDomain.isSmlRegistered()); + assertTrue(dbUpdatedResource.isSmlRegistered()); + } + + @Test + public void testUnRegisterDomainAndParticipantsOK() { + // given + testUtilsDao.clearData(); + testUtilsDao.createResources(); + DBDomain testDomain = testUtilsDao.getD1(); + testInstance.registerDomainAndParticipants(testDomain); + DBResource dbUpdatedResource = testUtilsDao.find(DBResource.class, testUtilsDao.getResourceD1G1RD1().getId()); + + assertTrue(testDomain.isSmlRegistered()); + assertTrue(dbUpdatedResource.isSmlRegistered()); + + // when + testInstance.unregisterDomainAndParticipantsFromSml(testDomain); + + // then + dbUpdatedResource = testUtilsDao.find(DBResource.class, dbUpdatedResource.getId()); + assertFalse(testDomain.isSmlRegistered()); + assertFalse(dbUpdatedResource.isSmlRegistered()); + } + +} diff --git a/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/services/ui/UIResourceSearchServiceTest.java b/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/services/ui/UIResourceSearchServiceTest.java index a6ee9e3ea..6f16b4b23 100644 --- a/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/services/ui/UIResourceSearchServiceTest.java +++ b/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/services/ui/UIResourceSearchServiceTest.java @@ -1,27 +1,24 @@ package eu.europa.ec.edelivery.smp.services.ui; -import eu.europa.ec.edelivery.smp.config.ConversionTestConfig; +import eu.europa.ec.edelivery.smp.data.dao.AbstractJunit5BaseDao; import eu.europa.ec.edelivery.smp.data.ui.ServiceGroupSearchRO; import eu.europa.ec.edelivery.smp.data.ui.ServiceResult; -import eu.europa.ec.edelivery.smp.services.AbstractServiceIntegrationTest; import eu.europa.ec.edelivery.smp.services.ui.filters.ResourceFilter; -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.test.context.ContextConfiguration; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; -@ContextConfiguration(classes = {UIResourceSearchService.class, ConversionTestConfig.class}) -public class UIResourceSearchServiceTest extends AbstractServiceIntegrationTest { +public class UIResourceSearchServiceTest extends AbstractJunit5BaseDao { @Autowired protected UIResourceSearchService testInstance; - @Before + @BeforeEach public void prepareDatabase() { // setup initial data! testUtilsDao.clearData(); diff --git a/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/services/ui/UIResourceServiceTest.java b/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/services/ui/UIResourceServiceTest.java index bac7784cc..92c1a47d3 100644 --- a/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/services/ui/UIResourceServiceTest.java +++ b/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/services/ui/UIResourceServiceTest.java @@ -164,8 +164,62 @@ public class UIResourceServiceTest extends AbstractJunit5BaseDao { assertEquals(VisibilityType.PRIVATE, result.getVisibility()); } + @Test - public void testDeleteResourceFromGroup() { + public void testUpdateResourceForGroupGroupNotFound() { + // given + DBResource dbResource = testUtilsDao.getResourceD1G1RD1(); + ResourceRO testResource = TestROUtils.createResource(dbResource.getIdentifierValue(), dbResource.getIdentifierScheme(), dbResource.getDomainResourceDef().getResourceDef().getIdentifier()); + assertNotEquals(dbResource.getVisibility(), VisibilityType.PRIVATE); + testResource.setVisibility(VisibilityType.PRIVATE); + + // when + SMPRuntimeException result = assertThrows(SMPRuntimeException.class, + ()-> testInstance.updateResourceForGroup(testResource, dbResource.getId(), + -1000L, testUtilsDao.getD1().getId())); + // then + assertEquals(ErrorCode.INVALID_REQUEST, result.getErrorCode()); + assertThat(result.getMessage(), containsString("Group does not exist!")); + } + + @Test + public void testUpdateResourceForGroupNotBelongToDomain() { + // given + DBResource dbResource = testUtilsDao.getResourceD1G1RD1(); + ResourceRO testResource = TestROUtils.createResource(dbResource.getIdentifierValue(), dbResource.getIdentifierScheme(), dbResource.getDomainResourceDef().getResourceDef().getIdentifier()); + assertNotEquals(dbResource.getVisibility(), VisibilityType.PRIVATE); + testResource.setVisibility(VisibilityType.PRIVATE); + + // when + SMPRuntimeException result = assertThrows(SMPRuntimeException.class, + ()-> testInstance.updateResourceForGroup(testResource, dbResource.getId(), + testUtilsDao.getGroupD2G1().getId(), testUtilsDao.getD1().getId())); + // then + assertEquals(ErrorCode.INVALID_REQUEST, result.getErrorCode()); + assertThat(result.getMessage(), containsString("Group does not belong to the given domain!")); + } + + + @Test + public void testUpdateResourceForGroupResourceDefNotFound() { + // given + String defIdNotExist = UUID.randomUUID().toString(); + DBResource dbResource = testUtilsDao.getResourceD1G1RD1(); + ResourceRO testResource = TestROUtils.createResource(dbResource.getIdentifierValue(), dbResource.getIdentifierScheme(), defIdNotExist); + assertNotEquals(dbResource.getVisibility(), VisibilityType.PRIVATE); + testResource.setVisibility(VisibilityType.PRIVATE); + + // when + SMPRuntimeException result = assertThrows(SMPRuntimeException.class, + ()-> testInstance.updateResourceForGroup(testResource, dbResource.getId(), + testUtilsDao.getGroupD1G1().getId(), testUtilsDao.getD1().getId())); + // then + assertEquals(ErrorCode.INVALID_REQUEST, result.getErrorCode()); + assertThat(result.getMessage(), containsString("Resource definition ["+defIdNotExist+"] does not exist!")); + } + + @Test + public void testDeleteResourceFromGroupOK() { // given ResourceRO testResource = TestROUtils.createResource(UUID.randomUUID().toString(), TEST_SG_SCHEMA_1, testUtilsDao.getDomainResourceDefD1R1().getResourceDef().getIdentifier()); @@ -179,6 +233,47 @@ public class UIResourceServiceTest extends AbstractJunit5BaseDao { assertNull(resourceDao.find(resourceId)); } + + @Test + public void testDeleteResourceFromGroupResourceNotExists() { + // given + // when + SMPRuntimeException result = assertThrows(SMPRuntimeException.class, + ()-> testInstance.deleteResourceFromGroup(-1000L, testUtilsDao.getGroupD1G1().getId(), testUtilsDao.getD1().getId())); + // then + assertEquals(ErrorCode.INVALID_REQUEST, result.getErrorCode()); + assertThat(result.getMessage(), containsString("Resource does not exist!")); + } + + + @Test + public void testDeleteResourceFromGroupResourceNotBelongToGroup() { + // given + // when + SMPRuntimeException result = assertThrows(SMPRuntimeException.class, + ()-> testInstance.deleteResourceFromGroup(testUtilsDao.getResourceD2G1RD1().getId(), testUtilsDao.getGroupD1G1().getId(), testUtilsDao.getD1().getId())); + // then + assertEquals(ErrorCode.INVALID_REQUEST, result.getErrorCode()); + assertThat(result.getMessage(), containsString("Resource does not belong to the group!")); + } + + @Test + public void testDeleteResourceFromGroup() { + // given + ResourceRO testResource = TestROUtils.createResource(UUID.randomUUID().toString(), TEST_SG_SCHEMA_1, + testUtilsDao.getDomainResourceDefD1R1().getResourceDef().getIdentifier()); + ResourceRO resourceRO = testInstance.createResourceForGroup(testResource, testUtilsDao.getGroupD1G1().getId(), + testUtilsDao.getD1().getId(), testUtilsDao.getUser1().getId()); + Long resourceId = new Long(resourceRO.getResourceId()); + assertNotNull(resourceDao.find(resourceId)); + // when + SMPRuntimeException result = assertThrows(SMPRuntimeException.class, + ()-> testInstance.deleteResourceFromGroup(resourceId, testUtilsDao.getGroupD1G1().getId(), testUtilsDao.getD2().getId())); + // then + assertEquals(ErrorCode.INVALID_REQUEST, result.getErrorCode()); + assertThat(result.getMessage(), containsString("Group does not belong to the given domain!")); + } + @Test public void testGetResourceMembers() { // given diff --git a/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/services/ui/UIUserServiceIntegrationTest.java b/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/services/ui/UIUserServiceIntegrationTest.java index 598ec7fe0..fede9cd3e 100644 --- a/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/services/ui/UIUserServiceIntegrationTest.java +++ b/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/services/ui/UIUserServiceIntegrationTest.java @@ -214,6 +214,27 @@ public class UIUserServiceIntegrationTest extends AbstractJunit5BaseDao { testInstance.updateUserPassword(authorizedUserId, userToUpdateId, authorizedPassword, newPassword); } + @Test + public void testUpdateUserPasswordByAdminUserNotExists() { + // system admin + DBUser user = TestDBUtils.createDBUserByUsername(UUID.randomUUID().toString()); + user.setApplicationRole(ApplicationRoleType.SYSTEM_ADMIN); + DBCredential credential = TestDBUtils.createDBCredentialForUser(user, null, null, null); + credential.setValue(BCrypt.hashpw("userPassword", BCrypt.gensalt())); + userDao.persistFlushDetach(user); + credentialDao.persistFlushDetach(credential); + + long authorizedUserId = user.getId(); + long userToUpdateId =-1000L; + String authorizedPassword = "userPassword"; + String newPassword = "TTTTtttt1111$$$$$"; + + SMPRuntimeException result = assertThrows(SMPRuntimeException.class, + () -> testInstance.updateUserPassword(authorizedUserId,userToUpdateId, authorizedPassword, newPassword)); + + MatcherAssert.assertThat(result.getMessage(), CoreMatchers.containsString("Invalid request [UserId]. Error: Can not find user id to update")); + } + @Test public void testAdminUpdateUserdataOK() { DBUser user = TestDBUtils.createDBUserByUsername(UUID.randomUUID().toString()); @@ -259,6 +280,18 @@ public class UIUserServiceIntegrationTest extends AbstractJunit5BaseDao { assertEqualDates(accessToken.getGeneratedOn(), accessToken.getCredential().getActiveFrom()); } + @Test + public void testCreateAccessTokenForUserUserNotExists() { + CredentialRO credentialRO = new CredentialRO(); + credentialRO.setCredentialType(CredentialType.ACCESS_TOKEN); + credentialRO.setDescription("test description"); + + SMPRuntimeException result = assertThrows(SMPRuntimeException.class, + () -> testInstance.createAccessTokenForUser(-100L, credentialRO)); + + MatcherAssert.assertThat(result.getMessage(), CoreMatchers.containsString("Invalid request [UserId]. Error: Can not find user id!")); + } + @Test public void testStoreCertificateCredentialForUser() throws Exception { DBUser user = TestDBUtils.createDBUserByUsername(UUID.randomUUID().toString()); @@ -280,6 +313,21 @@ public class UIUserServiceIntegrationTest extends AbstractJunit5BaseDao { assertEquals(credentialRO.getDescription(), result.getDescription()); } + @Test + public void testStoreCertificateCredentialForUserUserNotExists() throws Exception { + CertificateRO certificateRO = TestROUtils.createCertificateRO("CN=Test,OU=Test,O=Test,L=Test,ST=Test,C=EU", BigInteger.TEN); + + CredentialRO credentialRO = new CredentialRO(); + credentialRO.setCredentialType(CredentialType.CERTIFICATE); + credentialRO.setDescription("test description"); + credentialRO.setCertificate(certificateRO); + + SMPRuntimeException result = assertThrows(SMPRuntimeException.class, + () -> testInstance.storeCertificateCredentialForUser(-100L, credentialRO)); + + MatcherAssert.assertThat(result.getMessage(), CoreMatchers.containsString("Invalid request [UserId]. Error: Can not find user id!")); + } + @Test public void testUpdateUserProfile() { DBUser user = TestDBUtils.createDBUserByUsername(UUID.randomUUID().toString()); -- GitLab