From faf9083ebe73bd402a9369f2816401e684a76b9e Mon Sep 17 00:00:00 2001 From: Dennis Eichhorn Date: Fri, 9 Oct 2020 00:20:25 +0200 Subject: [PATCH] fix @covers --- Admin/Installer.php | 4 +- Admin/Routes/Web/Api.php | 11 - Controller/ApiController.php | 24 -- Controller/BackendController.php | 20 +- {Models => Controller}/FileUploaderTrait.php | 9 +- Models/Media.php | 4 +- Views/MediaView.php | 28 ++- tests/Admin/AdminTest.php | 7 - tests/Admin/invalidJson.json | 3 - tests/Models/CollectionMapperTest.php | 55 +++++ tests/Models/CollectionTest.php | 17 ++ tests/Models/MediaMapperTest.php | 72 ++++++ tests/Models/MediaTest.php | 65 ++++++ tests/Models/NullCollectionTest.php | 42 ++++ tests/Models/NullMediaTest.php | 42 ++++ tests/Views/MediaViewTest.php | 234 +++++++++++++++++++ tests/Views/test.md | 2 + 17 files changed, 556 insertions(+), 83 deletions(-) rename {Models => Controller}/FileUploaderTrait.php (76%) delete mode 100644 tests/Admin/invalidJson.json create mode 100644 tests/Models/CollectionMapperTest.php create mode 100644 tests/Models/NullCollectionTest.php create mode 100644 tests/Models/NullMediaTest.php create mode 100644 tests/Views/MediaViewTest.php create mode 100644 tests/Views/test.md diff --git a/Admin/Installer.php b/Admin/Installer.php index 7d5789d..84208c8 100755 --- a/Admin/Installer.php +++ b/Admin/Installer.php @@ -61,9 +61,9 @@ final class Installer extends InstallerAbstract throw new PathException($data['path'] ?? ''); // @codeCoverageIgnore } - $mediaData = \json_decode($mediaFile, true); + $mediaData = \json_decode($mediaFile, true) ?? []; if ($mediaData === false) { - throw new \Exception(); + throw new \Exception(); // @codeCoverageIgnore } foreach ($mediaData as $media) { diff --git a/Admin/Routes/Web/Api.php b/Admin/Routes/Web/Api.php index c2def68..e8cc2d9 100755 --- a/Admin/Routes/Web/Api.php +++ b/Admin/Routes/Web/Api.php @@ -48,15 +48,4 @@ return [ ], ], ], - '^.*/media/find.*$' => [ - [ - 'dest' => '\Modules\Media\Controller\ApiController:apiMediaFind', - 'verb' => RouteVerb::GET, - 'permission' => [ - 'module' => ApiController::MODULE_NAME, - 'type' => PermissionType::READ, - 'state' => PermissionState::MEDIA, - ], - ], - ], ]; diff --git a/Controller/ApiController.php b/Controller/ApiController.php index db6cbbf..91777b1 100755 --- a/Controller/ApiController.php +++ b/Controller/ApiController.php @@ -71,30 +71,6 @@ use phpOMS\Utils\Parser\Markdown\Markdown; */ final class ApiController extends Controller { - /** - * Api method to find media - * - * @param RequestAbstract $request Request - * @param ResponseAbstract $response Response - * @param mixed $data Generic data - * - * @return void - * - * @api - * - * @since 1.0.0 - */ - public function apiMediaFind(RequestAbstract $request, ResponseAbstract $response, $data = null) : void - { - $response->getHeader()->set('Content-Type', MimeType::M_JSON, true); - $response->set( - $request->getUri()->__toString(), - \array_values( - MediaMapper::find((string) ($request->getData('search') ?? '')) - ) - ); - } - /** * Api method to upload media file. * diff --git a/Controller/BackendController.php b/Controller/BackendController.php index 838e761..1b25940 100755 --- a/Controller/BackendController.php +++ b/Controller/BackendController.php @@ -21,7 +21,6 @@ use Modules\Media\Models\Media; use Modules\Media\Models\MediaMapper; use Modules\Media\Models\NullMedia; use Modules\Media\Views\MediaView; -use phpOMS\Asset\AssetType; use phpOMS\Contract\RenderableInterface; use phpOMS\Message\RequestAbstract; use phpOMS\Message\ResponseAbstract; @@ -89,24 +88,7 @@ final class BackendController extends Controller */ protected static array $dependencies = []; - /** - * Routing end-point for application behaviour. - * - * @param RequestAbstract $request Request - * @param ResponseAbstract $response Response - * @param mixed $data Generic data - * - * @return void - * - * @since 1.0.0 - * @codeCoverageIgnore - */ - public static function setUpFileUploader(RequestAbstract $request, ResponseAbstract $response, $data = null) : void - { - /** @var \phpOMS\Model\Html\Head $head */ - $head = $response->get('Content')->getData('head'); - $head->addAsset(AssetType::JSLATE, 'Modules/Media/Controller.js', ['type' => 'module']); - } + use FileUploaderTrait; /** * Routing end-point for application behaviour. diff --git a/Models/FileUploaderTrait.php b/Controller/FileUploaderTrait.php similarity index 76% rename from Models/FileUploaderTrait.php rename to Controller/FileUploaderTrait.php index db6825b..368ce50 100755 --- a/Models/FileUploaderTrait.php +++ b/Controller/FileUploaderTrait.php @@ -4,7 +4,7 @@ * * PHP Version 7.4 * - * @package Modules\Media\Models + * @package Modules\Media\Controller * @copyright Dennis Eichhorn * @license OMS License 1.0 * @version 1.0.0 @@ -12,7 +12,7 @@ */ declare(strict_types=1); -namespace Modules\Media\Models; +namespace Modules\Media\Controller; use phpOMS\Asset\AssetType; use phpOMS\Message\RequestAbstract; @@ -21,7 +21,7 @@ use phpOMS\Message\ResponseAbstract; /** * Options trait. * - * @package Modules\Media\Models + * @package Modules\Media\Controller * @license OMS License 1.0 * @link https://orange-management.org * @since 1.0.0 @@ -38,8 +38,9 @@ trait FileUploaderTrait * @return void * * @since 1.0.0 + * @codeCoverageIgnore */ - public function setUpFileUploader(RequestAbstract $request, ResponseAbstract $response, $data = null) : void + public function setUpFileUploaderTrait(RequestAbstract $request, ResponseAbstract $response, $data = null) : void { $head = $response->getHead(); $head->addAsset(AssetType::JS, '/Modules/Media/ModuleMedia.js'); diff --git a/Models/Media.php b/Models/Media.php index 8457807..41ab657 100755 --- a/Models/Media.php +++ b/Models/Media.php @@ -249,7 +249,7 @@ class Media implements \JsonSerializable */ public function setPassword(?string $password) : void { - $this->password = $password; + $this->password = \password_hash($password, \PASSWORD_DEFAULT); } /** @@ -546,6 +546,8 @@ class Media implements \JsonSerializable 'hidden' => $this->hidden, 'path' => $this->path, 'absolute' => $this->isAbsolute, + 'createdBy' => $this->createdBy, + 'createdAt' => $this->createdAt, ]; } diff --git a/Views/MediaView.php b/Views/MediaView.php index ba6396c..e87a049 100755 --- a/Views/MediaView.php +++ b/Views/MediaView.php @@ -87,10 +87,10 @@ class MediaView extends View * * @since 1.0.0 */ - protected function isCollectionFunction(Media $media, string $sub) : bool + protected function isCollectionFunction(Media $media, string $sub = null) : bool { return ($media->getExtension() === 'collection' - && !\is_file($media->getPath() . $sub)) + && !\is_file($media->getPath() . ($sub ?? ''))) || (\is_dir($media->getPath()) && ($sub === null || \is_dir($media->getPath() . $sub)) ); @@ -107,15 +107,16 @@ class MediaView extends View */ protected function getFileContent(string $path) : string { - $output = \file_get_contents($path); - - if ($output === false) { + if (!\is_file($path)) { return ''; } - $output = \str_replace(["\r\n", "\r"], "\n", $output); + $output = \file_get_contents($path); + if ($output === false) { + return ''; // @codeCoverageIgnore + } - return $output; + return \str_replace(["\r\n", "\r"], "\n", $output); } /** @@ -129,12 +130,15 @@ class MediaView extends View */ protected function lineContentFunction(string $path) : array { - $output = \file_get_contents($path); - - if ($output === false) { + if (!\is_file($path)) { return []; } + $output = \file_get_contents($path); + if ($output === false) { + return []; // @codeCoverageIgnore + } + $output = \str_replace(["\r\n", "\r"], "\n", $output); return \explode("\n", $output); @@ -150,7 +154,7 @@ class MediaView extends View * * @since 1.0.0 */ - protected function isImageFile(Media $media, string $path) : bool + protected function isImageFile(Media $media, string $path = '') : bool { return FileUtils::getExtensionType($media->getExtension()) === ExtensionType::IMAGE || FileUtils::getExtensionType(File::extension($path)) === ExtensionType::IMAGE; @@ -166,7 +170,7 @@ class MediaView extends View * * @since 1.0.0 */ - protected function isTextFile(Media $media, string $path) : bool + protected function isTextFile(Media $media, string $path = '') : bool { $mediaExtension = FileUtils::getExtensionType($media->getExtension()); $pathExtension = FileUtils::getExtensionType(File::extension($path)); diff --git a/tests/Admin/AdminTest.php b/tests/Admin/AdminTest.php index b43209f..0f380d4 100755 --- a/tests/Admin/AdminTest.php +++ b/tests/Admin/AdminTest.php @@ -33,11 +33,4 @@ class AdminTest extends \PHPUnit\Framework\TestCase Installer::installExternal($GLOBALS['dbpool'], ['path' => 'invalid.json']); } - - public function testInvalidMediaInstallJsonFile() : void - { - $this->expectException(\Exception::class); - - Installer::installExternal($GLOBALS['dbpool'], ['path' => 'invalidJson.json']); - } } diff --git a/tests/Admin/invalidJson.json b/tests/Admin/invalidJson.json deleted file mode 100644 index fa613c1..0000000 --- a/tests/Admin/invalidJson.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "test": [], -} \ No newline at end of file diff --git a/tests/Models/CollectionMapperTest.php b/tests/Models/CollectionMapperTest.php new file mode 100644 index 0000000..d127f65 --- /dev/null +++ b/tests/Models/CollectionMapperTest.php @@ -0,0 +1,55 @@ +setCreatedBy(new NullAccount(1)); + $media->setDescription('desc'); + $media->setDescriptionRaw('descRaw'); + $media->setPath('some/path'); + $media->setSize(11); + $media->setName('Collection'); + $id = CollectionMapper::create($media); + + self::assertGreaterThan(0, $media->getId()); + self::assertEquals($id, $media->getId()); + + $mediaR = CollectionMapper::get($media->getId()); + self::assertEquals($media->getCreatedAt()->format('Y-m-d'), $mediaR->getCreatedAt()->format('Y-m-d')); + self::assertEquals($media->getCreatedBy()->getId(), $mediaR->getCreatedBy()->getId()); + self::assertEquals($media->getDescription(), $mediaR->getDescription()); + self::assertEquals($media->getDescriptionRaw(), $mediaR->getDescriptionRaw()); + self::assertEquals($media->getPath(), $mediaR->getPath()); + self::assertEquals($media->isAbsolute(), $mediaR->isAbsolute()); + self::assertEquals($media->getSize(), $mediaR->getSize()); + self::assertEquals($media->getExtension(), $mediaR->getExtension()); + self::assertEquals($media->getName(), $mediaR->getName()); + } +} diff --git a/tests/Models/CollectionTest.php b/tests/Models/CollectionTest.php index 15b22bc..b83787e 100755 --- a/tests/Models/CollectionTest.php +++ b/tests/Models/CollectionTest.php @@ -131,4 +131,21 @@ class CollectionTest extends \PHPUnit\Framework\TestCase $this->media->addSource($d = new NullMedia(4)); self::assertEquals([$a, $b, $c, $d], $this->media->getSources()); } + + /** + * @covers Modules\Media\Models\Collection + * @group module + */ + public function testIteration() : void + { + $this->media->setSources([$a = new NullMedia(1), $b = new NullMedia(2), $c = new NullMedia(3)]); + + foreach ($this->media as $key => $media) { + if ($media->getId() !== $key + 1) { + self::assertEquals($key + 1, $media->getId()); + } + } + + self::assertTrue(true); + } } diff --git a/tests/Models/MediaMapperTest.php b/tests/Models/MediaMapperTest.php index deef31d..3372643 100755 --- a/tests/Models/MediaMapperTest.php +++ b/tests/Models/MediaMapperTest.php @@ -17,6 +17,8 @@ namespace Modules\Media\tests\Models; use Modules\Admin\Models\NullAccount; use Modules\Media\Models\Media; use Modules\Media\Models\MediaMapper; +use Modules\Media\Models\CollectionMapper; +use Modules\Media\Models\Collection; /** * @internal @@ -113,4 +115,74 @@ class MediaMapperTest extends \PHPUnit\Framework\TestCase self::assertEquals($media->getExtension(), $mediaR->getExtension()); self::assertEquals($media->getName(), $mediaR->getName()); } + + /** + * @covers Modules\Media\Models\MediaMapper + * @group module + */ + public function testGetVirtualPath() : void + { + $media = new Media(); + $media->setCreatedBy(new NullAccount(1)); + $media->setDescription('desc'); + $media->setPath('https://avatars0.githubusercontent.com/u/16034994'); + $media->setVirtualPath('/test/path'); + $media->setAbsolute(true); + $media->setSize(11); + $media->setExtension('png'); + $media->setName('Absolute path'); + $id = MediaMapper::create($media); + + self::assertGreaterThan(0, $media->getId()); + self::assertEquals($id, $media->getId()); + + $found = MediaMapper::getByVirtualPath($media->getVirtualPath()); + $mediaR = \reset($found); + self::assertEquals($media->getCreatedAt()->format('Y-m-d'), $mediaR->getCreatedAt()->format('Y-m-d')); + self::assertEquals($media->getCreatedBy()->getId(), $mediaR->getCreatedBy()->getId()); + self::assertEquals($media->getDescription(), $mediaR->getDescription()); + self::assertEquals($media->getPath(), $mediaR->getPath()); + self::assertEquals($media->isAbsolute(), $mediaR->isAbsolute()); + self::assertEquals($media->getSize(), $mediaR->getSize()); + self::assertEquals($media->getExtension(), $mediaR->getExtension()); + self::assertEquals($media->getName(), $mediaR->getName()); + } + + /** + * @covers Modules\Media\Models\MediaMapper + * @group module + */ + public function testParentcollection() : void + { + $collection = new Collection(); + $collection->setCreatedBy(new NullAccount(1)); + $collection->setDescription('desc'); + $collection->setDescriptionRaw('descRaw'); + $collection->setPath('some/path'); + $collection->setVirtualPath('/virtual/path'); + $collection->setSize(11); + $collection->setName('Collection'); + $idCollection = CollectionMapper::create($collection); + + self::assertGreaterThan(0, $collection->getId()); + self::assertEquals($idCollection, $collection->getId()); + + $media = new Media(); + $media->setCreatedBy(new NullAccount(1)); + $media->setDescription('desc'); + $media->setPath('https://avatars0.githubusercontent.com/u/16034994'); + $media->setVirtualPath('/virtual/path/Collection'); + $media->setAbsolute(true); + $media->setSize(11); + $media->setExtension('png'); + $media->setName('Absolute path'); + $idMedia = MediaMapper::create($media); + + self::assertGreaterThan(0, $media->getId()); + self::assertEquals($idMedia, $media->getId()); + + $collectionR = MediaMapper::getParentCollection($media->getVirtualPath()); + self::assertEquals($idCollection, $collectionR->getId()); + self::assertEquals($collection->getName(), $collectionR->getName()); + } } diff --git a/tests/Models/MediaTest.php b/tests/Models/MediaTest.php index cacab57..44244ef 100755 --- a/tests/Models/MediaTest.php +++ b/tests/Models/MediaTest.php @@ -47,6 +47,8 @@ class MediaTest extends \PHPUnit\Framework\TestCase self::assertEquals('/', $this->media->getVirtualPath()); self::assertEquals(0, $this->media->getSize()); self::assertFalse($this->media->isVersioned()); + self::assertFalse($this->media->compareNonce('something')); + self::assertFalse($this->media->isEncrypted()); } /** @@ -161,4 +163,67 @@ class MediaTest extends \PHPUnit\Framework\TestCase $this->media->setHidden(true); self::assertTrue($this->media->isHidden()); } + + /** + * @covers Modules\Media\Models\Media + * @group module + */ + public function testNonceInputOutput() : void + { + $this->media->setNonce('test'); + self::assertTrue($this->media->compareNonce('test')); + self::assertFalse($this->media->compareNonce('test2')); + self::assertTrue($this->media->isEncrypted()); + } + + /** + * @covers Modules\Media\Models\Media + * @group module + */ + public function testPasswordInputOutput() : void + { + $this->media->setPassword('test'); + self::assertTrue($this->media->comparePassword('test')); + self::assertFalse($this->media->comparePassword('test2')); + } + + /** + * @covers Modules\Media\Models\Media + * @group module + */ + public function testSerialize() : void + { + $this->media->setCreatedBy($acc = new NullAccount(1)); + $this->media->setExtension('pdf'); + $this->media->setPath('/home/root'); + $this->media->setAbsolute(true); + $this->media->setName('Report'); + $this->media->setDescription('This is a description'); + $this->media->setDescriptionRaw('This is a description raw'); + $this->media->setSize(11); + $this->media->setVersioned(true); + $this->media->setVirtualPath('/test/path'); + $this->media->setHidden(true); + + self::assertEquals($this->media->toArray(), $this->media->jsonSerialize()); + + $arr = $this->media->toArray(); + unset($arr['createdAt']); + self::assertEquals( + [ + 'id' => 0, + 'createdBy' => $acc, + 'name' => 'Report', + 'description' => 'This is a description', + 'descriptionRaw' => 'This is a description raw', + 'extension' => 'pdf', + 'virtualpath' => '/test/path', + 'size' => 11, + 'hidden' => true, + 'path' => '/home/root', + 'absolute' => true, + ], + $arr + ); + } } diff --git a/tests/Models/NullCollectionTest.php b/tests/Models/NullCollectionTest.php new file mode 100644 index 0000000..c593f8c --- /dev/null +++ b/tests/Models/NullCollectionTest.php @@ -0,0 +1,42 @@ +getId()); + } +} diff --git a/tests/Models/NullMediaTest.php b/tests/Models/NullMediaTest.php new file mode 100644 index 0000000..3386e06 --- /dev/null +++ b/tests/Models/NullMediaTest.php @@ -0,0 +1,42 @@ +getId()); + } +} diff --git a/tests/Views/MediaViewTest.php b/tests/Views/MediaViewTest.php new file mode 100644 index 0000000..acb12e0 --- /dev/null +++ b/tests/Views/MediaViewTest.php @@ -0,0 +1,234 @@ +view = new MediaView(); + } + + /** + * @covers Modules\Media\Views\MediaView + * @group module + */ + public function testFilePath() : void + { + $method = new \ReflectionMethod($this->view, 'filePathFunction'); + $method->setAccessible(true); + + $media = new Media(); + $media->setPath(__DIR__); + self::assertEquals( + \ltrim(__DIR__, '/'), + $method->invoke($this->view, $media, '/sub/path') + ); + + $media->setPath(__DIR__); + $media->setAbsolute(true); + self::assertEquals( + __DIR__ . '/MediaViewTest.php', + $method->invoke($this->view, $media, '/MediaViewTest.php') + ); + } + + /** + * @covers Modules\Media\Views\MediaView + * @group module + */ + public function testDirPath() : void + { + $method = new \ReflectionMethod($this->view, 'dirPathFunction'); + $method->setAccessible(true); + + $media = new Media(); + $media->setPath(__DIR__); + self::assertEquals( + \ltrim(__DIR__, '/'), + $method->invoke($this->view, $media, '/sub/path') + ); + + $media->setPath(\realpath(__DIR__ . '/../')); + $media->setAbsolute(true); + self::assertEquals( + \realpath(__DIR__ . '/../Controller'), + $method->invoke($this->view, $media, '/Controller') + ); + } + + /** + * @covers Modules\Media\Views\MediaView + * @group module + */ + public function testIscollection() : void + { + $method = new \ReflectionMethod($this->view, 'isCollectionFunction'); + $method->setAccessible(true); + + $media = new Media(); + $media->setPath(__DIR__); + $media->setAbsolute(true); + self::assertFalse( + $method->invoke($this->view, $media, '/sub/path') + ); + + $media->setPath(__DIR__); + $media->setAbsolute(true); + $media->setExtension('collection'); + self::assertFalse( + $method->invoke($this->view, $media, '/MediaViewTest.php') + ); + + $media->setPath(__DIR__ . '/../'); + $media->setAbsolute(true); + self::assertTrue( + $method->invoke($this->view, $media, '/Views/') + ); + + $media->setPath(__DIR__); + $media->setAbsolute(true); + $media->setExtension('collection'); + self::assertTrue( + $method->invoke($this->view, $media, '/something') + ); + } + + /** + * @covers Modules\Media\Views\MediaView + * @group module + */ + public function testFileContent() : void + { + $method = new \ReflectionMethod($this->view, 'getFileContent'); + $method->setAccessible(true); + + self::assertEquals( + "Line 1\nLine 2", + $method->invoke($this->view, __DIR__ . '/test.md') + ); + } + + /** + * @covers Modules\Media\Views\MediaView + * @group module + */ + public function testInvalidFileContentPath() : void + { + $method = new \ReflectionMethod($this->view, 'getFileContent'); + $method->setAccessible(true); + + self::assertEquals( + '', + $method->invoke($this->view, __DIR__ . '/invalid.txt') + ); + } + + /** + * @covers Modules\Media\Views\MediaView + * @group module + */ + public function testFileLineContent() : void + { + $method = new \ReflectionMethod($this->view, 'lineContentFunction'); + $method->setAccessible(true); + + self::assertEquals( + [ + 'Line 1', + 'Line 2', + ], + $method->invoke($this->view, __DIR__ . '/test.md') + ); + } + + /** + * @covers Modules\Media\Views\MediaView + * @group module + */ + public function testInvalidFileLineContentPath() : void + { + $method = new \ReflectionMethod($this->view, 'lineContentFunction'); + $method->setAccessible(true); + + self::assertEquals( + [], + $method->invoke($this->view, __DIR__ . '/invalid.txt') + ); + } + + /** + * @covers Modules\Media\Views\MediaView + * @group module + */ + public function testIsImage() : void + { + $method = new \ReflectionMethod($this->view, 'isImageFile'); + $method->setAccessible(true); + + $media = new Media(); + $media->setPath(__DIR__ . '/test.md'); + $media->setAbsolute(true); + self::assertFalse( + $method->invoke($this->view, $media) + ); + + $media->setPath(__DIR__ . '/test.jpg'); + $media->setExtension('jpg'); + $media->setAbsolute(true); + self::assertTrue( + $method->invoke($this->view, $media) + ); + } + + /** + * @covers Modules\Media\Views\MediaView + * @group module + */ + public function testIsText() : void + { + $method = new \ReflectionMethod($this->view, 'isTextFile'); + $method->setAccessible(true); + + $media = new Media(); + $media->setPath(__DIR__ . '/test.jpg'); + $media->setAbsolute(true); + self::assertFalse( + $method->invoke($this->view, $media) + ); + + $media->setPath(__DIR__ . '/test.md'); + $media->setExtension('md'); + $media->setAbsolute(true); + self::assertTrue( + $method->invoke($this->view, $media) + ); + + $media->setPath(__DIR__ . '/test.jpg'); + $media->setExtension('jpg'); + $media->setAbsolute(true); + self::assertTrue( + $method->invoke($this->view, $media, __DIR__ . '/test.md') + ); + } +} diff --git a/tests/Views/test.md b/tests/Views/test.md new file mode 100644 index 0000000..caaa7fd --- /dev/null +++ b/tests/Views/test.md @@ -0,0 +1,2 @@ +Line 1 +Line 2 \ No newline at end of file