From 80aca74e4d02d5122abd368e9b5daf095eb47e39 Mon Sep 17 00:00:00 2001 From: Damien <damien.burel@maarch.org> Date: Thu, 12 Nov 2020 18:08:55 +0100 Subject: [PATCH] FEAT #14564 TIME 4:00 Workflow templates --- phpunit.xml | 1 + rest/index.php | 10 +- sql/2010.sql | 23 +++ sql/data_fr.sql | 11 +- sql/structure.sql | 23 +++ .../WorkflowTemplateController.php | 166 ++++++++++++++++++ .../models/WorkflowTemplateItemModel.php | 85 +++++++++ .../workflow/models/WorkflowTemplateModel.php | 121 +++++++++++++ .../WorkflowTemplateControllerTest.php | 132 ++++++++++++++ 9 files changed, 560 insertions(+), 12 deletions(-) create mode 100755 src/app/workflow/controllers/WorkflowTemplateController.php create mode 100755 src/app/workflow/models/WorkflowTemplateItemModel.php create mode 100755 src/app/workflow/models/WorkflowTemplateModel.php create mode 100755 test/unitTests/app/workflow/WorkflowTemplateControllerTest.php diff --git a/phpunit.xml b/phpunit.xml index 7de1cc5483..57b17e85e0 100755 --- a/phpunit.xml +++ b/phpunit.xml @@ -8,6 +8,7 @@ <file>test/unitTests/app/configuration/ConfigurationControllerTest.php</file> <file>test/unitTests/app/document/DocumentControllerTest.php</file> <file>test/unitTests/app/group/GroupControllerTest.php</file> + <file>test/unitTests/app/workflow/WorkflowTemplateControllerTest.php</file> <file>test/unitTests/app/history/HistoryControllerTest.php</file> </testsuite> </testsuites> diff --git a/rest/index.php b/rest/index.php index adcbd248ad..18d4301dff 100755 --- a/rest/index.php +++ b/rest/index.php @@ -82,6 +82,9 @@ $app->put('/documents/{id}/actions/{actionId}', \Document\controllers\DocumentCo $app->get('/documents/{id}/workflow', \Workflow\controllers\WorkflowController::class . ':getByDocumentId'); $app->get('/documents/{id}/thumbnails/{page}', \Document\controllers\DocumentController::class . ':getThumbnailContent'); +//Emails +$app->post('/emails', \Email\controllers\EmailController::class . ':send'); + //Languages $app->get('/languages/{lang}', \SrcCore\controllers\LanguageController::class . ':getByLang'); @@ -122,7 +125,10 @@ $app->delete('/users/{id}/signatures/{signatureId}', \User\controllers\Signature $app->put('/users/{id}/externalSignatures', \User\controllers\SignatureController::class . ':updateExternalSignatures'); $app->patch('/users/{id}/signatures/{signatureId}/substituted', \User\controllers\SignatureController::class . ':updateSubstituted'); -//Emails -$app->post('/emails', \Email\controllers\EmailController::class . ':send'); +//WorkflowTemplates +$app->post('/workflowTemplates', \Workflow\controllers\WorkflowTemplateController::class . ':create'); +$app->get('/workflowTemplates', \Workflow\controllers\WorkflowTemplateController::class . ':get'); +$app->get('/workflowTemplates/{id}', \Workflow\controllers\WorkflowTemplateController::class . ':getById'); +$app->delete('/workflowTemplates/{id}', \Workflow\controllers\WorkflowTemplateController::class . ':delete'); $app->run(); diff --git a/sql/2010.sql b/sql/2010.sql index 967875e848..13af963e8c 100755 --- a/sql/2010.sql +++ b/sql/2010.sql @@ -10,3 +10,26 @@ ALTER TABLE main_documents DROP COLUMN IF EXISTS status; ALTER TABLE main_documents ADD COLUMN status varchar(10); UPDATE main_documents SET status = 'READY'; + +DROP TABLE IF EXISTS workflow_templates; +CREATE TABLE workflow_templates +( + id SERIAL NOT NULL, + title text NOT NULL, + owner INTEGER NOT NULL, + CONSTRAINT workflow_templates_pkey PRIMARY KEY (id) +) +WITH (OIDS=FALSE); + +DROP TABLE IF EXISTS workflow_templates_items; +CREATE TABLE workflow_templates_items +( + id SERIAL NOT NULL, + workflow_template_id INTEGER NOT NULL, + user_id INTEGER NOT NULL, + mode CHARACTER VARYING(64) NOT NULL, + signature_mode CHARACTER VARYING(64) NOT NULL, + sequence INTEGER NOT NULL, + CONSTRAINT workflow_templates_items_pkey PRIMARY KEY (id) +) +WITH (OIDS=FALSE); diff --git a/sql/data_fr.sql b/sql/data_fr.sql index 43bdca0dc6..5588bdcbbd 100755 --- a/sql/data_fr.sql +++ b/sql/data_fr.sql @@ -35,19 +35,10 @@ INSERT INTO groups_privileges (group_id, privilege) VALUES (1, 'manage_documents INSERT INTO groups_privileges (group_id, privilege) VALUES (1, 'manage_email_configuration'); INSERT INTO groups_privileges (group_id, privilege) VALUES (1, 'manage_connections'); INSERT INTO groups_privileges (group_id, privilege) VALUES (1, 'manage_groups'); +INSERT INTO groups_privileges (group_id, privilege) VALUES (1, 'indexation'); INSERT INTO groups_privileges (group_id, privilege) VALUES (2, 'manage_users'); INSERT INTO groups_privileges (group_id, privilege) VALUES (2, 'manage_documents'); INSERT INTO groups_privileges (group_id, privilege) VALUES (2, 'manage_groups'); -INSERT INTO groups_privileges (group_id, privilege) VALUES (3, 'manage_users'); -INSERT INTO groups_privileges (group_id, privilege) VALUES (3, 'manage_documents'); -INSERT INTO groups_privileges (group_id, privilege) VALUES (3, 'manage_email_configuration'); -INSERT INTO groups_privileges (group_id, privilege) VALUES (3, 'manage_connections'); -INSERT INTO groups_privileges (group_id, privilege) VALUES (3, 'manage_groups'); -INSERT INTO groups_privileges (group_id, privilege) VALUES (4, 'manage_users'); -INSERT INTO groups_privileges (group_id, privilege) VALUES (4, 'manage_documents'); -INSERT INTO groups_privileges (group_id, privilege) VALUES (4, 'manage_email_configuration'); -INSERT INTO groups_privileges (group_id, privilege) VALUES (4, 'manage_connections'); -INSERT INTO groups_privileges (group_id, privilege) VALUES (4, 'manage_groups'); TRUNCATE TABLE users_groups; diff --git a/sql/structure.sql b/sql/structure.sql index 3aab6d9a96..1544c5eca1 100755 --- a/sql/structure.sql +++ b/sql/structure.sql @@ -238,3 +238,26 @@ CREATE TABLE workflows CONSTRAINT workflow_pkey PRIMARY KEY (id) ) WITH (OIDS=FALSE); + +DROP TABLE IF EXISTS workflow_templates; +CREATE TABLE workflow_templates +( + id SERIAL NOT NULL, + title text NOT NULL, + owner INTEGER NOT NULL, + CONSTRAINT workflow_templates_pkey PRIMARY KEY (id) +) +WITH (OIDS=FALSE); + +DROP TABLE IF EXISTS workflow_templates_items; +CREATE TABLE workflow_templates_items +( + id SERIAL NOT NULL, + workflow_template_id INTEGER NOT NULL, + user_id INTEGER NOT NULL, + mode CHARACTER VARYING(64) NOT NULL, + signature_mode CHARACTER VARYING(64) NOT NULL, + sequence INTEGER NOT NULL, + CONSTRAINT workflow_templates_items_pkey PRIMARY KEY (id) +) +WITH (OIDS=FALSE); diff --git a/src/app/workflow/controllers/WorkflowTemplateController.php b/src/app/workflow/controllers/WorkflowTemplateController.php new file mode 100755 index 0000000000..057437313f --- /dev/null +++ b/src/app/workflow/controllers/WorkflowTemplateController.php @@ -0,0 +1,166 @@ +<?php + +/** + * Copyright Maarch since 2008 under licence GPLv3. + * See LICENCE.txt file at the root folder for more details. + * This file is part of Maarch software. + * + */ + +/** + * @brief Workflow Template Controller + * @author dev@maarch.org + */ + +namespace Workflow\controllers; + +use Group\controllers\PrivilegeController; +use History\controllers\HistoryController; +use Respect\Validation\Validator; +use Slim\Http\Request; +use Slim\Http\Response; +use SrcCore\models\ValidatorModel; +use User\models\UserModel; +use Workflow\models\WorkflowTemplateItemModel; +use Workflow\models\WorkflowTemplateModel; + +class WorkflowTemplateController +{ + public function get(Request $request, Response $response) + { + $workflowTemplates = WorkflowTemplateModel::get([ + 'select' => ['id', 'title'], + 'where' => ['owner = ?'], + 'data' => [$GLOBALS['id']] + ]); + + return $response->withJson(['workflowTemplates' => $workflowTemplates]); + } + + public function getById(Request $request, Response $response, array $args) + { + $workflowTemplate = WorkflowTemplateModel::getById(['id' => $args['id'], 'select' => ['title', 'owner']]); + if (empty($workflowTemplate)) { + return $response->withStatus(400)->withJson(['errors' => 'Workflow template does not exist']); + } + + if ($workflowTemplate['owner'] != $GLOBALS['id']) { + return $response->withStatus(403)->withJson(['errors' => 'Workflow template out of perimeter']); + } + + $rawWorkflowTemplatesUsers = WorkflowTemplateItemModel::get(['select' => ['*'], 'where' => ['workflow_template_id = ?'], 'data' => [$args['id']], 'orderBy' => ['sequence']]); + $workflowTemplatesUsers = []; + foreach ($rawWorkflowTemplatesUsers as $value) { + $user['substituteUser'] = UserModel::getLabelledUserById(['id' => $value['user_id']]); + + $workflowTemplatesUsers[] = [ + 'userId' => $value['user_id'], + 'userLabel' => UserModel::getLabelledUserById(['id' => $value['user_id']]), + 'mode' => $value['mode'], + 'signatureMode' => $value['signature_mode'], + 'sequence' => $value['sequence'] + ]; + } + + $workflowTemplate = [ + 'title' => $workflowTemplate['title'], + 'items' => $workflowTemplatesUsers + ]; + + return $response->withJson(['workflowTemplate' => $workflowTemplate]); + } + + public function create(Request $request, Response $response) + { + if (!PrivilegeController::hasPrivilege(['userId' => $GLOBALS['id'], 'privilege' => 'indexation'])) { + return $response->withStatus(403)->withJson(['errors' => 'Privilege forbidden']); + } + + $body = $request->getParsedBody(); + if (!Validator::stringType()->notEmpty()->validate($body['title'])) { + return $response->withStatus(400)->withJson(['errors' => 'Body title is empty or not a string']); + } elseif (!Validator::arrayType()->notEmpty()->validate($body['items'])) { + return $response->withStatus(400)->withJson(['errors' => 'Body items is empty or not an array']); + } + + $control = WorkflowTemplateController::controlItems(['items' => $body['items']]); + if (!empty($control['errors'])) { + return $response->withStatus(400)->withJson(['errors' => $control['errors']]); + } + + $workflowTemplateId = WorkflowTemplateModel::create([ + 'title' => $body['title'], + 'owner' => $GLOBALS['id'] + ]); + + foreach ($body['items'] as $key => $item) { + WorkflowTemplateItemModel::create([ + 'workflow_template_id' => $workflowTemplateId, + 'user_id' => $item['userId'], + 'mode' => $item['mode'], + 'signature_mode' => $item['signatureMode'], + 'sequence' => $key + ]); + } + + HistoryController::add([ + 'code' => 'OK', + 'objectType' => 'workflowTemplates', + 'objectId' => $workflowTemplateId, + 'type' => 'CREATION', + 'message' => "{workflowTemplateAdded} : {$body['title']}" + ]); + + return $response->withJson(['id' => $workflowTemplateId]); + } + + public function delete(Request $request, Response $response, array $args) + { + $workflowTemplate = WorkflowTemplateModel::getById(['id' => $args['id'], 'select' => ['owner', 'title']]); + if (empty($workflowTemplate)) { + return $response->withStatus(400)->withJson(['errors' => 'Workflow template does not exist']); + } elseif ($workflowTemplate['owner'] != $GLOBALS['id']) { + return $response->withStatus(403)->withJson(['errors' => 'Workflow template out of perimeter']); + } + + WorkflowTemplateModel::delete([ + 'where' => ['id = ?'], + 'data' => [$args['id']] + ]); + WorkflowTemplateItemModel::delete(['where' => ['workflow_template_id = ?'], 'data' => [$args['id']]]); + + HistoryController::add([ + 'code' => 'OK', + 'objectType' => 'workflowTemplates', + 'objectId' => $args['id'], + 'type' => 'SUPPRESSION', + 'message' => "{workflowTemplateDeleted} : {$workflowTemplate['title']}" + ]); + + return $response->withStatus(204); + } + + private static function controlItems(array $args) + { + ValidatorModel::notEmpty($args, ['items']); + ValidatorModel::arrayType($args, ['items']); + + //TODO check mode + signature mode + foreach ($args['items'] as $key => $item) { + if (empty($item['userId'])) { + return ['errors' => "Item[{$key}] userId is empty"]; + } elseif (empty($item['mode'])) { + return ['errors' => "Item[{$key}] mode is empty"]; + } elseif (empty($item['signatureMode'])) { + return ['errors' => "Item[{$key}] signatureMode is empty"]; + } + + $user = UserModel::getById(['id' => $item['userId'], 'select' => [1]]); + if (empty($user)) { + return ['errors' => 'User is not valid']; + } + } + + return true; + } +} diff --git a/src/app/workflow/models/WorkflowTemplateItemModel.php b/src/app/workflow/models/WorkflowTemplateItemModel.php new file mode 100755 index 0000000000..9eda7eddf3 --- /dev/null +++ b/src/app/workflow/models/WorkflowTemplateItemModel.php @@ -0,0 +1,85 @@ +<?php + +/** + * Copyright Maarch since 2008 under licence GPLv3. + * See LICENCE.txt file at the root folder for more details. + * This file is part of Maarch software. + * + */ + +/** + * @brief Workflow Template Item Model + * @author dev@maarch.org + */ + +namespace Workflow\models; + +use SrcCore\models\DatabaseModel; +use SrcCore\models\ValidatorModel; + +class WorkflowTemplateItemModel +{ + public static function get(array $args = []) + { + ValidatorModel::arrayType($args, ['select', 'where', 'data', 'orderBy']); + + $templatesUsers = DatabaseModel::select([ + 'select' => $args['select'] ?? [1], + 'table' => ['workflow_templates_items'], + 'where' => $args['where'] ?? [], + 'data' => $args['data'] ?? [], + 'order_by' => $args['orderBy'] ?? [] + ]); + + return $templatesUsers; + } + + public static function create(array $args) + { + ValidatorModel::notEmpty($args, ['workflow_template_id', 'user_id', 'mode', 'signature_mode']); + ValidatorModel::stringType($args, ['mode', 'signature_mode']); + ValidatorModel::intVal($args, ['workflow_template_id', 'user_id', 'sequence']); + + DatabaseModel::insert([ + 'table' => 'workflow_templates_items', + 'columnsValues' => [ + 'workflow_template_id' => $args['workflow_template_id'], + 'user_id' => $args['user_id'], + 'mode' => $args['mode'], + 'signature_mode' => $args['signature_mode'], + 'sequence' => $args['sequence'] + ] + ]); + + return true; + } + + public static function update(array $args) + { + ValidatorModel::notEmpty($args, ['set', 'where', 'data']); + ValidatorModel::arrayType($args, ['set', 'where', 'data']); + + DatabaseModel::update([ + 'table' => 'workflow_templates_items', + 'set' => $args['set'], + 'where' => $args['where'], + 'data' => $args['data'] + ]); + + return true; + } + + public static function delete(array $args) + { + ValidatorModel::notEmpty($args, ['where', 'data']); + ValidatorModel::arrayType($args, ['where', 'data']); + + DatabaseModel::delete([ + 'table' => 'workflow_templates_items', + 'where' => $args['where'], + 'data' => $args['data'] + ]); + + return true; + } +} diff --git a/src/app/workflow/models/WorkflowTemplateModel.php b/src/app/workflow/models/WorkflowTemplateModel.php new file mode 100755 index 0000000000..849cf3056b --- /dev/null +++ b/src/app/workflow/models/WorkflowTemplateModel.php @@ -0,0 +1,121 @@ +<?php + +/** + * Copyright Maarch since 2008 under licence GPLv3. + * See LICENCE.txt file at the root folder for more details. + * This file is part of Maarch software. + * + */ + +/** + * @brief Workflow Template Model + * @author dev@maarch.org + */ + +namespace Workflow\models; + +use SrcCore\models\DatabaseModel; +use SrcCore\models\ValidatorModel; + +class WorkflowTemplateModel +{ + public static function get(array $args = []) + { + ValidatorModel::arrayType($args, ['select', 'where', 'data', 'orderBy']); + + $workflowTemplates = DatabaseModel::select([ + 'select' => $args['select'] ?? [1], + 'table' => ['workflow_templates'], + 'where' => $args['where'] ?? [], + 'data' => $args['data'] ?? [], + 'order_by' => $args['orderBy'] ?? [] + ]); + + return $workflowTemplates; + } + + public static function getById(array $args) + { + ValidatorModel::notEmpty($args, ['id']); + ValidatorModel::intVal($args, ['id']); + ValidatorModel::arrayType($args, ['select']); + + $workflowTemplate = DatabaseModel::select([ + 'select' => $args['select'] ?? [1], + 'table' => ['workflow_templates'], + 'where' => ['id = ?'], + 'data' => [$args['id']] + ]); + + if (empty($workflowTemplate[0])) { + return []; + } + + return $workflowTemplate[0]; + } + + public static function create(array $args) + { + ValidatorModel::notEmpty($args, ['title', 'owner']); + ValidatorModel::stringType($args, ['title']); + ValidatorModel::intVal($args, ['owner']); + + $nextSequenceId = DatabaseModel::getNextSequenceValue(['sequenceId' => 'workflow_templates_id_seq']); + + DatabaseModel::insert([ + 'table' => 'workflow_templates', + 'columnsValues' => [ + 'id' => $nextSequenceId, + 'title' => $args['title'], + 'owner' => $args['owner'] + ] + ]); + + return $nextSequenceId; + } + + public static function update(array $args) + { + ValidatorModel::notEmpty($args, ['set', 'where', 'data']); + ValidatorModel::arrayType($args, ['set', 'where', 'data']); + + DatabaseModel::update([ + 'table' => 'workflow_templates', + 'set' => $args['set'], + 'where' => $args['where'], + 'data' => $args['data'] + ]); + + return true; + } + + public static function delete(array $args) + { + ValidatorModel::notEmpty($args, ['where', 'data']); + ValidatorModel::arrayType($args, ['where', 'data']); + + DatabaseModel::delete([ + 'table' => 'workflow_templates', + 'where' => $args['where'], + 'data' => $args['data'] + ]); + + return true; + } + +// public static function getWithItems(array $args = []) +// { +// ValidatorModel::arrayType($args, ['select', 'where', 'data', 'orderBy']); +// +// $listTemplates = DatabaseModel::select([ +// 'select' => empty($args['select']) ? ['*'] : $args['select'], +// 'table' => ['list_templates', 'list_templates_items'], +// 'left_join' => ['list_templates.id = list_templates_items.list_template_id'], +// 'where' => empty($args['where']) ? [] : $args['where'], +// 'data' => empty($args['data']) ? [] : $args['data'], +// 'order_by' => empty($args['orderBy']) ? [] : $args['orderBy'] +// ]); +// +// return $listTemplates; +// } +} diff --git a/test/unitTests/app/workflow/WorkflowTemplateControllerTest.php b/test/unitTests/app/workflow/WorkflowTemplateControllerTest.php new file mode 100755 index 0000000000..fb30799951 --- /dev/null +++ b/test/unitTests/app/workflow/WorkflowTemplateControllerTest.php @@ -0,0 +1,132 @@ +<?php + +/** +* Copyright Maarch since 2008 under licence GPLv3. +* See LICENCE.txt file at the root folder for more details. +* This file is part of Maarch software. +* +*/ + +use PHPUnit\Framework\TestCase; + +class WorkflowTemplateControllerTest extends TestCase +{ + private static $workflowTemplateId = null; + + public function testCreate() + { + $wtController = new \Workflow\controllers\WorkflowTemplateController(); + + $environment = \Slim\Http\Environment::mock(['REQUEST_METHOD' => 'POST']); + $request = \Slim\Http\Request::createFromEnvironment($environment); + + $args = [ + 'title' => 'mon workflow', + 'items' => [ + [ + 'userId' => 1, + 'mode' => 'visa', + 'signatureMode' => 'standard' + ], + [ + 'userId' => 3, + 'mode' => 'sign', + 'signatureMode' => 'standard' + ] + ] + ]; + + $fullRequest = \httpRequestCustom::addContentInBody($args, $request); + $response = $wtController->create($fullRequest, new \Slim\Http\Response()); + $this->assertSame(200, $response->getStatusCode()); + + $responseBody = json_decode((string)$response->getBody(), true); + $this->assertIsNumeric($responseBody['id']); + self::$workflowTemplateId = $responseBody['id']; + + + //ERRORS + unset($args['items'][0]['userId']); + $fullRequest = \httpRequestCustom::addContentInBody($args, $request); + $response = $wtController->create($fullRequest, new \Slim\Http\Response()); + $this->assertSame(400, $response->getStatusCode()); + + $responseBody = json_decode((string)$response->getBody(), true); + $this->assertSame('Item[0] userId is empty', $responseBody['errors']); + + unset($args['title']); + $fullRequest = \httpRequestCustom::addContentInBody($args, $request); + $response = $wtController->create($fullRequest, new \Slim\Http\Response()); + $this->assertSame(400, $response->getStatusCode()); + + $responseBody = json_decode((string)$response->getBody(), true); + $this->assertSame('Body title is empty or not a string', $responseBody['errors']); + } + + public function testGet() + { + $wtController = new \Workflow\controllers\WorkflowTemplateController(); + + $environment = \Slim\Http\Environment::mock(['REQUEST_METHOD' => 'GET']); + $request = \Slim\Http\Request::createFromEnvironment($environment); + + $response = $wtController->get($request, new \Slim\Http\Response()); + $this->assertSame(200, $response->getStatusCode()); + + $responseBody = json_decode((string)$response->getBody(), true); + $this->assertIsArray($responseBody['workflowTemplates']); + $this->assertNotEmpty($responseBody['workflowTemplates']); + } + + public function testGetById() + { + $wtController = new \Workflow\controllers\WorkflowTemplateController(); + + $environment = \Slim\Http\Environment::mock(['REQUEST_METHOD' => 'GET']); + $request = \Slim\Http\Request::createFromEnvironment($environment); + + $response = $wtController->getById($request, new \Slim\Http\Response(), ['id' => self::$workflowTemplateId]); + $this->assertSame(200, $response->getStatusCode()); + + $responseBody = json_decode((string)$response->getBody(), true); + $this->assertSame('mon workflow', $responseBody['workflowTemplate']['title']); + $this->assertSame(1, $responseBody['workflowTemplate']['items'][0]['userId']); + $this->assertNotEmpty($responseBody['workflowTemplate']['items'][0]['userLabel']); + $this->assertSame('visa', $responseBody['workflowTemplate']['items'][0]['mode']); + $this->assertSame('standard', $responseBody['workflowTemplate']['items'][0]['signatureMode']); + $this->assertSame(3, $responseBody['workflowTemplate']['items'][1]['userId']); + $this->assertNotEmpty($responseBody['workflowTemplate']['items'][1]['userLabel']); + $this->assertSame('sign', $responseBody['workflowTemplate']['items'][1]['mode']); + $this->assertSame('standard', $responseBody['workflowTemplate']['items'][1]['signatureMode']); + + //ERRORS + $previousUserId = $GLOBALS['id']; + $GLOBALS['id'] = 2; + + $response = $wtController->getById($request, new \Slim\Http\Response(), ['id' => self::$workflowTemplateId]); + $this->assertSame(403, $response->getStatusCode()); + + $responseBody = json_decode((string)$response->getBody(), true); + $this->assertSame('Workflow template out of perimeter', $responseBody['errors']); + + $GLOBALS['id'] = $previousUserId; + } + + public function testDelete() + { + $wtController = new \Workflow\controllers\WorkflowTemplateController(); + + $environment = \Slim\Http\Environment::mock(['REQUEST_METHOD' => 'DELETE']); + $request = \Slim\Http\Request::createFromEnvironment($environment); + + $response = $wtController->delete($request, new \Slim\Http\Response(), ['id' => self::$workflowTemplateId]); + $this->assertSame(204, $response->getStatusCode()); + + //ERRORS + $response = $wtController->delete($request, new \Slim\Http\Response(), ['id' => 9999999]); + $this->assertSame(400, $response->getStatusCode()); + + $responseBody = json_decode((string)$response->getBody(), true); + $this->assertSame('Workflow template does not exist', $responseBody['errors']); + } +} -- GitLab