From f5ae47505692bb6455942b9ad1685c61e7b0a9f8 Mon Sep 17 00:00:00 2001 From: Joze RIHTARSIC <joze.rihtarsic@ext.ec.europa.eu> Date: Thu, 9 Aug 2018 15:12:25 +0200 Subject: [PATCH] update oracle patch sql script from 4.0.0 to 4.1.0 add new unit and integration tests --- .../ec/edelivery/smp/data/dao/BaseDao.java | 4 - .../smp/services/ServiceGroupService.java | 39 +++--- ...oupServiceSingleDomainIntegrationTest.java | 73 ++++++++++- .../oracle10g-4.0.0-to-4.1.0.ddl | 12 +- .../database-scripts/oracle10g-4.1.0.ddl | 2 +- .../ErrorMappingControllerAdviceTest.java | 123 ++++++++++++++++++ 6 files changed, 224 insertions(+), 29 deletions(-) create mode 100644 smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/error/ErrorMappingControllerAdviceTest.java diff --git a/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/data/dao/BaseDao.java b/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/data/dao/BaseDao.java index b27eb2582..04c3d71e6 100644 --- a/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/data/dao/BaseDao.java +++ b/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/data/dao/BaseDao.java @@ -43,10 +43,6 @@ public abstract class BaseDao<E extends BaseEntity> { em.detach(entity); } - public void merge(E entity) { - em.merge(entity); - } - public void remove(E entity) { em.remove(entity); } diff --git a/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/services/ServiceGroupService.java b/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/services/ServiceGroupService.java index a58f84611..55b44f8e1 100644 --- a/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/services/ServiceGroupService.java +++ b/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/services/ServiceGroupService.java @@ -87,13 +87,8 @@ public class ServiceGroupService { public boolean saveServiceGroup(ServiceGroup serviceGroup, String domain, String serviceGroupOwner, String authenticatedUser) { ServiceGroup normalizedServiceGroup = normalizeIdentifierCaseSensitivity(serviceGroup); ParticipantIdentifierType normalizedParticipantId = normalizedServiceGroup.getParticipantIdentifier(); - String newOwnerName; - try { - newOwnerName = isNotBlank(serviceGroupOwner) ? decode(serviceGroupOwner, UTF_8) : authenticatedUser; - } catch (UnsupportedEncodingException | IllegalArgumentException ex) { - throw new InvalidOwnerException(serviceGroupOwner, "Unsupported or invalid encoding: " + ex.getMessage()); - } + String newOwnerName = defineGroupOwner(serviceGroupOwner, authenticatedUser); DBUser newOwner = userDao.find(newOwnerName); if (newOwner == null) { @@ -108,15 +103,8 @@ public class ServiceGroupService { if (dbServiceGroup != null) { // test service owner - Set<DBOwnership> owSet = dbServiceGroup.getOwnerships(); - Optional<DBOwnership> owner = owSet.stream().filter(dbOwnership -> dbOwnership.getUser().getUsername().equals(newOwnerName)).findFirst(); - // test serviceGroupOwner but use newOwnerName - because it is decoded - if (serviceGroupOwner!=null && !owner.isPresent()){ - String msg = "User: " +newOwnerName+ " is not owner of service group: " +dbServiceGroup.getId().getBusinessIdentifierScheme() + "::" + dbServiceGroup.getId().getBusinessIdentifier(); - LOG.error(msg); - throw new InvalidOwnerException(serviceGroupOwner, msg); - } - + validateOwnership(newOwnerName, dbServiceGroup); + //update extensions dbServiceGroup.setExtension(extensions); serviceGroupDao.persistFlushDetach(dbServiceGroup); return false; @@ -139,6 +127,27 @@ public class ServiceGroupService { } } + protected String defineGroupOwner(String serviceGroupOwner, String authenticatedUser){ + try { + return isNotBlank(serviceGroupOwner) ? decode(serviceGroupOwner, UTF_8) : authenticatedUser; + } catch (UnsupportedEncodingException | IllegalArgumentException ex) { + LOG.error("Error occurred while decoding serviceGroupOwner '" + serviceGroupOwner+"'", ex); + throw new InvalidOwnerException(serviceGroupOwner, "Unsupported or invalid encoding: " + ex.getMessage()); + } + } + + protected void validateOwnership(String newOwnerName, DBServiceGroup dbServiceGroup){ + Set<DBOwnership> owSet = dbServiceGroup.getOwnerships(); + Optional<DBOwnership> owner = owSet.stream().filter(dbOwnership -> dbOwnership.getUser().getUsername().equals(newOwnerName)).findFirst(); + // test serviceGroupOwner but use newOwnerName - because it is decoded + if (newOwnerName!=null && !owner.isPresent()){ + String msg = "User: " +newOwnerName+ " is not owner of service group: " +dbServiceGroup.getId().getBusinessIdentifierScheme() + "::" + dbServiceGroup.getId().getBusinessIdentifier(); + LOG.error(msg); + throw new InvalidOwnerException(newOwnerName, msg); + } + + } + private DBDomain findDomain(String domain) { if (isNotBlank(domain)) { DBDomain dbDomain = domainDao.find(domain); diff --git a/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/services/ServiceGroupServiceSingleDomainIntegrationTest.java b/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/services/ServiceGroupServiceSingleDomainIntegrationTest.java index 8653a2d58..14b8ecc8a 100644 --- a/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/services/ServiceGroupServiceSingleDomainIntegrationTest.java +++ b/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/services/ServiceGroupServiceSingleDomainIntegrationTest.java @@ -13,9 +13,8 @@ package eu.europa.ec.edelivery.smp.services; -import eu.europa.ec.edelivery.smp.data.model.DBOwnership; -import eu.europa.ec.edelivery.smp.data.model.DBOwnershipId; -import eu.europa.ec.edelivery.smp.data.model.DBServiceGroup; + +import eu.europa.ec.edelivery.smp.data.model.*; import eu.europa.ec.edelivery.smp.exceptions.InvalidOwnerException; import eu.europa.ec.edelivery.smp.exceptions.NotFoundException; import eu.europa.ec.edelivery.smp.exceptions.UnknownUserException; @@ -31,6 +30,7 @@ import org.springframework.test.context.jdbc.Sql; import javax.xml.bind.JAXBException; import java.io.IOException; +import java.util.HashSet; import java.util.List; import java.util.regex.Matcher; @@ -40,6 +40,7 @@ import static eu.europa.ec.edelivery.smp.testutil.XmlTestUtils.loadDocumentAsStr import static eu.europa.ec.edelivery.smp.testutil.XmlTestUtils.marshall; import static eu.europa.ec.smp.api.Identifiers.asParticipantId; +import static java.util.Arrays.asList; import static org.junit.Assert.*; import static eu.europa.ec.edelivery.smp.testutil.TestConstants.*; @@ -120,6 +121,72 @@ public class ServiceGroupServiceSingleDomainIntegrationTest extends AbstractServ assertEquals(marshall(newServiceGroup), marshall(resultServiceGroup)); } + @Test + public void defineGroupOwnerWhenOwnerIsNull(){ + String testUser = "user"; + String result = serviceGroupService.defineGroupOwner(null, testUser); + assertEquals(testUser, result); + + result = serviceGroupService.defineGroupOwner("", testUser); + assertEquals(testUser, result); + } + + @Test + public void defineGroupOwnerWhenOwnerIsNotNull(){ + String testUser = "user"; + String testOwner = "owner"; + String result = serviceGroupService.defineGroupOwner(testOwner, testUser); + assertEquals(testOwner, result); + } + + @Test + public void validateOwnershipHasRightOwner(){ + String testOwner = "owner"; + + DBServiceGroup dbServiceGroup = new DBServiceGroup(new DBServiceGroupId("","")); + + DBUser duser = new DBUser(); + duser.setUsername(testOwner); + DBOwnershipId dbOwnershipID = new DBOwnershipId(testOwner, "", ""); + DBOwnership dbOwnership = new DBOwnership(); + dbOwnership.setId(dbOwnershipID); + dbOwnership.setUser(duser); + + DBUser user0 = new DBUser(); + user0.setUsername("otherOwner"); + DBOwnershipId dbOwnershipID0 = new DBOwnershipId("otherOwner", "", ""); + DBOwnership dbOwnership0 = new DBOwnership(); + dbOwnership0.setId(dbOwnershipID0); + dbOwnership0.setUser(user0); + + dbServiceGroup.setOwnerships(new HashSet(asList(dbOwnership0, dbOwnership))); + + serviceGroupService.validateOwnership(testOwner, dbServiceGroup); + + } + + @Test + public void validateOwnershipHasInvalidOwner(){ + String testOwner = "owner"; + DBServiceGroup dbServiceGroup = new DBServiceGroup(new DBServiceGroupId("","")); + + expectedExeption.expect(InvalidOwnerException.class); + expectedExeption.expectMessage("User: " +testOwner+ " is not owner of service group: "); + + DBUser duser = new DBUser(); + duser.setUsername("otherOwner"); + DBOwnershipId dbOwnershipID0 = new DBOwnershipId("otherOwner", "", ""); + DBOwnership dbOwnership0 = new DBOwnership(); + dbOwnership0.setId(dbOwnershipID0); + dbOwnership0.setUser(duser); + + + dbServiceGroup.setOwnerships(new HashSet(asList(dbOwnership0))); + + serviceGroupService.validateOwnership(testOwner, dbServiceGroup); + + } + @Test public void updateUnknownUserException() throws IOException, JAXBException { diff --git a/smp-webapp/src/main/smp-setup/database-scripts/oracle10g-4.0.0-to-4.1.0.ddl b/smp-webapp/src/main/smp-setup/database-scripts/oracle10g-4.0.0-to-4.1.0.ddl index e83c39ad7..51c15c19b 100644 --- a/smp-webapp/src/main/smp-setup/database-scripts/oracle10g-4.0.0-to-4.1.0.ddl +++ b/smp-webapp/src/main/smp-setup/database-scripts/oracle10g-4.0.0-to-4.1.0.ddl @@ -18,7 +18,7 @@ CREATE TABLE smp_domain_AUD ( signatureCertAlias VARCHAR(50), REV INTEGER NOT NULL, REVTYPE NUMBER(3), - CONSTRAINT PK_SMP_DOMAIN_AUD PRIMARY KEY(domainId) + CONSTRAINT PK_SMP_DOMAIN_AUD PRIMARY KEY(domainId, REV) ); CREATE TABLE smp_service_group_AUD ( @@ -28,7 +28,7 @@ CREATE TABLE smp_service_group_AUD ( domainId VARCHAR(50), REV INTEGER NOT NULL, REVTYPE NUMBER(3), - CONSTRAINT PK_SMP_GRP_AUD PRIMARY KEY (businessIdentifier, businessIdentifierScheme) + CONSTRAINT PK_SMP_GRP_AUD PRIMARY KEY (businessIdentifier, businessIdentifierScheme, REV) ); CREATE TABLE smp_service_metadata_AUD ( @@ -43,16 +43,16 @@ CREATE TABLE smp_service_metadata_AUD ( documentIdentifierScheme, businessIdentifier, businessIdentifierScheme, - documentIdentifier) + documentIdentifier, REV) ); - + CREATE TABLE smp_user_AUD ( username VARCHAR(256), password VARCHAR(256), isadmin NUMBER(1) DEFAULT 0, REV INTEGER NOT NULL, REVTYPE NUMBER(3), - CONSTRAINT PK_SMP_USER_AUD PRIMARY KEY (username) + CONSTRAINT PK_SMP_USER_AUD PRIMARY KEY (username, REV) ); CREATE TABLE smp_ownership_AUD ( @@ -61,7 +61,7 @@ CREATE TABLE smp_ownership_AUD ( businessIdentifierScheme VARCHAR(100), REV INTEGER NOT NULL, REVTYPE NUMBER(3), - CONSTRAINT PK_OWNERSHIP_AUD PRIMARY KEY (username, businessIdentifier, businessIdentifierScheme) + CONSTRAINT PK_OWNERSHIP_AUD PRIMARY KEY (username, businessIdentifier, businessIdentifierScheme, REV) ); diff --git a/smp-webapp/src/main/smp-setup/database-scripts/oracle10g-4.1.0.ddl b/smp-webapp/src/main/smp-setup/database-scripts/oracle10g-4.1.0.ddl index cd8bc7fd3..2bef81b21 100644 --- a/smp-webapp/src/main/smp-setup/database-scripts/oracle10g-4.1.0.ddl +++ b/smp-webapp/src/main/smp-setup/database-scripts/oracle10g-4.1.0.ddl @@ -131,7 +131,7 @@ CREATE TABLE smp_ownership_AUD ( CREATE TABLE SMP_REV_INFO ( - ID NUMBER(38, 0) NOT NULL, + ID NUMBER(38, 0) NOT NULL, TIMESTAMP NUMBER(38, 0), REVISION_DATE TIMESTAMP, username VARCHAR2(255), diff --git a/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/error/ErrorMappingControllerAdviceTest.java b/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/error/ErrorMappingControllerAdviceTest.java new file mode 100644 index 000000000..b83673e7a --- /dev/null +++ b/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/error/ErrorMappingControllerAdviceTest.java @@ -0,0 +1,123 @@ +package eu.europa.ec.edelivery.smp.error; + +import ec.services.smp._1.ErrorResponse; +import eu.europa.ec.edelivery.smp.error.exceptions.BadRequestException; +import eu.europa.ec.edelivery.smp.exceptions.NotFoundException; +import eu.europa.ec.edelivery.smp.exceptions.UnknownUserException; +import eu.europa.ec.edelivery.smp.exceptions.WrongInputFieldException; +import eu.europa.ec.edelivery.smp.exceptions.XmlParsingException; +import eu.europa.ec.smp.api.exceptions.MalformedIdentifierException; +import eu.europa.ec.smp.api.exceptions.XmlInvalidAgainstSchemaException; +import org.junit.Test; +import org.springframework.http.ResponseEntity; +import org.springframework.security.access.AccessDeniedException; +import org.springframework.security.core.AuthenticationException; + +import static org.junit.Assert.*; +import static org.springframework.http.HttpStatus.*; + +public class ErrorMappingControllerAdviceTest { + + ErrorMappingControllerAdvice testIntance = new ErrorMappingControllerAdvice(); + + @Test + public void handleRuntimeException() { + ResponseEntity re = testIntance.handleRuntimeException(new RuntimeException("RuntimeExceptionMessage")); + + assertEquals(INTERNAL_SERVER_ERROR, re.getStatusCode()); + assertEquals(ErrorBusinessCode.TECHNICAL, ((ErrorResponse)re.getBody()).getBusinessCode()); + + + } + + @Test + public void handleBadRequestException() { + + ResponseEntity re = testIntance.handleBadRequestException(new BadRequestException(ErrorBusinessCode.WRONG_FIELD, "BadRequestExceptionMessage")); + + assertEquals(BAD_REQUEST, re.getStatusCode()); + assertEquals(ErrorBusinessCode.WRONG_FIELD, ((ErrorResponse)re.getBody()).getBusinessCode()); + } + + + @Test + public void handleMalformedIdentifierException() { + ResponseEntity re = testIntance.handleMalformedIdentifierException(new MalformedIdentifierException("MalformedIdentifierExceptionMessage", null)); + + assertEquals(BAD_REQUEST, re.getStatusCode()); + assertEquals(ErrorBusinessCode.FORMAT_ERROR, ((ErrorResponse)re.getBody()).getBusinessCode()); + } + + @Test + public void handleWrongInputFieldException() { + + ResponseEntity re = testIntance.handleWrongInputFieldException(new WrongInputFieldException("WrongInputFieldExceptionMessage")); + + assertEquals(BAD_REQUEST, re.getStatusCode()); + assertEquals(ErrorBusinessCode.WRONG_FIELD, ((ErrorResponse)re.getBody()).getBusinessCode()); + } + + @Test + public void handleNotFoundException() { + ResponseEntity re = testIntance.handleNotFoundException(new NotFoundException("NotFoundExceptionMessage")); + + assertEquals(NOT_FOUND, re.getStatusCode()); + assertEquals(ErrorBusinessCode.NOT_FOUND, ((ErrorResponse)re.getBody()).getBusinessCode()); + } + + @Test + public void handleAuthenticationException() { + + ResponseEntity re = testIntance.handleAuthenticationException(new AuthenticationException("AuthenticationException") { + @Override + public String getMessage() { + return super.getMessage(); + } + }); + + assertEquals(UNAUTHORIZED, re.getStatusCode()); + assertEquals(ErrorBusinessCode.UNAUTHORIZED, ((ErrorResponse)re.getBody()).getBusinessCode()); + } + + @Test + public void handleAccessDeniedException() { + ResponseEntity re = testIntance.handleAccessDeniedException(new AccessDeniedException("AccessDeniedExceptionMessage")); + + assertEquals(UNAUTHORIZED, re.getStatusCode()); + assertEquals(ErrorBusinessCode.UNAUTHORIZED, ((ErrorResponse)re.getBody()).getBusinessCode()); + } + + @Test + public void handleUnknownUserException() { + ResponseEntity re = testIntance.handleUnknownUserException(new UnknownUserException("UnknownUserExceptionMessage")); + + assertEquals(BAD_REQUEST, re.getStatusCode()); + assertEquals(ErrorBusinessCode.USER_NOT_FOUND, ((ErrorResponse)re.getBody()).getBusinessCode()); + } + + @Test + public void handleInvalidOwnerException() { + ResponseEntity re = testIntance.handleUnknownUserException(new UnknownUserException("UnknownUserExceptionMessage")); + + assertEquals(BAD_REQUEST, re.getStatusCode()); + assertEquals(ErrorBusinessCode.UNAUTHORIZED, ((ErrorResponse)re.getBody()).getBusinessCode()); + } + + @Test + public void handleXmlParsingException() { + + ResponseEntity re = testIntance.handleXmlParsingException(new XmlParsingException(null)); + + assertEquals(BAD_REQUEST, re.getStatusCode()); + assertEquals(ErrorBusinessCode.XSD_INVALID, ((ErrorResponse)re.getBody()).getBusinessCode()); + } + + @Test + public void handleXmlInvalidAgainstSchemaException() { + ResponseEntity re = testIntance.handleXmlInvalidAgainstSchemaException( + new XmlInvalidAgainstSchemaException("XmlInvalidAgainstSchemaExceptionMessage", null)); + + assertEquals(BAD_REQUEST, re.getStatusCode()); + assertEquals(ErrorBusinessCode.XSD_INVALID, ((ErrorResponse)re.getBody()).getBusinessCode()); + } +} \ No newline at end of file -- GitLab