From 104d5ed60e88b67df08d00126722592df314794d Mon Sep 17 00:00:00 2001 From: Holger Hagen <19706592+holgerhagen@users.noreply.github.com> Date: Tue, 26 Jun 2018 16:59:24 +0200 Subject: [PATCH] TSK-597: fixed validation of parent id and key for classifications during creation. --- .../pro/taskana/ClassificationService.java | 4 +- .../impl/ClassificationServiceImpl.java | 36 ++++++++++--- .../CreateClassificationAccTest.java | 31 ++++++----- .../impl/ClassificationServiceImplTest.java | 20 ++++---- ...ificationServiceImplIntAutoCommitTest.java | 22 ++++---- ...ssificationServiceImplIntExplicitTest.java | 12 ++--- .../TaskServiceImplIntExplicitTest.java | 4 +- .../rest/ClassificationControllerIntTest.java | 51 +++++++++++++++++++ .../rest/resource/ClassificationResource.java | 2 +- 9 files changed, 126 insertions(+), 56 deletions(-) diff --git a/lib/taskana-core/src/main/java/pro/taskana/ClassificationService.java b/lib/taskana-core/src/main/java/pro/taskana/ClassificationService.java index 59ec61d8b..8e66b54e6 100644 --- a/lib/taskana-core/src/main/java/pro/taskana/ClassificationService.java +++ b/lib/taskana-core/src/main/java/pro/taskana/ClassificationService.java @@ -82,15 +82,13 @@ public interface ClassificationService { * when the classification does already exists at the given domain. * @throws NotAuthorizedException * if the current user is not member of role BUSINESS_ADMIN or ADMIN - * @throws ClassificationNotFoundException - * if the current parentId is not NULL/EMPTY and can not be found. * @throws DomainNotFoundException * if the domain does not exist in the configuration * @throws InvalidArgumentException * if the ServiceLevel property does not comply with the ISO 8601 specification */ Classification createClassification(Classification classification) - throws ClassificationAlreadyExistException, NotAuthorizedException, ClassificationNotFoundException, + throws ClassificationAlreadyExistException, NotAuthorizedException, DomainNotFoundException, InvalidArgumentException; /** diff --git a/lib/taskana-core/src/main/java/pro/taskana/impl/ClassificationServiceImpl.java b/lib/taskana-core/src/main/java/pro/taskana/impl/ClassificationServiceImpl.java index 6cdd7772f..c16a9e3ca 100644 --- a/lib/taskana-core/src/main/java/pro/taskana/impl/ClassificationServiceImpl.java +++ b/lib/taskana-core/src/main/java/pro/taskana/impl/ClassificationServiceImpl.java @@ -54,7 +54,7 @@ public class ClassificationServiceImpl implements ClassificationService { @Override public Classification createClassification(Classification classification) - throws ClassificationAlreadyExistException, NotAuthorizedException, ClassificationNotFoundException, + throws ClassificationAlreadyExistException, NotAuthorizedException, DomainNotFoundException, InvalidArgumentException { LOGGER.debug("entry to createClassification(classification = {})", classification); taskanaEngine.checkRoleMembership(TaskanaRole.BUSINESS_ADMIN, TaskanaRole.ADMIN); @@ -76,12 +76,8 @@ public class ClassificationServiceImpl implements ClassificationService { classificationImpl.setModified(classificationImpl.getCreated()); this.initDefaultClassificationValues(classificationImpl); - if (classificationImpl.getParentId() != null && !classificationImpl.getParentId().isEmpty()) { - this.getClassification(classificationImpl.getParentId()); - } - if (classificationImpl.getParentKey() != null && !classificationImpl.getParentKey().isEmpty()) { - this.getClassification(classificationImpl.getParentKey(), classificationImpl.getDomain()); - } + validateAndPopulateParentInformation(classificationImpl); + classificationMapper.insert(classificationImpl); LOGGER.debug("Method createClassification created classification {}.", classificationImpl); @@ -95,6 +91,32 @@ public class ClassificationServiceImpl implements ClassificationService { return classificationImpl; } + private void validateAndPopulateParentInformation(ClassificationImpl classificationImpl) + throws InvalidArgumentException { + try { + + if (classificationImpl.getParentId() != null && !classificationImpl.getParentId().isEmpty()) { + Classification parentClassification = this.getClassification(classificationImpl.getParentId()); + if (classificationImpl.getParentKey() != null && !classificationImpl.getParentKey().isEmpty()) { + if (!classificationImpl.getParentKey().equals(parentClassification.getKey())) { + throw new InvalidArgumentException( + "Given parent key of classification does not match key of parent id."); + } + classificationImpl.setParentKey(parentClassification.getKey()); + } + } + + if (classificationImpl.getParentKey() != null && !classificationImpl.getParentKey().isEmpty()) { + Classification parentClassification = this.getClassification(classificationImpl.getParentKey(), + classificationImpl.getDomain()); + classificationImpl.setParentId(parentClassification.getId()); + } + + } catch (ClassificationNotFoundException e) { + throw new InvalidArgumentException("Parent classification could not be found.", e); + } + } + private void checkClassificationId(ClassificationImpl classificationImpl) throws InvalidArgumentException { if (classificationImpl.getId() != null && !"".equals(classificationImpl.getId())) { throw new InvalidArgumentException("ClassificationId should be null on creation"); diff --git a/lib/taskana-core/src/test/java/acceptance/classification/CreateClassificationAccTest.java b/lib/taskana-core/src/test/java/acceptance/classification/CreateClassificationAccTest.java index 34360fc18..80686868c 100644 --- a/lib/taskana-core/src/test/java/acceptance/classification/CreateClassificationAccTest.java +++ b/lib/taskana-core/src/test/java/acceptance/classification/CreateClassificationAccTest.java @@ -101,8 +101,7 @@ public class CreateClassificationAccTest extends AbstractAccTest { groupNames = {"group_1", "businessadmin"}) @Test public void testCreateClassificationWithInvalidValues() - throws ClassificationAlreadyExistException, NotAuthorizedException, ClassificationNotFoundException, - DomainNotFoundException { + throws ClassificationAlreadyExistException, NotAuthorizedException, DomainNotFoundException { long amountOfClassificationsBefore = classificationService.createClassificationQuery().count(); // Check key NULL @@ -128,8 +127,8 @@ public class CreateClassificationAccTest extends AbstractAccTest { groupNames = {"group_1", "businessadmin"}) @Test(expected = ClassificationAlreadyExistException.class) public void testCreateClassificationAlreadyExisting() - throws ClassificationAlreadyExistException, NotAuthorizedException, ClassificationNotFoundException, - DomainNotFoundException, InvalidArgumentException { + throws ClassificationAlreadyExistException, NotAuthorizedException, DomainNotFoundException, + InvalidArgumentException { Classification classification = classificationService.newClassification("Key3", "", "TASK"); classification = classificationService.createClassification(classification); classification = classificationService.createClassification(classification); @@ -140,8 +139,8 @@ public class CreateClassificationAccTest extends AbstractAccTest { groupNames = {"group_1", "businessadmin"}) @Test(expected = DomainNotFoundException.class) public void testCreateClassificationInUnknownDomain() - throws ClassificationAlreadyExistException, NotAuthorizedException, ClassificationNotFoundException, - DomainNotFoundException, InvalidArgumentException { + throws ClassificationAlreadyExistException, NotAuthorizedException, DomainNotFoundException, + InvalidArgumentException { Classification classification = classificationService.newClassification("Key3", "UNKNOWN_DOMAIN", "TASK"); classification = classificationService.createClassification(classification); } @@ -151,8 +150,8 @@ public class CreateClassificationAccTest extends AbstractAccTest { groupNames = {"group_1", "businessadmin"}) @Test(expected = InvalidArgumentException.class) public void testCreateClassificationOfUnknownType() - throws ClassificationAlreadyExistException, NotAuthorizedException, ClassificationNotFoundException, - DomainNotFoundException, InvalidArgumentException { + throws ClassificationAlreadyExistException, NotAuthorizedException, DomainNotFoundException, + InvalidArgumentException { Classification classification = classificationService.newClassification("Key3", "DOMAIN_A", "UNKNOWN_TYPE"); classification = classificationService.createClassification(classification); } @@ -162,8 +161,8 @@ public class CreateClassificationAccTest extends AbstractAccTest { groupNames = {"group_1", "businessadmin"}) @Test(expected = InvalidArgumentException.class) public void testCreateClassificationOfUnknownCategory() - throws ClassificationAlreadyExistException, NotAuthorizedException, ClassificationNotFoundException, - DomainNotFoundException, InvalidArgumentException { + throws ClassificationAlreadyExistException, NotAuthorizedException, DomainNotFoundException, + InvalidArgumentException { Classification classification = classificationService.newClassification("Key4", "DOMAIN_A", "TASK"); classification.setCategory("UNKNOWN_CATEGORY"); classification = classificationService.createClassification(classification); @@ -172,10 +171,10 @@ public class CreateClassificationAccTest extends AbstractAccTest { @WithAccessId( userName = "teamlead_1", groupNames = {"group_1", "businessadmin"}) - @Test(expected = ClassificationNotFoundException.class) + @Test(expected = InvalidArgumentException.class) public void testCreateClassificationWithInvalidParentId() - throws ClassificationAlreadyExistException, NotAuthorizedException, ClassificationNotFoundException, - DomainNotFoundException, InvalidArgumentException { + throws ClassificationAlreadyExistException, NotAuthorizedException, DomainNotFoundException, + InvalidArgumentException { Classification classification = classificationService.newClassification("Key5", "", "TASK"); classification.setParentId("ID WHICH CANT BE FOUND"); classification = classificationService.createClassification(classification); @@ -184,10 +183,10 @@ public class CreateClassificationAccTest extends AbstractAccTest { @WithAccessId( userName = "teamlead_1", groupNames = {"group_1", "businessadmin"}) - @Test(expected = ClassificationNotFoundException.class) + @Test(expected = InvalidArgumentException.class) public void testCreateClassificationWithInvalidParentKey() - throws ClassificationAlreadyExistException, NotAuthorizedException, ClassificationNotFoundException, - DomainNotFoundException, InvalidArgumentException { + throws ClassificationAlreadyExistException, NotAuthorizedException, DomainNotFoundException, + InvalidArgumentException { Classification classification = classificationService.newClassification("Key5", "", "TASK"); classification.setParentKey("KEY WHICH CANT BE FOUND"); classification = classificationService.createClassification(classification); diff --git a/lib/taskana-core/src/test/java/pro/taskana/impl/ClassificationServiceImplTest.java b/lib/taskana-core/src/test/java/pro/taskana/impl/ClassificationServiceImplTest.java index e072f3619..ab40431a4 100644 --- a/lib/taskana-core/src/test/java/pro/taskana/impl/ClassificationServiceImplTest.java +++ b/lib/taskana-core/src/test/java/pro/taskana/impl/ClassificationServiceImplTest.java @@ -63,7 +63,7 @@ public class ClassificationServiceImplTest { @Test(expected = ClassificationAlreadyExistException.class) public void testCreateClassificationAlreadyExisting() - throws ClassificationAlreadyExistException, ClassificationNotFoundException, NotAuthorizedException, + throws ClassificationAlreadyExistException, NotAuthorizedException, DomainNotFoundException, InvalidArgumentException { Classification classification = createDummyClassification(); doReturn(classification).when(classificationMapperMock).findByKeyAndDomain(classification.getKey(), @@ -84,7 +84,7 @@ public class ClassificationServiceImplTest { } } - @Test(expected = ClassificationNotFoundException.class) + @Test(expected = InvalidArgumentException.class) public void testCreateClassificationParentIdNotExisting() throws ClassificationAlreadyExistException, ClassificationNotFoundException, NotAuthorizedException, DomainNotFoundException, InvalidArgumentException { @@ -97,7 +97,7 @@ public class ClassificationServiceImplTest { try { cutSpy.createClassification(classification); - } catch (ClassificationNotFoundException e) { + } catch (InvalidArgumentException e) { verify(taskanaEngineImplMock, times(1)).checkRoleMembership(any()); verify(taskanaEngineImplMock, times(2)).openConnection(); verify(classificationMapperMock, times(1)).findByKeyAndDomain(classification.getKey(), @@ -111,7 +111,7 @@ public class ClassificationServiceImplTest { } } - @Test(expected = ClassificationNotFoundException.class) + @Test(expected = InvalidArgumentException.class) public void testCreateClassificationParentKeyNotExisting() throws ClassificationAlreadyExistException, ClassificationNotFoundException, NotAuthorizedException, DomainNotFoundException, InvalidArgumentException { @@ -125,7 +125,7 @@ public class ClassificationServiceImplTest { try { cutSpy.createClassification(classification); - } catch (ClassificationNotFoundException e) { + } catch (InvalidArgumentException e) { verify(taskanaEngineImplMock, times(1)).checkRoleMembership(any()); verify(taskanaEngineImplMock, times(2)).openConnection(); verify(classificationMapperMock, times(1)).findByKeyAndDomain(classification.getKey(), @@ -143,7 +143,7 @@ public class ClassificationServiceImplTest { @Test public void testCreateClassificationInOwnDomainButExistingInRoot() - throws ClassificationAlreadyExistException, ClassificationNotFoundException, InterruptedException, + throws ClassificationAlreadyExistException, InterruptedException, NotAuthorizedException, DomainNotFoundException, InvalidArgumentException { Instant beforeTimestamp = Instant.now(); Thread.sleep(10L); @@ -176,8 +176,8 @@ public class ClassificationServiceImplTest { @Test public void testCreateClassificationInOwnDomainAndCopyInRootDomain() - throws ClassificationAlreadyExistException, NotAuthorizedException, ClassificationNotFoundException, - DomainNotFoundException, InvalidArgumentException { + throws ClassificationAlreadyExistException, NotAuthorizedException, DomainNotFoundException, + InvalidArgumentException { Classification classification = createDummyClassification(""); String domain = classification.getDomain(); String key = classification.getKey(); @@ -203,7 +203,7 @@ public class ClassificationServiceImplTest { @Test public void testCreateClassificationIntoRootDomain() - throws ClassificationAlreadyExistException, NotAuthorizedException, ClassificationNotFoundException, + throws ClassificationAlreadyExistException, NotAuthorizedException, DomainNotFoundException, InvalidArgumentException { ClassificationImpl classification = (ClassificationImpl) createDummyClassification(null); classification.setDomain(""); @@ -364,7 +364,7 @@ public class ClassificationServiceImplTest { @Test(expected = InvalidArgumentException.class) public void testThrowExceptionIdIfClassificationIsCreatedWithAnExplicitId() - throws ClassificationNotFoundException, DomainNotFoundException, InvalidArgumentException, + throws DomainNotFoundException, InvalidArgumentException, NotAuthorizedException, ClassificationAlreadyExistException { try { Classification classification = createDummyClassification(); diff --git a/lib/taskana-core/src/test/java/pro/taskana/impl/integration/ClassificationServiceImplIntAutoCommitTest.java b/lib/taskana-core/src/test/java/pro/taskana/impl/integration/ClassificationServiceImplIntAutoCommitTest.java index 73f99a0dd..bcb49ba69 100644 --- a/lib/taskana-core/src/test/java/pro/taskana/impl/integration/ClassificationServiceImplIntAutoCommitTest.java +++ b/lib/taskana-core/src/test/java/pro/taskana/impl/integration/ClassificationServiceImplIntAutoCommitTest.java @@ -153,8 +153,8 @@ public class ClassificationServiceImplIntAutoCommitTest { @Test public void testFindAllClassifications() - throws ClassificationAlreadyExistException, NotAuthorizedException, ClassificationNotFoundException, - DomainNotFoundException, InvalidArgumentException { + throws ClassificationAlreadyExistException, NotAuthorizedException, DomainNotFoundException, + InvalidArgumentException { Classification classification0 = this.createDummyClassificationWithUniqueKey("", "TASK"); classificationService.createClassification(classification0); Classification classification1 = this.createDummyClassificationWithUniqueKey("", "TASK"); @@ -183,8 +183,8 @@ public class ClassificationServiceImplIntAutoCommitTest { @Test public void testInsertAndClassificationMapper() - throws NotAuthorizedException, ClassificationAlreadyExistException, ClassificationNotFoundException, - InvalidArgumentException, DomainNotFoundException { + throws NotAuthorizedException, ClassificationAlreadyExistException, InvalidArgumentException, + DomainNotFoundException { Classification classification = this.createDummyClassificationWithUniqueKey("DOMAIN_A", "TASK"); classification = classificationService.createClassification(classification); @@ -221,8 +221,8 @@ public class ClassificationServiceImplIntAutoCommitTest { @Test public void testFindWithClassificationMapperDomainAndCategory() - throws ClassificationAlreadyExistException, NotAuthorizedException, ClassificationNotFoundException, - DomainNotFoundException, InvalidArgumentException { + throws ClassificationAlreadyExistException, NotAuthorizedException, DomainNotFoundException, + InvalidArgumentException { Classification classification1 = this.createDummyClassificationWithUniqueKey("DOMAIN_A", "TASK"); classification1.setCategory("EXTERNAL"); classificationService.createClassification(classification1); @@ -244,8 +244,8 @@ public class ClassificationServiceImplIntAutoCommitTest { @Test public void testFindWithClassificationMapperCustomAndCategory() - throws ClassificationAlreadyExistException, NotAuthorizedException, ClassificationNotFoundException, - DomainNotFoundException, InvalidArgumentException { + throws ClassificationAlreadyExistException, NotAuthorizedException, DomainNotFoundException, + InvalidArgumentException { Classification classification1 = this.createDummyClassificationWithUniqueKey("", "TASK"); classification1.setDescription("DESC1"); classification1.setCategory("EXTERNAL"); @@ -283,7 +283,7 @@ public class ClassificationServiceImplIntAutoCommitTest { @Test public void testFindWithClassificationMapperPriorityTypeAndParent() throws ClassificationAlreadyExistException, NumberFormatException, NotAuthorizedException, - ClassificationNotFoundException, DomainNotFoundException, InvalidArgumentException { + DomainNotFoundException, InvalidArgumentException { Classification classification = this.createDummyClassificationWithUniqueKey("", "TASK"); classification.setPriority(Integer.decode("5")); classificationService.createClassification(classification); @@ -317,8 +317,8 @@ public class ClassificationServiceImplIntAutoCommitTest { @Test public void testFindWithClassificationMapperServiceLevelNameAndDescription() - throws ClassificationAlreadyExistException, NotAuthorizedException, ClassificationNotFoundException, - DomainNotFoundException, InvalidArgumentException { + throws ClassificationAlreadyExistException, NotAuthorizedException, DomainNotFoundException, + InvalidArgumentException { int all = 0; Classification classification = this.createDummyClassificationWithUniqueKey("", "TASK"); classification.setServiceLevel("P1D"); diff --git a/lib/taskana-core/src/test/java/pro/taskana/impl/integration/ClassificationServiceImplIntExplicitTest.java b/lib/taskana-core/src/test/java/pro/taskana/impl/integration/ClassificationServiceImplIntExplicitTest.java index e75846a1e..ddbb36da5 100644 --- a/lib/taskana-core/src/test/java/pro/taskana/impl/integration/ClassificationServiceImplIntExplicitTest.java +++ b/lib/taskana-core/src/test/java/pro/taskana/impl/integration/ClassificationServiceImplIntExplicitTest.java @@ -166,7 +166,7 @@ public class ClassificationServiceImplIntExplicitTest { @Test public void testFindAllClassifications() throws SQLException, ClassificationAlreadyExistException, NotAuthorizedException, - ClassificationNotFoundException, DomainNotFoundException, InvalidArgumentException { + DomainNotFoundException, InvalidArgumentException { Connection connection = dataSource.getConnection(); taskanaEngineImpl.setConnection(connection); Classification classification0 = this.createNewClassificationWithUniqueKey("", "TASK"); @@ -204,7 +204,7 @@ public class ClassificationServiceImplIntExplicitTest { @Test public void testInsertAndClassificationQuery() throws SQLException, ClassificationAlreadyExistException, NotAuthorizedException, - ClassificationNotFoundException, DomainNotFoundException, InvalidArgumentException { + DomainNotFoundException, InvalidArgumentException { Connection connection = dataSource.getConnection(); taskanaEngineImpl.setConnection(connection); Classification classification = this.createNewClassificationWithUniqueKey("DOMAIN_A", "TASK"); @@ -249,7 +249,7 @@ public class ClassificationServiceImplIntExplicitTest { @Test public void testFindWithClassificationMapperDomainAndCategory() throws SQLException, ClassificationAlreadyExistException, NotAuthorizedException, - ClassificationNotFoundException, DomainNotFoundException, InvalidArgumentException { + DomainNotFoundException, InvalidArgumentException { Connection connection = dataSource.getConnection(); taskanaEngineImpl.setConnection(connection); Classification classification1 = this.createNewClassificationWithUniqueKey("DOMAIN_A", "TASK"); @@ -276,7 +276,7 @@ public class ClassificationServiceImplIntExplicitTest { @Test public void testFindWithClassificationMapperCustomAndCategory() throws SQLException, ClassificationAlreadyExistException, NotAuthorizedException, - ClassificationNotFoundException, DomainNotFoundException, InvalidArgumentException { + DomainNotFoundException, InvalidArgumentException { Connection connection = dataSource.getConnection(); taskanaEngineImpl.setConnection(connection); Classification classification1 = this.createNewClassificationWithUniqueKey("", "TASK"); @@ -317,7 +317,7 @@ public class ClassificationServiceImplIntExplicitTest { @Test public void testFindWithClassificationMapperPriorityTypeAndParent() throws SQLException, ClassificationAlreadyExistException, NotAuthorizedException, - ClassificationNotFoundException, DomainNotFoundException, InvalidArgumentException { + DomainNotFoundException, InvalidArgumentException { Connection connection = dataSource.getConnection(); taskanaEngineImpl.setConnection(connection); Classification classification = this.createNewClassificationWithUniqueKey("", "TASK"); @@ -354,7 +354,7 @@ public class ClassificationServiceImplIntExplicitTest { @Test public void testFindWithClassificationMapperServiceLevelNameAndDescription() throws NotAuthorizedException, SQLException, ClassificationAlreadyExistException, - ClassificationNotFoundException, DomainNotFoundException, InvalidArgumentException { + DomainNotFoundException, InvalidArgumentException { Connection connection = dataSource.getConnection(); taskanaEngineImpl.setConnection(connection); int all = 0; diff --git a/lib/taskana-core/src/test/java/pro/taskana/impl/integration/TaskServiceImplIntExplicitTest.java b/lib/taskana-core/src/test/java/pro/taskana/impl/integration/TaskServiceImplIntExplicitTest.java index 871721627..05156015d 100644 --- a/lib/taskana-core/src/test/java/pro/taskana/impl/integration/TaskServiceImplIntExplicitTest.java +++ b/lib/taskana-core/src/test/java/pro/taskana/impl/integration/TaskServiceImplIntExplicitTest.java @@ -459,8 +459,8 @@ public class TaskServiceImplIntExplicitTest { } } - private Task generateDummyTask() throws ClassificationAlreadyExistException, ClassificationNotFoundException, - InvalidWorkbasketException, NotAuthorizedException, + private Task generateDummyTask() + throws ClassificationAlreadyExistException, InvalidWorkbasketException, NotAuthorizedException, WorkbasketAlreadyExistException, DomainNotFoundException, InvalidArgumentException { WorkbasketImpl workbasket = (WorkbasketImpl) workbasketService.newWorkbasket("wb", "DOMAIN_A"); workbasket.setName("wb"); diff --git a/rest/taskana-rest-spring-example/src/test/java/pro/taskana/rest/ClassificationControllerIntTest.java b/rest/taskana-rest-spring-example/src/test/java/pro/taskana/rest/ClassificationControllerIntTest.java index bc1106cbb..1936f66fb 100644 --- a/rest/taskana-rest-spring-example/src/test/java/pro/taskana/rest/ClassificationControllerIntTest.java +++ b/rest/taskana-rest-spring-example/src/test/java/pro/taskana/rest/ClassificationControllerIntTest.java @@ -183,6 +183,57 @@ public class ClassificationControllerIntTest { con.disconnect(); } + @Test + public void testCreateClassificationWithParentId() throws IOException { + String newClassification = "{\"classificationId\":\"\",\"category\":\"MANUAL\",\"domain\":\"DOMAIN_B\",\"key\":\"NEW_CLASS_P1\",\"name\":\"new classification\",\"type\":\"TASK\",\"parentId\":\"CLI:200000000000000000000000000000000015\"}"; + URL url = new URL(server + port + "/v1/classifications"); + HttpURLConnection con = (HttpURLConnection) url.openConnection(); + con.setRequestMethod("POST"); + con.setRequestProperty("Authorization", "Basic dGVhbWxlYWRfMTp0ZWFtbGVhZF8x"); + con.setDoOutput(true); + con.setRequestProperty("Content-Type", "application/json"); + BufferedWriter out = new BufferedWriter(new OutputStreamWriter(con.getOutputStream())); + out.write(newClassification); + out.flush(); + out.close(); + assertEquals(201, con.getResponseCode()); + con.disconnect(); + } + + @Test + public void testCreateClassificationWithParentKey() throws IOException { + String newClassification = "{\"classificationId\":\"\",\"category\":\"MANUAL\",\"domain\":\"DOMAIN_B\",\"key\":\"NEW_CLASS_P2\",\"name\":\"new classification\",\"type\":\"TASK\",\"parentKey\":\"T2100\"}"; + URL url = new URL(server + port + "/v1/classifications"); + HttpURLConnection con = (HttpURLConnection) url.openConnection(); + con.setRequestMethod("POST"); + con.setRequestProperty("Authorization", "Basic dGVhbWxlYWRfMTp0ZWFtbGVhZF8x"); + con.setDoOutput(true); + con.setRequestProperty("Content-Type", "application/json"); + BufferedWriter out = new BufferedWriter(new OutputStreamWriter(con.getOutputStream())); + out.write(newClassification); + out.flush(); + out.close(); + assertEquals(201, con.getResponseCode()); + con.disconnect(); + } + + @Test + public void testReturn400IfCreateClassificationWithIncompatibleParentIdAndKey() throws IOException { + String newClassification = "{\"classificationId\":\"\",\"category\":\"MANUAL\",\"domain\":\"DOMAIN_B\",\"key\":\"NEW_CLASS_P3\",\"name\":\"new classification\",\"type\":\"TASK\",\"parentId\":\"CLI:200000000000000000000000000000000015\",\"parentKey\":\"T2000\"}"; + URL url = new URL(server + port + "/v1/classifications"); + HttpURLConnection con = (HttpURLConnection) url.openConnection(); + con.setRequestMethod("POST"); + con.setRequestProperty("Authorization", "Basic dGVhbWxlYWRfMTp0ZWFtbGVhZF8x"); + con.setDoOutput(true); + con.setRequestProperty("Content-Type", "application/json"); + BufferedWriter out = new BufferedWriter(new OutputStreamWriter(con.getOutputStream())); + out.write(newClassification); + out.flush(); + out.close(); + assertEquals(400, con.getResponseCode()); + con.disconnect(); + } + @Test public void testCreateClassificationWithClassificationIdReturnsError400() throws IOException { String newClassification = "{\"classificationId\":\"someId\",\"category\":\"MANUAL\",\"domain\":\"DOMAIN_A\",\"key\":\"NEW_CLASS\",\"name\":\"new classification\",\"type\":\"TASK\"}"; diff --git a/rest/taskana-rest-spring/src/main/java/pro/taskana/rest/resource/ClassificationResource.java b/rest/taskana-rest-spring/src/main/java/pro/taskana/rest/resource/ClassificationResource.java index 30e46e7a3..0ad8ec942 100644 --- a/rest/taskana-rest-spring/src/main/java/pro/taskana/rest/resource/ClassificationResource.java +++ b/rest/taskana-rest-spring/src/main/java/pro/taskana/rest/resource/ClassificationResource.java @@ -60,7 +60,7 @@ public class ClassificationResource extends ResourceSupport { } public String getParentKey() { - return parentId; + return parentKey; } public void setParentKey(String parentKey) {