diff --git a/tests/Admin/AdminTest.php b/tests/Admin/AdminTest.php new file mode 100644 index 0000000..4a60b32 --- /dev/null +++ b/tests/Admin/AdminTest.php @@ -0,0 +1,26 @@ +getHeader()->setAccount(1); + $request->setData('title', 'Controller Test Title'); + $request->setData('plain', 'Controller Test Content'); + $request->setData('lang', 'en'); + $request->setData('type', NewsType::ARTICLE); + $request->setData('status', NewsStatus::DRAFT); + $request->setData('featred', true); + + $this->module->apiNewsCreate($request, $response); + + self::assertEquals('Controller Test Title', $response->get('')['response']->getTitle()); + self::assertGreaterThan(0, $response->get('')['response']->getId()); + } + + /** + * @testdox A news article can be returned + * @covers Modules\News\Controller\ApiController + * @group module + */ + public function testApiNewsGet() : void + { + $response = new HttpResponse(); + $request = new HttpRequest(new HttpUri('')); + + $request->getHeader()->setAccount(1); + $request->setData('id', '1'); + + $this->module->apiNewsGet($request, $response); + + self::assertGreaterThan(0, $response->get('')['response']->getId()); + } + + /** + * @testdox A news article can be updated + * @covers Modules\News\Controller\ApiController + * @group module + */ + public function testApiNewsUpdate() : void + { + $response = new HttpResponse(); + $request = new HttpRequest(new HttpUri('')); + + $request->getHeader()->setAccount(1); + $request->setData('id', 1); + $request->setData('title', 'New Title'); + $request->setData('plain', 'New Content here'); + + $this->module->apiNewsUpdate($request, $response); + $this->module->apiNewsGet($request, $response); + + self::assertEquals('New Title', $response->get('')['response']->getTitle()); + } + + /** + * @testdox A news article can be deleted + * @covers Modules\News\Controller\ApiController + * @group module + */ + public function testApiNewsDelete() : void + { + $response = new HttpResponse(); + $request = new HttpRequest(new HttpUri('')); + + $request->getHeader()->setAccount(1); + $request->setData('id', 1); + $this->module->apiNewsDelete($request, $response); + + self::assertGreaterThan(0, $response->get('')['response']->getId()); + } +} diff --git a/tests/Controller/ApiControllerTest.php b/tests/Controller/ApiControllerTest.php new file mode 100644 index 0000000..71e76de --- /dev/null +++ b/tests/Controller/ApiControllerTest.php @@ -0,0 +1,86 @@ +app = new class() extends ApplicationAbstract + { + protected string $appName = 'Api'; + }; + + $this->app->dbPool = $GLOBALS['dbpool']; + $this->app->orgId = 1; + $this->app->appName = 'Backend'; + $this->app->accountManager = new AccountManager($GLOBALS['session']); + $this->app->appSettings = new CoreSettings($this->app->dbPool->get()); + $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'); + + $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('News'); + + TestUtils::setMember($this->module, 'app', $this->app); + } + + use ApiControllerNewsArticleTrait; +} diff --git a/tests/Models/NewsArticleMapperTest.php b/tests/Models/NewsArticleMapperTest.php new file mode 100644 index 0000000..998081d --- /dev/null +++ b/tests/Models/NewsArticleMapperTest.php @@ -0,0 +1,171 @@ +setCreatedBy(new NullAccount(1)); + $news->setTitle($text->generateText(\mt_rand(3, 7))); + $news->setContent($text->generateText(\mt_rand(100, 300))); + $news->setPublish(new \DateTime('2001-05-07')); + $news->setFeatured(true); + $news->setLanguage(ISO639x1Enum::_DE); + $news->setStatus(NewsStatus::VISIBLE); + $news->setType(NewsType::HEADLINE); + + $id = NewsArticleMapper::create($news); + self::assertGreaterThan(0, $news->getId()); + self::assertEquals($id, $news->getId()); + + $newsR = NewsArticleMapper::get($news->getId()); + self::assertEquals($news->getCreatedAt()->format('Y-m-d'), $newsR->getCreatedAt()->format('Y-m-d')); + self::assertEquals($news->getCreatedBy()->getId(), $newsR->getCreatedBy()->getId()); + self::assertEquals($news->getContent(), $newsR->getContent()); + self::assertEquals($news->getTitle(), $newsR->getTitle()); + self::assertEquals($news->getStatus(), $newsR->getStatus()); + self::assertEquals($news->getType(), $newsR->getType()); + self::assertEquals($news->getLanguage(), $newsR->getLanguage()); + self::assertEquals($news->isFeatured(), $newsR->isFeatured()); + self::assertEquals($news->getPublish()->format('Y-m-d'), $newsR->getPublish()->format('Y-m-d')); + } + + /** + * @group volume + * @covers Modules\News\Models\NewsArticleMapper + * @group module + */ + public function testVolume() : void + { + $text = new Text(); + + // Created by other + + $news = new NewsArticle(); + $news->setCreatedBy(new NullAccount(1)); + $news->setTitle($text->generateText(\mt_rand(3, 7))); + $news->setContent($text->generateText(\mt_rand(10, 300))); + $news->setPublish(new \DateTime('2001-05-07')); + $news->setFeatured(false); + $news->setLanguage(ISO639x1Enum::_DE); + $news->setStatus(NewsStatus::VISIBLE); + $news->setType(NewsType::HEADLINE); + + $id = NewsArticleMapper::create($news); + + $news = new NewsArticle(); + $news->setCreatedBy(new NullAccount(1)); + $news->setTitle($text->generateText(\mt_rand(3, 7))); + $news->setContent($text->generateText(\mt_rand(10, 300))); + $news->setPublish(new \DateTime('2001-05-07')); + $news->setFeatured(false); + $news->setLanguage(ISO639x1Enum::_DE); + $news->setStatus(NewsStatus::DRAFT); + $news->setType(NewsType::HEADLINE); + + $id = NewsArticleMapper::create($news); + + // Created by me + + $news = new NewsArticle(); + $news->setCreatedBy(new NullAccount(1)); + $news->setTitle($text->generateText(\mt_rand(3, 7))); + $news->setContent($text->generateText(\mt_rand(10, 300))); + $news->setPublish(new \DateTime('2001-05-07')); + $news->setFeatured(false); + $news->setLanguage(ISO639x1Enum::_DE); + $news->setStatus(NewsStatus::VISIBLE); + $news->setType(NewsType::ARTICLE); + + $id = NewsArticleMapper::create($news); + + $news = new NewsArticle(); + $news->setCreatedBy(new NullAccount(1)); + $news->setTitle($text->generateText(\mt_rand(3, 7))); + $news->setContent($text->generateText(\mt_rand(10, 300))); + $news->setPublish(new \DateTime('2001-05-07')); + $news->setFeatured(false); + $news->setLanguage(ISO639x1Enum::_DE); + $news->setStatus(NewsStatus::VISIBLE); + $news->setType(NewsType::LINK); + + $id = NewsArticleMapper::create($news); + + $news = new NewsArticle(); + $news->setCreatedBy(new NullAccount(1)); + $news->setTitle($text->generateText(\mt_rand(3, 7))); + $news->setContent($text->generateText(\mt_rand(10, 300))); + $news->setPublish(new \DateTime('2001-05-07')); + $news->setFeatured(false); + $news->setLanguage(ISO639x1Enum::_DE); + $news->setStatus(NewsStatus::DRAFT); + $news->setType(NewsType::ARTICLE); + + $id = NewsArticleMapper::create($news); + + // Language + + $news = new NewsArticle(); + $news->setCreatedBy(new NullAccount(1)); + $news->setTitle($text->generateText(\mt_rand(3, 7))); + $news->setContent($text->generateText(\mt_rand(10, 300))); + $news->setPublish(new \DateTime('2001-05-07')); + $news->setFeatured(true); + $news->setLanguage(ISO639x1Enum::_EN); + $news->setStatus(NewsStatus::VISIBLE); + $news->setType(NewsType::ARTICLE); + + $id = NewsArticleMapper::create($news); + + // Publish + + $publishDate = new \DateTime('now'); + $publishDate->modify('+1 days'); + + $news = new NewsArticle(); + $news->setCreatedBy(new NullAccount(1)); + $news->setTitle($text->generateText(\mt_rand(3, 7))); + $news->setContent($text->generateText(\mt_rand(10, 300))); + $news->setPublish($publishDate); + $news->setFeatured(false); + $news->setLanguage(ISO639x1Enum::_DE); + $news->setStatus(NewsStatus::VISIBLE); + $news->setType(NewsType::ARTICLE); + + $id = NewsArticleMapper::create($news); + } +} diff --git a/tests/Models/NewsArticleTest.php b/tests/Models/NewsArticleTest.php new file mode 100644 index 0000000..da732d1 --- /dev/null +++ b/tests/Models/NewsArticleTest.php @@ -0,0 +1,229 @@ +news = new NewsArticle(); + } + + /** + * @testdox The model has the expected default values after initialization + * @covers Modules\News\Models\NewsArticle + * @group module + */ + public function testDefault() : void + { + self::assertEquals(0, $this->news->getId()); + self::assertEquals(0, $this->news->getCreatedBy()->getId()); + self::assertEquals('', $this->news->getTitle()); + self::assertEquals('', $this->news->getContent()); + self::assertEquals((new \DateTime('now'))->format('Y-m-d'), $this->news->getCreatedAt()->format('Y-m-d')); + self::assertEquals((new \DateTime('now'))->format('Y-m-d'), $this->news->getPublish()->format('Y-m-d')); + self::assertFalse($this->news->isFeatured()); + self::assertEquals(ISO639x1Enum::_EN, $this->news->getLanguage()); + self::assertEquals(NewsStatus::DRAFT, $this->news->getStatus()); + self::assertEquals(NewsType::ARTICLE, $this->news->getType()); + self::assertEquals([], $this->news->getBadges()); + self::assertEquals('', $this->news->getPlain()); + } + + /** + * @testdox The creator can be correctly set and returned + * @covers Modules\News\Models\NewsArticle + * @group module + */ + public function testCreatorInputOutput() : void + { + $this->news->setCreatedBy(new NullAccount(1)); + self::assertEquals(1, $this->news->getCreatedBy()->getId()); + } + + /** + * @testdox The title can be correctly set and returned + * @covers Modules\News\Models\NewsArticle + * @group module + */ + public function testTitleInputOutput() : void + { + $this->news->setTitle('Title'); + self::assertEquals('Title', $this->news->getTitle()); + } + + /** + * @testdox The content can be correctly set and returned + * @covers Modules\News\Models\NewsArticle + * @group module + */ + public function testContentInputOutput() : void + { + $this->news->setContent('Content'); + self::assertEquals('Content', $this->news->getContent()); + } + + /** + * @testdox The plain content can be correctly set and returned + * @covers Modules\News\Models\NewsArticle + * @group module + */ + public function testPlainInputOutput() : void + { + $this->news->setPlain('Plain'); + self::assertEquals('Plain', $this->news->getPlain()); + } + + /** + * @testdox The publish date can be correctly set and returned + * @covers Modules\News\Models\NewsArticle + * @group module + */ + public function testPublishInputOutput() : void + { + $this->news->setPublish($data = new \DateTime('2001-05-07')); + self::assertEquals($data, $this->news->getPublish()); + } + + /** + * @testdox The featured flag can be correctly set and returned + * @covers Modules\News\Models\NewsArticle + * @group module + */ + public function testFeaturedInputOutput() : void + { + $this->news->setFeatured(true); + self::assertTrue($this->news->isFeatured()); + } + + /** + * @testdox The language can be correctly set and returned + * @covers Modules\News\Models\NewsArticle + * @group module + */ + public function testLanguageInputOutput() : void + { + $this->news->setLanguage(ISO639x1Enum::_DE); + self::assertEquals(ISO639x1Enum::_DE, $this->news->getLanguage()); + } + + /** + * @testdox The langague can be correctly set and returned + * @covers Modules\News\Models\NewsArticle + * @group module + */ + public function testStatusInputOutput() : void + { + $this->news->setStatus(NewsStatus::VISIBLE); + self::assertEquals(NewsStatus::VISIBLE, $this->news->getStatus()); + } + + /** + * @testdox The type can be correctly set and returned + * @covers Modules\News\Models\NewsArticle + * @group module + */ + public function testTypeInputOutput() : void + { + $this->news->setType(NewsType::HEADLINE); + self::assertEquals(NewsType::HEADLINE, $this->news->getType()); + } + + /** + * @testdox The model can be correctly serialized + * @covers Modules\News\Models\NewsArticle + * @group module + */ + public function testSerialization() : void + { + $this->news->setTitle('Title'); + $this->news->setCreatedBy(new NullAccount(1)); + $this->news->setContent('Content'); + $this->news->setPlain('Plain'); + $this->news->setPublish(new \DateTime('2001-05-07')); + $this->news->setFeatured(true); + $this->news->setLanguage(ISO639x1Enum::_DE); + $this->news->setStatus(NewsStatus::VISIBLE); + $this->news->setType(NewsType::HEADLINE); + + $arr = [ + 'id' => 0, + 'title' => $this->news->getTitle(), + 'plain' => $this->news->getPlain(), + 'content' => $this->news->getContent(), + 'type' => $this->news->getType(), + 'status' => $this->news->getStatus(), + 'featured' => $this->news->isFeatured(), + 'publish' => $this->news->getPublish(), + 'createdAt' => $this->news->getCreatedAt(), + 'createdBy' => $this->news->getCreatedBy(), + ]; + + self::assertEquals($arr, $this->news->toArray()); + self::assertEquals($arr, $this->news->jsonSerialize()); + } + + /** + * @testdox A invalid status throws a InvalidEnumValue exception + * @covers Modules\News\Models\NewsArticle + * @group module + */ + public function testInvalidStatus() : void + { + self::expectException(\phpOMS\Stdlib\Base\Exception\InvalidEnumValue::class); + + $news = new NewsArticle(); + $news->setStatus(9999); + } + + /** + * @testdox A invalid type throws a InvalidEnumValue exception + * @covers Modules\News\Models\NewsArticle + * @group module + */ + public function testInvalidType() : void + { + self::expectException(\phpOMS\Stdlib\Base\Exception\InvalidEnumValue::class); + + $news = new NewsArticle(); + $news->setType(9999); + } + + /** + * @testdox A invalid language throws a InvalidEnumValue exception + * @covers Modules\News\Models\NewsArticle + * @group module + */ + public function testInvalidLanguage() : void + { + self::expectException(\phpOMS\Stdlib\Base\Exception\InvalidEnumValue::class); + + $news = new NewsArticle(); + $news->setLanguage('9999'); + } +}