Skip to content

Commit

Permalink
[TASK] Enhance functional test for videos
Browse files Browse the repository at this point in the history
Use symfony/crawler for parsing HTML.

Add test for tracks.
  • Loading branch information
astehlik committed Jul 3, 2023
1 parent 34cbf7b commit f72eb87
Show file tree
Hide file tree
Showing 4 changed files with 89 additions and 18 deletions.
90 changes: 78 additions & 12 deletions Tests/Functional/Controller/MediaController/VideoTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -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',
Expand All @@ -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('<a href="/video/media.%s">media.%1$s</a>', $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('<source src="/video/media.%s" type="video/%s"/>', $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();
}
}
2 changes: 2 additions & 0 deletions Tests/Functional/Fixtures/Database/common.csv
Original file line number Diff line number Diff line change
Expand Up @@ -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
14 changes: 8 additions & 6 deletions Tests/Functional/Fixtures/Database/media/video.csv
Original file line number Diff line number Diff line change
Expand Up @@ -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
1 change: 1 addition & 0 deletions composer.json
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
"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": {
Expand Down

0 comments on commit f72eb87

Please sign in to comment.