diff --git a/Classes/Controller/MediaController.php b/Classes/Controller/MediaController.php index 85d55bf6..746b5c68 100644 --- a/Classes/Controller/MediaController.php +++ b/Classes/Controller/MediaController.php @@ -25,6 +25,7 @@ use TYPO3\CMS\Extbase\Mvc\Controller\ActionController; use TYPO3\CMS\Extbase\Utility\LocalizationUtility; use TYPO3\CMS\Frontend\ContentObject\ContentObjectRenderer; +use RuntimeException; /** * Controller for rendering media. @@ -94,7 +95,7 @@ private function renderMedia(Media $media): ResponseInterface // We update the last changed register when a media record has changed because // the content element will not get this information if no properties in the // content element are changed. - $contentObject = $contentObject = $this->getCurrentContentObject(); + $contentObject = $this->getCurrentContentObject(); $contentObject->lastChanged($media->getTstamp()); if ($mediaType->equals(MediaType::VIDEO)) { @@ -105,7 +106,7 @@ private function renderMedia(Media $media): ResponseInterface return (new ForwardResponse('audio'))->withArguments(['audio' => $media->getUid()]); } - throw new \RuntimeException('An invalid media type is used.'); + throw new RuntimeException('An invalid media type is used.'); // @codeCoverageIgnore } /** diff --git a/Classes/Domain/Model/Enumeration/MediaType.php b/Classes/Domain/Model/Enumeration/MediaType.php index daf76e13..2555ee48 100644 --- a/Classes/Domain/Model/Enumeration/MediaType.php +++ b/Classes/Domain/Model/Enumeration/MediaType.php @@ -18,6 +18,8 @@ /** * Enumeration of allowed media types. + * + * @codeCoverageIgnore No code to test. */ class MediaType extends Enumeration { diff --git a/Classes/Domain/Repository/MediaRepository.php b/Classes/Domain/Repository/MediaRepository.php index 3dfda2c2..c96a8691 100644 --- a/Classes/Domain/Repository/MediaRepository.php +++ b/Classes/Domain/Repository/MediaRepository.php @@ -18,6 +18,7 @@ use Sto\Html5mediakit\Exception\MediaMissingException; use TYPO3\CMS\Extbase\Persistence\QueryInterface; use TYPO3\CMS\Extbase\Persistence\Repository; +use InvalidArgumentException; /** * Repository for retrieving media files from the database. @@ -76,10 +77,10 @@ private function fetchMediaOrThrowMissingMediaException(QueryInterface $query): private function validateParentRecordData($data): void { if (empty($data['parent_table'])) { - throw new \InvalidArgumentException('parent_table field is missing in content data.'); + throw new InvalidArgumentException('parent_table field is missing in content data.'); } if (empty($data['parent_record'])) { - throw new \InvalidArgumentException('parent_record field is missing in content data.'); + throw new InvalidArgumentException('parent_record field is missing in content data.'); } } } diff --git a/Classes/Exception/MediaException.php b/Classes/Exception/MediaException.php index 9b7322ba..b2680dc2 100644 --- a/Classes/Exception/MediaException.php +++ b/Classes/Exception/MediaException.php @@ -4,6 +4,8 @@ namespace Sto\Html5mediakit\Exception; +use RuntimeException; + /* * * This script belongs to the TYPO3 Extension "html5mediakit". * * * @@ -16,7 +18,9 @@ /** * Generic media related Exception. Translations should be available for the Exception code. + * + * @codeCoverageIgnore No code to test. */ -class MediaException extends \RuntimeException +class MediaException extends RuntimeException { } diff --git a/Classes/Exception/MediaMissingException.php b/Classes/Exception/MediaMissingException.php index d1117e52..853ce938 100644 --- a/Classes/Exception/MediaMissingException.php +++ b/Classes/Exception/MediaMissingException.php @@ -21,7 +21,7 @@ */ class MediaMissingException extends MediaException { - public function __construct($message = '', $code = 0, \Exception $previous = null) + public function __construct($message = '', $code = 0, Exception $previous = null) { if ($message === '') { $message = 'No media exists in the current content element.'; diff --git a/Configuration/TCA/Overrides/sys_file_reference.php b/Configuration/TCA/Overrides/sys_file_reference.php index d134e9f6..fd255b80 100644 --- a/Configuration/TCA/Overrides/sys_file_reference.php +++ b/Configuration/TCA/Overrides/sys_file_reference.php @@ -6,13 +6,6 @@ $lllPrefix = 'LLL:EXT:html5mediakit/Resources/Private/Language/locallang_db:sys_file_reference.'; -$displayCondition = [ - 'AND' => [ - 'FIELD:tablenames:=:tx_html5mediakit_domain_model_media', - 'FIELD:fieldname:=:tracks', - ], -]; - $additionalColumns = [ 'tx_html5mediakit_track_kind' => [ 'label' => $lllPrefix . 'tx_html5mediakit_track_kind', @@ -43,7 +36,6 @@ ], 'default' => 'subtitles', ], - 'displayCond' => $displayCondition, ], 'tx_html5mediakit_track_label' => [ 'label' => $lllPrefix . 'tx_html5mediakit_track_label', @@ -53,7 +45,6 @@ 'eval' => 'trim', 'size' => 10, ], - 'displayCond' => $displayCondition, ], 'tx_html5mediakit_track_srclang' => [ 'label' => $lllPrefix . 'tx_html5mediakit_track_srclang', @@ -65,7 +56,6 @@ 'max' => 2, 'size' => 10, ], - 'displayCond' => $displayCondition, ], ]; @@ -73,10 +63,3 @@ 'sys_file_reference', $additionalColumns ); - -ExtensionManagementUtility::addToAllTCAtypes( - 'sys_file_reference', - 'tx_html5mediakit_track_kind, tx_html5mediakit_track_label, tx_html5mediakit_track_srclang', - '', - 'after:title', -); diff --git a/Configuration/TCA/Overrides/tt_content.php b/Configuration/TCA/Overrides/tt_content.php index 859d141d..8ba4af76 100644 --- a/Configuration/TCA/Overrides/tt_content.php +++ b/Configuration/TCA/Overrides/tt_content.php @@ -43,6 +43,7 @@ --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:general, --palette--;;general, --palette--;;headers, + --div--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:tabs.media, tx_html5mediakit_media, --div--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:tabs.appearance, --palette--;;frames, diff --git a/Configuration/TCA/tx_html5mediakit_domain_model_media.php b/Configuration/TCA/tx_html5mediakit_domain_model_media.php index 5d474c16..597a517c 100644 --- a/Configuration/TCA/tx_html5mediakit_domain_model_media.php +++ b/Configuration/TCA/tx_html5mediakit_domain_model_media.php @@ -10,39 +10,58 @@ $languagePrefixCsh = 'LLL:EXT:html5mediakit/Resources/Private/Language/locallang_csh_media.xlf:'; $lllAddImageFileReference = 'LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:images.addFileReference'; -$buildFileFieldConfig = function (array $allowedFileTypes) use ($languagePrefix) { - return [ +$buildFileFieldConfig = function ( + string|array $allowedFileTypes, + int $maxitems = 1, + string $showitem = '', + string $createNewRelationLinkTitle = '', +) use ( + $languagePrefix +) { + $showitem .= ',--palette--;;filePalette'; + $showitem = ltrim($showitem, ','); + $allowsMultipleFiles = $maxitems === 0 || $maxitems > 1; + + if ($createNewRelationLinkTitle === '') { + $createNewRelationLinkTitle = $languagePrefix . 'choose_file'; + } + + $config = [ 'type' => 'file', 'allowed' => $allowedFileTypes, 'appearance' => [ - 'createNewRelationLinkTitle' => $languagePrefix . 'choose_file', - 'useSortable' => false, - 'headerThumbnail' => [ - 'field' => '', - 'width' => '0', - 'height' => '0', - ], + 'showPossibleLocalizationRecords' => true, + 'showAllLocalizationLink' => $allowsMultipleFiles, + 'createNewRelationLinkTitle' => $createNewRelationLinkTitle, + 'useSortable' => $allowsMultipleFiles, 'enabledControls' => [ - 'info' => false, - 'new' => false, - 'dragdrop' => false, - 'sort' => false, - 'hide' => false, + 'info' => true, + 'new' => $allowsMultipleFiles, + 'dragdrop' => $allowsMultipleFiles, + 'sort' => $allowsMultipleFiles, + 'hide' => $allowsMultipleFiles, 'delete' => true, - 'localize' => false, + 'localize' => true, ], ], 'overrideChildTca' => [ 'types' => [ - '0' => ['showitem' => '--palette--;;filePalette'], - AbstractFile::FILETYPE_AUDIO => ['showitem' => '--palette--;;filePalette'], - AbstractFile::FILETYPE_VIDEO => ['showitem' => '--palette--;;filePalette'], - AbstractFile::FILETYPE_APPLICATION => ['showitem' => '--palette--;;filePalette'], + AbstractFile::FILETYPE_APPLICATION => ['showitem' => $showitem], + AbstractFile::FILETYPE_AUDIO => ['showitem' => $showitem], + AbstractFile::FILETYPE_IMAGE => ['showitem' => $showitem], + AbstractFile::FILETYPE_TEXT => ['showitem' => $showitem], + AbstractFile::FILETYPE_UNKNOWN => ['showitem' => $showitem], + AbstractFile::FILETYPE_VIDEO => ['showitem' => $showitem], ], ], - 'maxitems' => 1, 'security' => ['ignorePageTypeRestriction' => true], ]; + + if ($maxitems > 0) { + $config['maxitems'] = $maxitems; + } + + return $config; }; return [ @@ -90,10 +109,11 @@ 'tracks' => [ 'label' => $languagePrefixColumn . 'tracks', 'description' => $languagePrefixCsh . 'tracks.description', - 'config' => [ - 'type' => 'file', - 'allowed' => 'vtt', - ], + 'config' => $buildFileFieldConfig( + ['vtt'], + 0, + 'tx_html5mediakit_track_kind, tx_html5mediakit_track_label, tx_html5mediakit_track_srclang', + ), ], 'caption' => [ 'label' => $languagePrefixColumn . 'caption', @@ -158,19 +178,10 @@ ], 'poster' => [ 'label' => $languagePrefixColumn . 'poster', - 'config' => [ - 'type' => 'file', - 'allowed' => 'common-image-types', - 'appearance' => ['createNewRelationLinkTitle' => $lllAddImageFileReference], - 'maxitems' => 1, - 'behaviour' => ['allowLanguageSynchronization' => true], - 'overrideChildTca' => [ - 'types' => [ - '0' => ['showitem' => '--palette--;;filePalette'], - AbstractFile::FILETYPE_IMAGE => ['showitem' => '--palette--;;filePalette'], - ], - ], - ], + 'config' => $buildFileFieldConfig( + allowedFileTypes: 'common-image-types', + createNewRelationLinkTitle: $lllAddImageFileReference + ), ], 'sys_language_uid' => [ 'exclude' => true, @@ -193,27 +204,36 @@ '0' => ['showitem' => 'type,--palette--;;hiddenFields'], 'video' => [ 'showitem' => ' - type, h264, web_m, ogv, poster, - --palette--;' . $languagePrefixColumn . 'palette.metadata;metadata, - --palette--;;hiddenFields + --div--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:tabs.media, + type, h264, web_m, ogv, poster, + --palette--;;hiddenFields, + --div--;' . $languagePrefixColumn . 'tracks, + tracks, + --div--;' . $languagePrefixColumn . 'palette.metadata;metadata, + caption, description, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:language, + --palette--;;language, ', ], 'audio' => [ 'showitem' => ' - type, mp3, ogg, - --palette--;' . $languagePrefixColumn . 'palette.metadata;metadata, - --palette--;;hiddenFields + --div--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:tabs.media, + type, mp3, ogg, + --palette--;;hiddenFields, + --div--;' . $languagePrefixColumn . 'tracks, + tracks, + --div--;' . $languagePrefixColumn . 'palette.metadata;metadata, + caption, description, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:language, + --palette--;;language, ', ], ], 'palettes' => [ - 'metadata' => [ - 'showitem' => 'tracks, --linebreak--, caption, --linebreak--, description', - 'canNotCollapse' => 1, - ], - 'hiddenFields' => [ - 'showitem' => 'sys_language_uid, l10n_parent', - 'isHiddenPalette' => true, + 'language' => [ + 'showitem' => ' + sys_language_uid, l10n_parent + ', ], ], ]; diff --git a/Tests/Acceptance/Backend/ContentCreationCest.php b/Tests/Acceptance/Backend/ContentCreationCest.php index 068936ec..23ea2621 100644 --- a/Tests/Acceptance/Backend/ContentCreationCest.php +++ b/Tests/Acceptance/Backend/ContentCreationCest.php @@ -37,10 +37,16 @@ public function html5MediaCanBeCreated(BackendTester $I, PageTree $pageTree, Mod $I->waitForElement($headerInputSelector); $I->fillField($headerInputSelector, 'Testheader'); + // Switch to tab "Media" + $I->click('.typo3-TCEforms > ' . $this->buildTabSelector(2)); + $I->click('Create new'); $I->waitForElement('div[data-title="Media file"] select[name$="[type]"]'); + // Tab "Meta data" + $I->click('div[data-foreign-table="tx_html5mediakit_domain_model_media"] ' . $this->buildTabSelector(3)); + $I->fillField('div[data-title="Media file"] input[data-formengine-input-name$="[caption]"]', 'The caption'); $I->click('Save'); @@ -51,8 +57,19 @@ public function html5MediaCanBeCreated(BackendTester $I, PageTree $pageTree, Mod $I->seeInField($headerInputSelector, 'Testheader'); + // Switch to tab "Media" + $I->click('.typo3-TCEforms > ' . $this->buildTabSelector(2)); + $I->click('#data-1-tt_content-1-tx_html5mediakit_media-tx_html5mediakit_domain_model_media-1_label'); $I->waitForElement('div[data-title="Media file"] select[name$="[type]"]'); $I->seeInField('div[data-title="Media file"] input[data-formengine-input-name$="[caption]"]', 'The caption'); } + + private function buildTabSelector(int $tabNumber): string + { + return sprintf( + 'div[role="tabpanel"] > ul.nav-tabs > li.t3js-tabmenu-item:nth-child(%d) > a', + $tabNumber + ); + } } diff --git a/Tests/Acceptance/Support/Extension/BackendHtml5mediakitEnvironment.php b/Tests/Acceptance/Support/Extension/BackendHtml5mediakitEnvironment.php index fec0e642..0c913e10 100644 --- a/Tests/Acceptance/Support/Extension/BackendHtml5mediakitEnvironment.php +++ b/Tests/Acceptance/Support/Extension/BackendHtml5mediakitEnvironment.php @@ -6,6 +6,7 @@ use Codeception\Event\SuiteEvent; use TYPO3\TestingFramework\Core\Acceptance\Extension\BackendEnvironment; +use RuntimeException; class BackendHtml5mediakitEnvironment extends BackendEnvironment { @@ -38,7 +39,7 @@ public function bootstrapTypo3Environment(SuiteEvent $suiteEvent): void $typo3RootPath = (string)getenv('TYPO3_PATH_ROOT'); if ($typo3RootPath === '') { - throw new \RuntimeException('TYPO3_PATH_ROOT environment variable is not set'); + throw new RuntimeException('TYPO3_PATH_ROOT environment variable is not set'); } $putenvCode = PHP_EOL diff --git a/Tests/Functional/Controller/MediaController/VideoTest.php b/Tests/Functional/Controller/MediaController/VideoTest.php index d5d39dc3..c3981acb 100644 --- a/Tests/Functional/Controller/MediaController/VideoTest.php +++ b/Tests/Functional/Controller/MediaController/VideoTest.php @@ -4,8 +4,27 @@ namespace Sto\Html5mediakit\Tests\Functional\Controller\MediaController; +use Symfony\Component\DomCrawler\Crawler; + class VideoTest extends AbstractMediaControllerTestCase { + private array $expectedTracks = [ + [ + 'src' => '/tracks/subtitles-en.vtt', + 'kind' => 'subtitles', + 'srclang' => 'en', + 'label' => 'English', + 'default' => true, + ], + [ + 'src' => '/tracks/subtitles-de.vtt', + 'kind' => 'subtitles', + 'srclang' => 'de', + 'label' => 'German', + 'default' => false, + ], + ]; + private array $formats = [ 'webm' => 'webm', 'mp4' => 'mp4', @@ -16,28 +35,75 @@ public function testMediaControllerShowsVideo(): void { $responseBody = $this->loadFixturesAndGetResponseBody('media/video'); - $this->assertResponseContainsSources($responseBody); - $this->assertResponseContainsFallbackLinks($responseBody); - self::assertStringContainsString('Testcaption', $responseBody); - self::assertStringContainsString('Testdescription', $responseBody); - self::assertStringContainsString('poster="/video/poster.png"', $responseBody); + $crawler = new Crawler($responseBody); + + $videoContent = $this->getSingleElement($crawler, 'div.tx-html5mediakit-media-container'); + + $videoElement = $this->getSingleElement($videoContent, 'video'); + + self::assertSame('/video/poster.png', $videoElement->attr('poster')); + + $this->assertVideoContainsSources($videoElement); + + $fallbackText = $this->getSingleElement($videoContent, '.tx-html5mediakit-video-fallbacktext'); + $this->assertFallbacktextContainsFallbackLinks($fallbackText); + + $this->assertValidMetaData($this->getSingleElement($videoContent, '.tx-html5mediakit-media-metadata')); + + $this->assertVideoContainsTracks($videoElement); } - private function assertResponseContainsFallbackLinks(string $responseBody): void + private function assertFallbacktextContainsFallbackLinks(Crawler $fallbackText): void { foreach ($this->formats as $extension) { /** @noinspection HtmlUnknownTarget */ - $expectedSource = sprintf('media.%1$s', $extension); - self::assertStringContainsString($expectedSource, $responseBody); + $fallbackLink = $fallbackText->filter(sprintf('a[href="/video/media.%s"]', $extension)); + self::assertCount(1, $fallbackLink); + self::assertSame('media.' . $extension, $fallbackLink->text()); } } - private function assertResponseContainsSources(string $responseBody): void + private function assertValidMetaData(Crawler $metaDataElement): void + { + self::assertStringContainsString( + 'Testcaption', + $this->getSingleElement($metaDataElement, '.tx-html5mediakit-media-caption')->text() + ); + + self::assertStringContainsString( + 'Testdescription', + $this->getSingleElement($metaDataElement, '.tx-html5mediakit-media-description')->text() + ); + } + + private function assertVideoContainsSources(Crawler $videoElement): void { foreach ($this->formats as $mimeType => $extension) { - /** @noinspection HtmlUnknownTarget */ - $expectedSource = sprintf('', $extension, $mimeType); - self::assertStringContainsString($expectedSource, $responseBody); + $source = $videoElement->filter(sprintf('source[type="video/%s"]', $mimeType)); + self::assertCount(1, $source); + self::assertSame('/video/media.' . $extension, $source->attr('src')); + } + } + + private function assertVideoContainsTracks(Crawler $videoElement): void + { + foreach ($this->expectedTracks as $expectedTrack) { + $track = $this->getSingleElement($videoElement, sprintf('track[src="%s"]', $expectedTrack['src'])); + self::assertSame($expectedTrack['kind'], $track->attr('kind')); + self::assertSame($expectedTrack['srclang'], $track->attr('srclang')); + self::assertSame($expectedTrack['label'], $track->attr('label')); + + $expectedDefault = $expectedTrack['default'] ? '' : null; + self::assertSame($expectedDefault, $track->attr('default')); } } + + private function getSingleElement(Crawler $crawler, string $selector): Crawler + { + $elements = $crawler->filter($selector); + + self::assertCount(1, $elements, 'Expected exactly one element matching selector "' . $selector . '"'); + + return $elements->first(); + } } diff --git a/Tests/Functional/Fixtures/Database/common.csv b/Tests/Functional/Fixtures/Database/common.csv index bd5e2bfa..93895e0b 100644 --- a/Tests/Functional/Fixtures/Database/common.csv +++ b/Tests/Functional/Fixtures/Database/common.csv @@ -6,3 +6,5 @@ sys_file,,,,,, ,4,0,0,video/media.ogv,media.ogv,4 ,5,0,0,video/media.webm,media.webm,4 ,6,0,0,video/poster.png,poster.png,2 +,7,0,0,tracks/subtitles-en.vtt,subtitles-en.vtt,1 +,8,0,0,tracks/subtitles-de.vtt,subtitles-de.vtt,1 diff --git a/Tests/Functional/Fixtures/Database/media/video.csv b/Tests/Functional/Fixtures/Database/media/video.csv index c5f37e7d..a25849b1 100644 --- a/Tests/Functional/Fixtures/Database/media/video.csv +++ b/Tests/Functional/Fixtures/Database/media/video.csv @@ -7,9 +7,11 @@ tt_content,,,,,,, tx_html5mediakit_domain_model_media,,,,,,,,,,, ,uid,pid,content_element,type,caption,description,h264,ogv,web_m,poster,deleted ,1,1,1,video,Testcaption,Testdescription,1,1,1,1,0 -sys_file_reference,,,,,,,, -,uid,pid,uid_local,uid_foreign,tablenames,fieldname,l10n_diffsource -,1,0,3,1,tx_html5mediakit_domain_model_media,h264, -,2,0,4,1,tx_html5mediakit_domain_model_media,ogv, -,3,0,5,1,tx_html5mediakit_domain_model_media,web_m, -,4,0,6,1,tx_html5mediakit_domain_model_media,poster, +sys_file_reference,,,,,,,,,, +,uid,pid,uid_local,uid_foreign,tablenames,fieldname,tx_html5mediakit_track_kind,tx_html5mediakit_track_label,tx_html5mediakit_track_srclang +,1,0,3,1,tx_html5mediakit_domain_model_media,h264,,, +,2,0,4,1,tx_html5mediakit_domain_model_media,ogv,,, +,3,0,5,1,tx_html5mediakit_domain_model_media,web_m,,, +,4,0,6,1,tx_html5mediakit_domain_model_media,poster,,, +,5,0,7,1,tx_html5mediakit_domain_model_media,tracks,subtitles,English,en +,6,0,8,1,tx_html5mediakit_domain_model_media,tracks,subtitles,German,de diff --git a/Tests/Unit/Domain/Model/MediaTest.php b/Tests/Unit/Domain/Model/MediaTest.php index 027834e1..f0c875d9 100644 --- a/Tests/Unit/Domain/Model/MediaTest.php +++ b/Tests/Unit/Domain/Model/MediaTest.php @@ -15,21 +15,27 @@ * */ use PHPUnit\Framework\TestCase; +use Sto\Html5mediakit\Domain\Model\Enumeration\MediaType; use Sto\Html5mediakit\Domain\Model\Media; use TYPO3\CMS\Core\Utility\GeneralUtility; +use TYPO3\CMS\Extbase\Persistence\ObjectStorage; class MediaTest extends TestCase { - /** - * @var Media - */ - protected $media; + protected Media $media; protected function setUp(): void { $this->media = GeneralUtility::makeInstance(Media::class); } + public function testGetContentElementReturnsExpectedValue(): void + { + $this->media->setContentElement(343); + + self::assertSame(343, $this->media->getContentElement()); + } + public function testGetHasMetadataReturnsFalseIfNoTeaserOrDescriptionPresent(): void { $this->media->setCaption(''); @@ -50,4 +56,43 @@ public function testGetHasMetadataReturnsTrueIfDescriptionPresent(): void $this->media->setDescription('not empty'); self::assertTrue($this->media->getHasMetadata()); } + + public function testGetParentRecordReturnsExpectedValue(): void + { + $this->media->setParentRecord(6176); + + self::assertSame(6176, $this->media->getParentRecord()); + } + + public function testGetParentTableReturnsExpectedValue(): void + { + $this->media->setParentTable('the_table'); + + self::assertSame('the_table', $this->media->getParentTable()); + } + + public function testGetTracksReturnsExpectedValue(): void + { + $theStorage = new ObjectStorage(); + + $this->media->setTracks($theStorage); + + self::assertSame($theStorage, $this->media->getTracks()); + } + + public function testGetTstampReturnsExpectedValue(): void + { + $this->media->setTstamp(388384); + + self::assertSame(388384, $this->media->getTstamp()); + } + + public function testGetTypeReturnsExpectedValue(): void + { + $theType = new MediaType(MediaType::AUDIO); + + $this->media->setType($theType); + + self::assertSame($theType, $this->media->getType()); + } } diff --git a/Tests/Unit/Exception/MediaMissingExceptionTest.php b/Tests/Unit/Exception/MediaMissingExceptionTest.php new file mode 100644 index 00000000..35040ffe --- /dev/null +++ b/Tests/Unit/Exception/MediaMissingExceptionTest.php @@ -0,0 +1,27 @@ +getMessage()); + self::assertSame(3838, $exception->getCode()); + } + + public function testConstructorSetsExpectedDefaultValues(): void + { + $exception = new MediaMissingException(); + + self::assertSame('No media exists in the current content element.', $exception->getMessage()); + self::assertSame(1483385454, $exception->getCode()); + } +} diff --git a/composer.json b/composer.json index beb06565..dbb21128 100644 --- a/composer.json +++ b/composer.json @@ -10,12 +10,13 @@ "typo3/cms-frontend": "*" }, "require-dev": { - "de-swebhosting/php-codestyle": "^4.0", + "de-swebhosting/php-codestyle": "^5.0", "de-swebhosting/typo3-extension-buildtools": "dev-TYPO3_12", "ergebnis/composer-normalize": "^2.28", "friendsofphp/php-cs-fixer": "^3.14", "michielroos/typo3scan": "^1.7", "squizlabs/php_codesniffer": "^3.7", + "symfony/dom-crawler": "^6.3", "typo3/cms-fluid-styled-content": "*" }, "replace": {