diff --git a/Models/SurveyAnswer.php b/Models/SurveyAnswer.php index 1ed6228..96af04d 100644 --- a/Models/SurveyAnswer.php +++ b/Models/SurveyAnswer.php @@ -24,6 +24,14 @@ namespace Modules\Surveys\Models; */ final class SurveyAnswer { + /** + * ID. + * + * @var int + * @since 1.0.0 + */ + protected int $id = 0; + /** * Constructor * @@ -32,4 +40,16 @@ final class SurveyAnswer public function __construct() { } + + /** + * Get id. + * + * @return int + * + * @since 1.0.0 + */ + public function getId() : int + { + return $this->id; + } } diff --git a/Models/SurveyTemplate.php b/Models/SurveyTemplate.php index 881ab2c..bb50ad3 100644 --- a/Models/SurveyTemplate.php +++ b/Models/SurveyTemplate.php @@ -101,7 +101,7 @@ class SurveyTemplate * @var string * @since 1.0.0 */ - private string $virtualPath = '/'; + public string $virtualPath = '/'; /** * Tags. @@ -186,6 +186,20 @@ class SurveyTemplate return $this->tags; } + /** + * Get tag. + * + * @param int $id Element id + * + * @return Tag + * + * @since 1.0.0 + */ + public function getTag(int $id) : Tag + { + return $this->tags[$id] ?? new NullTag(); + } + /** * Add tag * @@ -200,6 +214,26 @@ class SurveyTemplate $this->tags[] = $tag; } + /** + * Remove Tag from list. + * + * @param int $id Tag + * + * @return bool + * + * @since 1.0.0 + */ + public function removeTag($id) : bool + { + if (isset($this->tags[$id])) { + unset($this->tags[$id]); + + return true; + } + + return false; + } + /** * Get all media * @@ -237,4 +271,45 @@ class SurveyTemplate { return $this->elements; } + + /** + * Add element + * + * @param SurveyTemplateElement $element Survey element to add + * + * @return void + * + * @since 1.0.0 + */ + public function addElement(SurveyTemplateElement $element) : void + { + $this->elements[] = $element; + } + + /** + * {@inheritdoc} + */ + public function toArray() : array + { + return [ + 'id' => $this->id, + 'status' => $this->status, + 'hasPublicResult' => $this->hasPublicResult, + 'createdAt' => $this->createdAt, + 'start' => $this->start, + 'end' => $this->end, + 'virtualPath' => $this->virtualPath, + 'tags' => $this->tags, + 'elements' => $this->elements, + 'media' => $this->media, + ]; + } + + /** + * {@inheritdoc} + */ + public function jsonSerialize() + { + return $this->toArray(); + } } diff --git a/Models/SurveyTemplateElement.php b/Models/SurveyTemplateElement.php index 6481528..61c16dd 100644 --- a/Models/SurveyTemplateElement.php +++ b/Models/SurveyTemplateElement.php @@ -149,6 +149,18 @@ class SurveyTemplateElement return $this->labels; } + /** + * @param mixed $value Label value + * + * @return void + * + * @since 1.0.0 + */ + public function addValue($value) : void + { + $this->values[] = $value; + } + /** * @return array * @@ -158,4 +170,28 @@ class SurveyTemplateElement { return $this->values; } + + /** + * {@inheritdoc} + */ + public function toArray() : array + { + return [ + 'id' => $this->id, + 'type' => $this->type, + 'isOptional' => $this->isOptional, + 'order' => $this->order, + 'template' => $this->template, + 'labels' => $this->labels, + 'values' => $this->values, + ]; + } + + /** + * {@inheritdoc} + */ + public function jsonSerialize() + { + return $this->toArray(); + } } diff --git a/Models/SurveyTemplateElementL11n.php b/Models/SurveyTemplateElementL11n.php index 890034f..8725a9a 100644 --- a/Models/SurveyTemplateElementL11n.php +++ b/Models/SurveyTemplateElementL11n.php @@ -41,7 +41,7 @@ class SurveyTemplateElementL11n implements \JsonSerializable, ArrayableInterface * @var int * @since 1.0.0 */ - protected int $element = 0; + public int $element = 0; /** * Language. @@ -105,32 +105,6 @@ class SurveyTemplateElementL11n implements \JsonSerializable, ArrayableInterface return $this->id; } - /** - * Set element. - * - * @param int $element Surveys id - * - * @return void - * - * @since 1.0.0 - */ - public function setElement(int $element) : void - { - $this->element = $element; - } - - /** - * Get element - * - * @return int - * - * @since 1.0.0 - */ - public function getElement() : int - { - return $this->element; - } - /** * Get language * diff --git a/Models/SurveyTemplateL11n.php b/Models/SurveyTemplateL11n.php index 01e842c..d0c04ea 100644 --- a/Models/SurveyTemplateL11n.php +++ b/Models/SurveyTemplateL11n.php @@ -41,7 +41,7 @@ class SurveyTemplateL11n implements \JsonSerializable, ArrayableInterface * @var int * @since 1.0.0 */ - protected int $template = 0; + public int $template = 0; /** * Language. @@ -105,32 +105,6 @@ class SurveyTemplateL11n implements \JsonSerializable, ArrayableInterface return $this->id; } - /** - * Set template. - * - * @param int $template Surveys id - * - * @return void - * - * @since 1.0.0 - */ - public function setSurvey(int $template) : void - { - $this->template = $template; - } - - /** - * Get template - * - * @return int - * - * @since 1.0.0 - */ - public function getSurvey() : int - { - return $this->template; - } - /** * Get language * @@ -163,11 +137,12 @@ class SurveyTemplateL11n implements \JsonSerializable, ArrayableInterface public function toArray() : array { return [ - 'id' => $this->id, - 'title' => $this->title, - 'description' => $this->description, - 'template' => $this->template, - 'language' => $this->language, + 'id' => $this->id, + 'title' => $this->title, + 'description' => $this->description, + 'descriptionPlain' => $this->descriptionPlain, + 'template' => $this->template, + 'language' => $this->language, ]; } diff --git a/Models/SurveyTemplateLabelL11n.php b/Models/SurveyTemplateLabelL11n.php index 4411d2e..c79086b 100644 --- a/Models/SurveyTemplateLabelL11n.php +++ b/Models/SurveyTemplateLabelL11n.php @@ -41,7 +41,7 @@ class SurveyTemplateLabelL11n implements \JsonSerializable, ArrayableInterface * @var int * @since 1.0.0 */ - protected int $element = 0; + public int $element = 0; /** * Order. @@ -93,32 +93,6 @@ class SurveyTemplateLabelL11n implements \JsonSerializable, ArrayableInterface return $this->id; } - /** - * Set element. - * - * @param int $element Surveys id - * - * @return void - * - * @since 1.0.0 - */ - public function setElement(int $element) : void - { - $this->element = $element; - } - - /** - * Get element - * - * @return int - * - * @since 1.0.0 - */ - public function getElement() : int - { - return $this->element; - } - /** * Get language * @@ -154,6 +128,7 @@ class SurveyTemplateLabelL11n implements \JsonSerializable, ArrayableInterface 'id' => $this->id, 'title' => $this->title, 'element' => $this->element, + 'order' => $this->order, 'language' => $this->language, ]; } diff --git a/tests/Controller/ApiControllerTest.php b/tests/Controller/ApiControllerTest.php new file mode 100644 index 0000000..bd24e06 --- /dev/null +++ b/tests/Controller/ApiControllerTest.php @@ -0,0 +1,220 @@ +app = new class() extends ApplicationAbstract + { + protected string $appName = 'Api'; + }; + + $this->app->dbPool = $GLOBALS['dbpool']; + $this->app->orgId = 1; + $this->app->accountManager = new AccountManager($GLOBALS['session']); + $this->app->appSettings = new CoreSettings(); + $this->app->moduleManager = new ModuleManager($this->app, __DIR__ . '/../../../../Modules/'); + $this->app->dispatcher = new Dispatcher($this->app); + $this->app->eventManager = new EventManager($this->app->dispatcher); + $this->app->eventManager->importFromFile(__DIR__ . '/../../../../Web/Api/Hooks.php'); + $this->app->sessionManager = new HttpSession(36000); + + $account = new Account(); + TestUtils::setMember($account, 'id', 1); + + $permission = new AccountPermission(); + $permission->setUnit(1); + $permission->setApp('backend'); + $permission->setPermission( + PermissionType::READ + | PermissionType::CREATE + | PermissionType::MODIFY + | PermissionType::DELETE + | PermissionType::PERMISSION + ); + + $account->addPermission($permission); + + $this->app->accountManager->add($account); + $this->app->router = new WebRouter(); + + $this->module = $this->app->moduleManager->get('Surveys'); + + TestUtils::setMember($this->module, 'app', $this->app); + } + + /** + * @covers Modules\Surveys\Controller\ApiController + * @group module + */ + public function testApiSurveyTemplateCreate() : void + { + $response = new HttpResponse(); + $request = new HttpRequest(new HttpUri('')); + + $request->header->account = 1; + $request->setData('title', 'TestSurvey'); + $request->setData('description', 'Test description'); + + $request->setData('tags', '[{"title": "TestTitle", "color": "#f0f", "language": "en"}, {"id": 1}]'); + + if (!\is_file(__DIR__ . '/test_tmp.md')) { + \copy(__DIR__ . '/test.md', __DIR__ . '/test_tmp.md'); + } + + TestUtils::setMember($request, 'files', [ + 'file1' => [ + 'name' => 'test.md', + 'type' => MimeType::M_TXT, + 'tmp_name' => __DIR__ . '/test_tmp.md', + 'error' => \UPLOAD_ERR_OK, + 'size' => \filesize(__DIR__ . '/test_tmp.md'), + ], + ]); + + $request->setData('media', \json_encode([1])); + + $this->module->apiSurveyTemplateCreate($request, $response); + self::assertGreaterThan(0, $response->get('')['response']->getId()); + } + + /** + * @covers Modules\Surveys\Controller\ApiController + * @group module + */ + public function testApiSurveyTemplateCreateInvalidData() : void + { + $response = new HttpResponse(); + $request = new HttpRequest(new HttpUri('')); + + $request->header->account = 1; + $request->setData('invalid', '1'); + + $this->module->apiSurveyTemplateCreate($request, $response); + self::assertEquals(RequestStatusCode::R_400, $response->header->status); + } + + /** + * @covers Modules\Surveys\Controller\ApiController + * @group module + */ + public function testApiSurveyTemplateElementCreate() : void + { + $response = new HttpResponse(); + $request = new HttpRequest(new HttpUri('')); + + $request->header->account = 1; + $request->setData('survey', '1'); + $request->setData('text', 'Some text'); + $request->setData('description', 'Some description'); + $request->setData('type', SurveyElementType::RADIO); + + $count = 5; + for ($m = 0; $m < $count; ++$m) { + $labels[] = 'Label_' . ($m + 1); + $values[] = 'v_' . $m; + } + + $this->module->apiSurveyTemplateElementCreate($request, $response); + self::assertGreaterThan(0, $response->get('')['response']->getId()); + } + + /** + * @covers Modules\Surveys\Controller\ApiController + * @group module + */ + public function testApiSurveyTemplateElementCreateInvalidData() : void + { + $response = new HttpResponse(); + $request = new HttpRequest(new HttpUri('')); + + $request->header->account = 1; + $request->setData('invalid', '1'); + + $this->module->apiSurveyTemplateElementCreate($request, $response); + self::assertEquals(RequestStatusCode::R_400, $response->header->status); + } + + /** + * @covers Modules\Surveys\Controller\ApiController + * @group module + */ + public function testApiSurveyAnswerCreate() : void + { + $response = new HttpResponse(); + $request = new HttpRequest(new HttpUri('')); + + $request->header->account = 1; + $request->setData('survey', '1'); + $request->setData('e_1', 'v_2'); + + $this->module->apiSurveyAnswerCreate($request, $response); + self::markTestIncomplete(); + self::assertGreaterThan(0, $response->get('')['response']->getId()); + } + + /** + * @covers Modules\Surveys\Controller\ApiController + * @group module + */ + public function testApiSurveyAnswerCreateInvalidData() : void + { + $response = new HttpResponse(); + $request = new HttpRequest(new HttpUri('')); + + $request->header->account = 1; + $request->setData('invalid', '1'); + + $this->module->apiSurveyAnswerCreate($request, $response); + self::assertEquals(RequestStatusCode::R_400, $response->header->status); + } +} diff --git a/tests/Controller/test.md b/tests/Controller/test.md new file mode 100644 index 0000000..d35f959 --- /dev/null +++ b/tests/Controller/test.md @@ -0,0 +1,3 @@ +# Test Title + +Some **test** text. \ No newline at end of file diff --git a/tests/Models/SurveyTemplateElementL11nTest.php b/tests/Models/SurveyTemplateElementL11nTest.php new file mode 100644 index 0000000..a24f76c --- /dev/null +++ b/tests/Models/SurveyTemplateElementL11nTest.php @@ -0,0 +1,102 @@ +l11n = new SurveyTemplateElementL11n(); + } + + /** + * @covers Modules\Surveys\Models\SurveyTemplateElementL11n + * @group module + */ + public function testDefault() : void + { + self::assertEquals(0, $this->l11n->getId()); + self::assertEquals('', $this->l11n->text); + self::assertEquals('', $this->l11n->description); + self::assertEquals('', $this->l11n->descriptionPlain); + self::assertEquals(ISO639x1Enum::_EN, $this->l11n->getLanguage()); + } + + /** + * @covers Modules\Surveys\Models\SurveyTemplateElementL11n + * @group module + */ + public function testTextInputOutput() : void + { + $this->l11n->text = 'TestName'; + self::assertEquals('TestName', $this->l11n->text); + } + + /** + * @covers Modules\Surveys\Models\SurveyTemplateElementL11n + * @group module + */ + public function testDescriptionInputOutput() : void + { + $this->l11n->description = 'TestContent'; + self::assertEquals('TestContent', $this->l11n->description); + } + + /** + * @covers Modules\Surveys\Models\SurveyTemplateElementL11n + * @group module + */ + public function testLanguageInputOutput() : void + { + $this->l11n->setLanguage(ISO639x1Enum::_DE); + self::assertEquals(ISO639x1Enum::_DE, $this->l11n->getLanguage()); + } + + /** + * @covers Modules\Surveys\Models\SurveyTemplateElementL11n + * @group module + */ + public function testSerialize() : void + { + $this->l11n->text = 'Title'; + $this->l11n->description = 'Content'; + $this->l11n->descriptionPlain = 'ContentPlain'; + $this->l11n->element = 2; + $this->l11n->setLanguage(ISO639x1Enum::_DE); + + self::assertEquals( + [ + 'id' => 0, + 'text' => 'Title', + 'description' => 'Content', + 'descriptionPlain' => 'ContentPlain', + 'element' => 2, + 'language' => ISO639x1Enum::_DE, + ], + $this->l11n->jsonSerialize() + ); + } +} diff --git a/tests/Models/SurveyTemplateElementTest.php b/tests/Models/SurveyTemplateElementTest.php new file mode 100644 index 0000000..a48c6db --- /dev/null +++ b/tests/Models/SurveyTemplateElementTest.php @@ -0,0 +1,106 @@ +element = new SurveyTemplateElement(); + } + + /** + * @covers Modules\Surveys\Models\SurveyTemplateElement + * @group module + */ + public function testDefault() : void + { + self::assertEquals(0, $this->element->getId()); + + $date = new \DateTime('now'); + self::assertEquals([], $this->element->getLabels()); + self::assertEquals([], $this->element->getValues()); + self::assertInstanceOf('\Modules\Surveys\Models\SurveyTemplateElementL11n', $this->element->getL11n()); + } + + /** + * @covers Modules\Surveys\Models\SurveyTemplateElement + * @group module + */ + public function testL11nInputOutput() : void + { + $this->element->setL11n(new SurveyTemplateElementL11n('NewTest')); + self::assertEquals('NewTest', $this->element->getL11n()->text); + } + + /** + * @covers Modules\Surveys\Models\SurveyTemplateElement + * @group module + */ + public function testLabelInputOutput() : void + { + $this->element->addLabel(new SurveyTemplateLabelL11n()); + self::assertCount(1, $this->element->getLabels()); + } + + /** + * @covers Modules\Surveys\Models\SurveyTemplateElement + * @group module + */ + public function testValueInputOutput() : void + { + $this->element->addValue('testValue'); + self::assertCount(1, $this->element->getValues()); + } + + /** + * @covers Modules\Surveys\Models\SurveyTemplateElement + * @group module + */ + public function testSerialize() : void + { + $this->element->isOptional = true; + $this->element->order = 3; + $this->element->template = 2; + + $serialized = $this->element->jsonSerialize(); + + self::assertEquals( + [ + 'id' => 0, + 'type' => SurveyElementType::CHECKBOX, + 'isOptional' => true, + 'order' => 3, + 'template' => 2, + 'labels' => [], + 'values' => [], + ], + $serialized + ); + } +} diff --git a/tests/Models/SurveyTemplateL11nTest.php b/tests/Models/SurveyTemplateL11nTest.php new file mode 100644 index 0000000..6ed3e65 --- /dev/null +++ b/tests/Models/SurveyTemplateL11nTest.php @@ -0,0 +1,102 @@ +l11n = new SurveyTemplateL11n(); + } + + /** + * @covers Modules\Surveys\Models\SurveyTemplateL11n + * @group module + */ + public function testDefault() : void + { + self::assertEquals(0, $this->l11n->getId()); + self::assertEquals('', $this->l11n->title); + self::assertEquals('', $this->l11n->description); + self::assertEquals('', $this->l11n->descriptionPlain); + self::assertEquals(ISO639x1Enum::_EN, $this->l11n->getLanguage()); + } + + /** + * @covers Modules\Surveys\Models\SurveyTemplateL11n + * @group module + */ + public function testTextInputOutput() : void + { + $this->l11n->title = 'TestName'; + self::assertEquals('TestName', $this->l11n->title); + } + + /** + * @covers Modules\Surveys\Models\SurveyTemplateL11n + * @group module + */ + public function testDescriptionInputOutput() : void + { + $this->l11n->description = 'TestContent'; + self::assertEquals('TestContent', $this->l11n->description); + } + + /** + * @covers Modules\Surveys\Models\SurveyTemplateL11n + * @group module + */ + public function testLanguageInputOutput() : void + { + $this->l11n->setLanguage(ISO639x1Enum::_DE); + self::assertEquals(ISO639x1Enum::_DE, $this->l11n->getLanguage()); + } + + /** + * @covers Modules\Surveys\Models\SurveyTemplateL11n + * @group module + */ + public function testSerialize() : void + { + $this->l11n->title = 'Title'; + $this->l11n->description = 'Content'; + $this->l11n->descriptionPlain = 'ContentPlain'; + $this->l11n->template = 2; + $this->l11n->setLanguage(ISO639x1Enum::_DE); + + self::assertEquals( + [ + 'id' => 0, + 'title' => 'Title', + 'description' => 'Content', + 'descriptionPlain' => 'ContentPlain', + 'template' => 2, + 'language' => ISO639x1Enum::_DE, + ], + $this->l11n->jsonSerialize() + ); + } +} diff --git a/tests/Models/SurveyTemplateLabelL11nTest.php b/tests/Models/SurveyTemplateLabelL11nTest.php new file mode 100644 index 0000000..6426eff --- /dev/null +++ b/tests/Models/SurveyTemplateLabelL11nTest.php @@ -0,0 +1,88 @@ +l11n = new SurveyTemplateLabelL11n(); + } + + /** + * @covers Modules\Surveys\Models\SurveyTemplateLabelL11n + * @group module + */ + public function testDefault() : void + { + self::assertEquals(0, $this->l11n->getId()); + self::assertEquals('', $this->l11n->title); + self::assertEquals(ISO639x1Enum::_EN, $this->l11n->getLanguage()); + } + + /** + * @covers Modules\Surveys\Models\SurveyTemplateLabelL11n + * @group module + */ + public function testTextInputOutput() : void + { + $this->l11n->title = 'TestName'; + self::assertEquals('TestName', $this->l11n->title); + } + + /** + * @covers Modules\Surveys\Models\SurveyTemplateLabelL11n + * @group module + */ + public function testLanguageInputOutput() : void + { + $this->l11n->setLanguage(ISO639x1Enum::_DE); + self::assertEquals(ISO639x1Enum::_DE, $this->l11n->getLanguage()); + } + + /** + * @covers Modules\Surveys\Models\SurveyTemplateLabelL11n + * @group module + */ + public function testSerialize() : void + { + $this->l11n->title = 'Title'; + $this->l11n->element = 2; + $this->l11n->order = 3; + $this->l11n->setLanguage(ISO639x1Enum::_DE); + + self::assertEquals( + [ + 'id' => 0, + 'title' => 'Title', + 'element' => 2, + 'order' => 3, + 'language' => ISO639x1Enum::_DE, + ], + $this->l11n->jsonSerialize() + ); + } +} diff --git a/tests/Models/SurveyTemplateTest.php b/tests/Models/SurveyTemplateTest.php new file mode 100644 index 0000000..4fd6e4f --- /dev/null +++ b/tests/Models/SurveyTemplateTest.php @@ -0,0 +1,141 @@ +survey = new SurveyTemplate(); + } + + /** + * @covers Modules\Surveys\Models\SurveyTemplate + * @group module + */ + public function testDefault() : void + { + self::assertEquals(0, $this->survey->getId()); + + $date = new \DateTime('now'); + self::assertEquals([], $this->survey->getElements()); + self::assertEquals([], $this->survey->getTags()); + self::assertEquals([], $this->survey->getMedia()); + } + + /** + * @covers Modules\Surveys\Models\SurveyTemplate + * @group module + */ + public function testTagInputOutput() : void + { + $tag = new Tag(); + $tag->setL11n('Tag'); + + $this->survey->addTag($tag); + self::assertEquals($tag, $this->survey->getTag(0)); + self::assertCount(1, $this->survey->getTags()); + } + + /** + * @covers Modules\Surveys\Models\SurveyTemplate + * @group module + */ + public function testTagRemove() : void + { + $tag = new Tag(); + $tag->setL11n('Tag'); + + $this->survey->addTag($tag); + self::assertTrue($this->survey->removeTag(0)); + self::assertCount(0, $this->survey->getTags()); + self::assertFalse($this->survey->removeTag(0)); + } + + /** + * @covers Modules\Surveys\Models\SurveyTemplate + * @group module + */ + public function testMediaInputOutput() : void + { + $this->survey->addMedia(new Media()); + self::assertCount(1, $this->survey->getMedia()); + } + + /** + * @covers Modules\Surveys\Models\SurveyTemplate + * @group module + */ + public function testElementInputOutput() : void + { + $this->survey->addElement(new SurveyTemplateElement()); + self::assertCount(1, $this->survey->getElements()); + } + + /** + * @covers Modules\Surveys\Models\SurveyTemplate + * @group module + */ + public function testL11nInputOutput() : void + { + $this->survey->setL11n(new SurveyTemplateL11n('NewTest')); + self::assertEquals('NewTest', $this->survey->getL11n()->title); + } + + /** + * @covers Modules\Surveys\Models\SurveyTemplate + * @group module + */ + public function testSerialize() : void + { + $this->survey->hasPublicResult = false; + $this->survey->start = new \DateTime('now'); + $this->survey->end = new \DateTime('now'); + $this->survey->virtualPath = 'test/path'; + + $serialized = $this->survey->jsonSerialize(); + unset($serialized['createdAt']); + + self::assertEquals( + [ + 'id' => 0, + 'status' => SurveyStatus::ACTIVE, + 'hasPublicResult' => false, + 'start' => $this->survey->start, + 'end' => $this->survey->end, + 'virtualPath' => 'test/path', + 'tags' => [], + 'elements' => [], + 'media' => [], + ], + $serialized + ); + } +}