diff --git a/Controller/ApiController.php b/Controller/ApiController.php index 5b17204..078189b 100755 --- a/Controller/ApiController.php +++ b/Controller/ApiController.php @@ -644,7 +644,9 @@ final class ApiController extends Controller $view = new View($this->app->l11nManager, $request, $response); $view->setData('media', $media); - $response->endAllOutputBuffering(); // for large files + if (!\headers_sent()) { + $response->endAllOutputBuffering(); // for large files + } if (($type = $request->getData('type')) === null) { $view->setTemplate('/Modules/Media/Theme/Api/render'); @@ -652,7 +654,7 @@ final class ApiController extends Controller $head = new Head(); $css = \file_get_contents(__DIR__ . '/../../../Web/Backend/css/backend-small.css'); if ($css === false) { - $css = ''; + $css = ''; // @codeCoverageIgnore } $css = \preg_replace('!\s+!', ' ', $css); @@ -712,12 +714,11 @@ final class ApiController extends Controller case 'txt': case 'cfg': case 'log': - $response->header->set('Content-Type', MimeType::M_TXT, true); - break; case 'md': $response->header->set('Content-Type', MimeType::M_TXT, true); break; case 'csv': + case 'json': $response->header->set('Content-Type', MimeType::M_CSV, true); break; case 'xls': @@ -738,9 +739,6 @@ final class ApiController extends Controller case 'pptx': $response->header->set('Content-Type', MimeType::M_PPTX, true); break; - case 'json': - $response->header->set('Content-Type', MimeType::M_CSV, true); - break; case 'jpg': case 'jpeg': $response->header->set('Content-Type', MimeType::M_JPG, true); diff --git a/Models/Collection.php b/Models/Collection.php index ae703fe..6580cc6 100755 --- a/Models/Collection.php +++ b/Models/Collection.php @@ -43,10 +43,10 @@ class Collection extends Media implements \Iterator /** * Is collection. * - * @var int + * @var bool * @since 1.0.0 */ - protected int $collection = 1; + protected bool $collection = true; /** * Set sources. @@ -108,20 +108,6 @@ class Collection extends Media implements \Iterator return new NullMedia(); } - /** - * {@inheritdoc} - */ - public function setExtension(string $extension) : void - { - } - - /** - * {@inheritdoc} - */ - public function setVersioned(bool $versioned) : void - { - } - /** * {@inheritdoc} */ diff --git a/Models/Media.php b/Models/Media.php index 041319b..7ac1bc8 100755 --- a/Models/Media.php +++ b/Models/Media.php @@ -160,10 +160,10 @@ class Media implements \JsonSerializable /** * Is collection. * - * @var int + * @var bool * @since 1.0.0 */ - protected int $collection = 0; + protected bool $collection = false; /** * Tags. diff --git a/Models/MediaMapper.php b/Models/MediaMapper.php index 2b4086c..94278f2 100755 --- a/Models/MediaMapper.php +++ b/Models/MediaMapper.php @@ -50,7 +50,7 @@ class MediaMapper extends DataMapperAbstract 'media_password' => ['name' => 'media_password', 'type' => 'string', 'internal' => 'password'], 'media_extension' => ['name' => 'media_extension', 'type' => 'string', 'internal' => 'extension'], 'media_size' => ['name' => 'media_size', 'type' => 'int', 'internal' => 'size'], - 'media_collection' => ['name' => 'media_collection', 'type' => 'int', 'internal' => 'collection'], + 'media_collection' => ['name' => 'media_collection', 'type' => 'bool', 'internal' => 'collection'], 'media_created_by' => ['name' => 'media_created_by', 'type' => 'int', 'internal' => 'createdBy', 'readonly' => true], 'media_created_at' => ['name' => 'media_created_at', 'type' => 'DateTimeImmutable', 'internal' => 'createdAt', 'readonly' => true], ]; diff --git a/Models/MediaType.php b/Models/MediaType.php index b74d631..3533f70 100644 --- a/Models/MediaType.php +++ b/Models/MediaType.php @@ -38,6 +38,8 @@ class MediaType implements \JsonSerializable, ArrayableInterface /** * Name. * + * Name used for additional identification, doesn't have to be unique. + * * @var string * @since 1.0.0 */ @@ -49,7 +51,19 @@ class MediaType implements \JsonSerializable, ArrayableInterface * @var string|MediaTypeL11n * @since 1.0.0 */ - protected $title = ''; + protected $title; + + /** + * Constructor. + * + * @param string $name Name + * + * @since 1.0.0 + */ + public function __construct(string $name = '') + { + $this->setL11n($name); + } /** * Get id diff --git a/tests/Controller/Api/ApiControllerMediaTrait.php b/tests/Controller/Api/ApiControllerMediaTrait.php index 1e33f5f..eac7f6d 100755 --- a/tests/Controller/Api/ApiControllerMediaTrait.php +++ b/tests/Controller/Api/ApiControllerMediaTrait.php @@ -15,6 +15,7 @@ declare(strict_types=1); namespace Modules\Media\tests\Controller\Api; use Modules\Media\Models\MediaMapper; +use Modules\Media\Models\Media; use Modules\Media\Models\PathSettings; use Modules\Media\Models\UploadStatus; use phpOMS\Message\Http\HttpRequest; @@ -22,6 +23,7 @@ use phpOMS\Message\Http\HttpResponse; use phpOMS\System\File\Local\Directory; use phpOMS\Uri\HttpUri; use phpOMS\Utils\TestUtils; +use phpOMS\System\MimeType; trait ApiControllerMediaTrait { @@ -73,6 +75,7 @@ trait ApiControllerMediaTrait $request->header->account = 1; $request->setData('name', 'Test Upload'); + $request->setData('tags', '[{"title": "TestTitle", "color": "#f0f", "language": "en"}, {"id": 1}]'); if (!\is_dir(__DIR__ . '/temp')) { \mkdir(__DIR__ . '/temp'); @@ -257,4 +260,334 @@ trait ApiControllerMediaTrait Directory::delete(__DIR__ . '/../test'); } + + /** + * @covers Modules\Media\Controller\ApiController + * @group module + */ + public function testCreateView() : void + { + $media = new Media(); + + $response = new HttpResponse(); + $request = new HttpRequest(new HttpUri('')); + + $request->header->account = 1; + $request->setData('type', 'html'); + + $media->extension = 'xls'; + self::assertInstanceOf('\phpOMS\Views\View', $this->module->createView($media, $request, $response)); + + $media->extension = 'docx'; + self::assertInstanceOf('\phpOMS\Views\View', $this->module->createView($media, $request, $response)); + + $request->setData('type', null, true); + self::assertInstanceOf('\phpOMS\Views\View', $this->module->createView($media, $request, $response)); + } + + /** + * @covers Modules\Media\Controller\ApiController + * @group module + */ + public function testApiMediaExportHTM() : void + { + $response = new HttpResponse(); + $request = new HttpRequest(new HttpUri('')); + + $request->header->account = 1; + $request->setData('id', '1'); + $request->setData('type', 'htm'); + + $this->module->apiMediaExport($request, $response); + self::assertEquals(MimeType::M_HTML, $response->header->get('Content-Type')[0]); + } + + /** + * @covers Modules\Media\Controller\ApiController + * @group module + */ + public function testApiMediaExportPDF() : void + { + $response = new HttpResponse(); + $request = new HttpRequest(new HttpUri('')); + + $request->header->account = 1; + $request->setData('id', '1'); + $request->setData('type', 'pdf'); + + $this->module->apiMediaExport($request, $response); + self::assertEquals(MimeType::M_PDF, $response->header->get('Content-Type')[0]); + } + + /** + * @covers Modules\Media\Controller\ApiController + * @group module + */ + public function testApiMediaExportC() : void + { + $response = new HttpResponse(); + $request = new HttpRequest(new HttpUri('')); + + $request->header->account = 1; + $request->setData('id', '1'); + $request->setData('type', 'c'); + + $this->module->apiMediaExport($request, $response); + self::assertEquals(MimeType::M_TXT, $response->header->get('Content-Type')[0]); + } + + /** + * @covers Modules\Media\Controller\ApiController + * @group module + */ + public function testApiMediaExportTXT() : void + { + $response = new HttpResponse(); + $request = new HttpRequest(new HttpUri('')); + + $request->header->account = 1; + $request->setData('id', '1'); + $request->setData('type', 'txt'); + + $this->module->apiMediaExport($request, $response); + self::assertEquals(MimeType::M_TXT, $response->header->get('Content-Type')[0]); + } + + /** + * @covers Modules\Media\Controller\ApiController + * @group module + */ + public function testApiMediaExportCSV() : void + { + $response = new HttpResponse(); + $request = new HttpRequest(new HttpUri('')); + + $request->header->account = 1; + $request->setData('id', '1'); + $request->setData('type', 'csv'); + + $this->module->apiMediaExport($request, $response); + self::assertEquals(MimeType::M_CSV, $response->header->get('Content-Type')[0]); + } + + /** + * @covers Modules\Media\Controller\ApiController + * @group module + */ + public function testApiMediaExportXLS() : void + { + $response = new HttpResponse(); + $request = new HttpRequest(new HttpUri('')); + + $request->header->account = 1; + $request->setData('id', '1'); + $request->setData('type', 'xls'); + + $this->module->apiMediaExport($request, $response); + self::assertEquals(MimeType::M_XLS, $response->header->get('Content-Type')[0]); + } + + /** + * @covers Modules\Media\Controller\ApiController + * @group module + */ + public function testApiMediaExportXLSX() : void + { + $response = new HttpResponse(); + $request = new HttpRequest(new HttpUri('')); + + $request->header->account = 1; + $request->setData('id', '1'); + $request->setData('type', 'xlsx'); + + $this->module->apiMediaExport($request, $response); + self::assertEquals(MimeType::M_XLSX, $response->header->get('Content-Type')[0]); + } + + /** + * @covers Modules\Media\Controller\ApiController + * @group module + */ + public function testApiMediaExportDOC() : void + { + $response = new HttpResponse(); + $request = new HttpRequest(new HttpUri('')); + + $request->header->account = 1; + $request->setData('id', '1'); + $request->setData('type', 'doc'); + + $this->module->apiMediaExport($request, $response); + self::assertEquals(MimeType::M_DOC, $response->header->get('Content-Type')[0]); + } + + /** + * @covers Modules\Media\Controller\ApiController + * @group module + */ + public function testApiMediaExportDOCX() : void + { + $response = new HttpResponse(); + $request = new HttpRequest(new HttpUri('')); + + $request->header->account = 1; + $request->setData('id', '1'); + $request->setData('type', 'docx'); + + $this->module->apiMediaExport($request, $response); + self::assertEquals(MimeType::M_DOCX, $response->header->get('Content-Type')[0]); + } + + /** + * @covers Modules\Media\Controller\ApiController + * @group module + */ + public function testApiMediaExportPPT() : void + { + $response = new HttpResponse(); + $request = new HttpRequest(new HttpUri('')); + + $request->header->account = 1; + $request->setData('id', '1'); + $request->setData('type', 'ppt'); + + $this->module->apiMediaExport($request, $response); + self::assertEquals(MimeType::M_PPT, $response->header->get('Content-Type')[0]); + } + + /** + * @covers Modules\Media\Controller\ApiController + * @group module + */ + public function testApiMediaExportPPTX() : void + { + $response = new HttpResponse(); + $request = new HttpRequest(new HttpUri('')); + + $request->header->account = 1; + $request->setData('id', '1'); + $request->setData('type', 'pptx'); + + $this->module->apiMediaExport($request, $response); + self::assertEquals(MimeType::M_PPTX, $response->header->get('Content-Type')[0]); + } + + /** + * @covers Modules\Media\Controller\ApiController + * @group module + */ + public function testApiMediaExportJPG() : void + { + $response = new HttpResponse(); + $request = new HttpRequest(new HttpUri('')); + + $request->header->account = 1; + $request->setData('id', '1'); + $request->setData('type', 'jpg'); + + $this->module->apiMediaExport($request, $response); + self::assertEquals(MimeType::M_JPG, $response->header->get('Content-Type')[0]); + } + + /** + * @covers Modules\Media\Controller\ApiController + * @group module + */ + public function testApiMediaExportGIF() : void + { + $response = new HttpResponse(); + $request = new HttpRequest(new HttpUri('')); + + $request->header->account = 1; + $request->setData('id', '1'); + $request->setData('type', 'gif'); + + $this->module->apiMediaExport($request, $response); + self::assertEquals(MimeType::M_GIF, $response->header->get('Content-Type')[0]); + } + + /** + * @covers Modules\Media\Controller\ApiController + * @group module + */ + public function testApiMediaExportPNG() : void + { + $response = new HttpResponse(); + $request = new HttpRequest(new HttpUri('')); + + $request->header->account = 1; + $request->setData('id', '1'); + $request->setData('type', 'png'); + + $this->module->apiMediaExport($request, $response); + self::assertEquals(MimeType::M_PNG, $response->header->get('Content-Type')[0]); + } + + /** + * @covers Modules\Media\Controller\ApiController + * @group module + */ + public function testApiMediaExportMP3() : void + { + $response = new HttpResponse(); + $request = new HttpRequest(new HttpUri('')); + + $request->header->account = 1; + $request->setData('id', '1'); + $request->setData('type', 'mp3'); + + $this->module->apiMediaExport($request, $response); + self::assertEquals(MimeType::M_MP3, $response->header->get('Content-Type')[0]); + } + + /** + * @covers Modules\Media\Controller\ApiController + * @group module + */ + public function testApiMediaExportMP4() : void + { + $response = new HttpResponse(); + $request = new HttpRequest(new HttpUri('')); + + $request->header->account = 1; + $request->setData('id', '1'); + $request->setData('type', 'mp4'); + + $this->module->apiMediaExport($request, $response); + self::assertEquals(MimeType::M_MP4, $response->header->get('Content-Type')[0]); + } + + /** + * @covers Modules\Media\Controller\ApiController + * @group module + */ + public function testApiMediaExportMPEG() : void + { + $response = new HttpResponse(); + $request = new HttpRequest(new HttpUri('')); + + $request->header->account = 1; + $request->setData('id', '1'); + $request->setData('type', 'mpeg'); + + $this->module->apiMediaExport($request, $response); + self::assertEquals(MimeType::M_MPEG, $response->header->get('Content-Type')[0]); + } + + /** + * @covers Modules\Media\Controller\ApiController + * @group module + */ + public function testApiMediaExportBIN() : void + { + $response = new HttpResponse(); + $request = new HttpRequest(new HttpUri('')); + + $request->header->account = 1; + $request->setData('id', '1'); + $request->setData('type', 'exe'); + + $this->module->apiMediaExport($request, $response); + self::assertEquals(MimeType::M_BIN, $response->header->get('Content-Type')[0]); + } } diff --git a/tests/Models/CollectionMapperTest.php b/tests/Models/CollectionMapperTest.php index 3309e0e..5aba24c 100755 --- a/tests/Models/CollectionMapperTest.php +++ b/tests/Models/CollectionMapperTest.php @@ -34,6 +34,7 @@ final class CollectionMapperTest extends \PHPUnit\Framework\TestCase $media->description = 'desc'; $media->descriptionRaw = 'descRaw'; $media->setPath('some/path'); + $media->setVirtualPath('/some/path'); $media->size = 11; $media->name = 'Collection'; $id = CollectionMapper::create($media); @@ -51,5 +52,8 @@ final class CollectionMapperTest extends \PHPUnit\Framework\TestCase self::assertEquals($media->size, $mediaR->size); self::assertEquals($media->extension, $mediaR->extension); self::assertEquals($media->name, $mediaR->name); + + self::assertGreaterThan(0, \count(CollectionMapper::getByVirtualPath('/some/path'))); + self::assertGreaterThan(0, \count(CollectionMapper::getCollectionsByPath('/', true))); } } diff --git a/tests/Models/CollectionTest.php b/tests/Models/CollectionTest.php index 166bf01..c2c2d85 100755 --- a/tests/Models/CollectionTest.php +++ b/tests/Models/CollectionTest.php @@ -49,6 +49,7 @@ final class CollectionTest extends \PHPUnit\Framework\TestCase self::assertEquals(0, $this->media->size); self::assertFalse($this->media->isVersioned); self::assertEquals([], $this->media->getSources()); + self::assertInstanceOf('\Modules\Media\Models\NullMedia', $this->media->getSourceByName('invalid')); } /** @@ -121,7 +122,10 @@ final class CollectionTest extends \PHPUnit\Framework\TestCase public function testSourceInputOutput() : void { $this->media->setSources([$a = new NullMedia(1), $b = new NullMedia(2), $c = new NullMedia(3)]); + + $b->name = 'test'; self::assertEquals([$a, $b, $c], $this->media->getSources()); + self::assertEquals($b, $this->media->getSourceByName('test')); } /** diff --git a/tests/Models/MediaTest.php b/tests/Models/MediaTest.php index 6c56ea7..5beee99 100755 --- a/tests/Models/MediaTest.php +++ b/tests/Models/MediaTest.php @@ -16,6 +16,7 @@ namespace Modules\Media\tests\Models; use Modules\Admin\Models\NullAccount; use Modules\Media\Models\Media; +use Modules\Tag\Models\Tag; /** * @internal @@ -190,6 +191,35 @@ final class MediaTest extends \PHPUnit\Framework\TestCase self::assertFalse($this->media->comparePassword('test2')); } + /** + * @covers Modules\Media\Models\Media + * @group module + */ + public function testTagInputOutput() : void + { + $tag = new Tag(); + $tag->setL11n('Tag'); + + $this->media->addTag($tag); + self::assertEquals($tag, $this->media->getTag(0)); + self::assertCount(1, $this->media->getTags()); + } + + /** + * @covers Modules\Media\Models\Media + * @group module + */ + public function testTagRemove() : void + { + $tag = new Tag(); + $tag->setL11n('Tag'); + + $this->media->addTag($tag); + self::assertTrue($this->media->removeTag(0)); + self::assertCount(0, $this->media->getTags()); + self::assertFalse($this->media->removeTag(0)); + } + /** * @covers Modules\Media\Models\Media * @group module diff --git a/tests/Models/MediaTypeL11nTest.php b/tests/Models/MediaTypeL11nTest.php new file mode 100644 index 0000000..4006ad2 --- /dev/null +++ b/tests/Models/MediaTypeL11nTest.php @@ -0,0 +1,87 @@ +l11n = new MediaTypeL11n(); + } + + /** + * @covers Modules\Media\Models\MediaTypeL11n + * @group module + */ + public function testDefault() : void + { + self::assertEquals(0, $this->l11n->getId()); + self::assertEquals('', $this->l11n->title); + self::assertEquals(0, $this->l11n->type); + self::assertEquals(ISO639x1Enum::_EN, $this->l11n->getLanguage()); + } + + /** + * @covers Modules\Media\Models\MediaTypeL11n + * @group module + */ + public function testNameInputOutput() : void + { + $this->l11n->title = 'TestName'; + self::assertEquals('TestName', $this->l11n->title); + } + + /** + * @covers Modules\Media\Models\MediaTypeL11n + * @group module + */ + public function testLanguageInputOutput() : void + { + $this->l11n->setLanguage(ISO639x1Enum::_DE); + self::assertEquals(ISO639x1Enum::_DE, $this->l11n->getLanguage()); + } + + /** + * @covers Modules\Media\Models\MediaTypeL11n + * @group module + */ + public function testSerialize() : void + { + $this->l11n->title = 'Title'; + $this->l11n->type = 2; + $this->l11n->setLanguage(ISO639x1Enum::_DE); + + self::assertEquals( + [ + 'id' => 0, + 'title' => 'Title', + 'type' => 2, + 'language' => ISO639x1Enum::_DE, + ], + $this->l11n->jsonSerialize() + ); + } +} diff --git a/tests/Models/MediaTypeTest.php b/tests/Models/MediaTypeTest.php new file mode 100644 index 0000000..740ef67 --- /dev/null +++ b/tests/Models/MediaTypeTest.php @@ -0,0 +1,77 @@ +type = new MediaType(); + } + + /** + * @covers Modules\Media\Models\MediaType + * @group module + */ + public function testDefault() : void + { + self::assertEquals(0, $this->type->getId()); + self::assertEquals('', $this->type->name); + } + + /** + * @covers Modules\Media\Models\MediaType + * @group module + */ + public function testL11nInputOutput() : void + { + $this->type->setL11n('Test1'); + self::assertEquals('Test1', $this->type->getL11n()); + + $this->type->setL11n(new MediaTypeL11n('Test2')); + self::assertEquals('Test2', $this->type->getL11n()); + } + + /** + * @covers Modules\Media\Models\MediaType + * @group module + */ + public function testSerialize() : void + { + $this->type->name = 'Name'; + + $serialized = $this->type->jsonSerialize(); + unset($serialized['title']); + + self::assertEquals( + [ + 'id' => 0, + 'name' => 'Name', + ], + $serialized + ); + } +} diff --git a/tests/Views/Audio.mp3 b/tests/Views/Audio.mp3 new file mode 100644 index 0000000..7f9c105 Binary files /dev/null and b/tests/Views/Audio.mp3 differ diff --git a/tests/Views/MediaViewTest.php b/tests/Views/MediaViewTest.php index 803a540..089b6b6 100755 --- a/tests/Views/MediaViewTest.php +++ b/tests/Views/MediaViewTest.php @@ -234,4 +234,38 @@ final class MediaViewTest extends \PHPUnit\Framework\TestCase $method->invoke($this->view, $media, __DIR__ . '/test.md') ); } + + /** + * @covers Modules\Media\Views\MediaView + * @group module + */ + public function testIsVideo() : void + { + $method = new \ReflectionMethod($this->view, 'isVideoFile'); + $method->setAccessible(true); + + $media = new Media(); + $media->setPath(__DIR__ . '/Video.mp4'); + $media->isAbsolute = true; + self::assertFalse( + $method->invoke($this->view, $media) + ); + } + + /** + * @covers Modules\Media\Views\MediaView + * @group module + */ + public function testIsAudio() : void + { + $method = new \ReflectionMethod($this->view, 'isAudioFile'); + $method->setAccessible(true); + + $media = new Media(); + $media->setPath(__DIR__ . '/Audio.mp4'); + $media->isAbsolute = true; + self::assertFalse( + $method->invoke($this->view, $media) + ); + } } diff --git a/tests/Views/Video.mp4 b/tests/Views/Video.mp4 new file mode 100644 index 0000000..b1d79a8 Binary files /dev/null and b/tests/Views/Video.mp4 differ diff --git a/tests/phpunit_default.xml b/tests/phpunit_default.xml index 722365c..9208c99 100755 --- a/tests/phpunit_default.xml +++ b/tests/phpunit_default.xml @@ -1,5 +1,5 @@ - + *vendor*