mirror of
https://github.com/MarijnDoeve/TijdVoorDeTest.git
synced 2026-07-05 07:00:14 +02:00
815e7b17be
Adds the previously uncommitted quiz nav partial that broke main, and introduces TemplateReferencesTest which scans all Twig templates for extends/include/embed references and asserts each target file exists — preventing this class of missing-template mistake from reaching CI undetected.
64 lines
2.0 KiB
PHP
64 lines
2.0 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
namespace Tvdt\Tests\Twig;
|
|
|
|
use PHPUnit\Framework\Assert;
|
|
use PHPUnit\Framework\Attributes\DataProvider;
|
|
use PHPUnit\Framework\TestCase;
|
|
|
|
use function Safe\file_get_contents;
|
|
use function Safe\preg_match_all;
|
|
|
|
final class TemplateReferencesTest extends TestCase
|
|
{
|
|
private static string $templatesDir;
|
|
|
|
public static function setUpBeforeClass(): void
|
|
{
|
|
self::$templatesDir = \dirname(__DIR__, 2).'/templates';
|
|
}
|
|
|
|
/** @return iterable<string, array{string, string}> */
|
|
public static function templateReferenceProvider(): iterable
|
|
{
|
|
$templatesDir = \dirname(__DIR__, 2).'/templates';
|
|
$iterator = new \RecursiveIteratorIterator(
|
|
new \RecursiveDirectoryIterator($templatesDir, \RecursiveDirectoryIterator::SKIP_DOTS),
|
|
);
|
|
|
|
foreach ($iterator as $file) {
|
|
Assert::assertInstanceOf(\SplFileInfo::class, $file);
|
|
if ('twig' !== $file->getExtension()) {
|
|
continue;
|
|
}
|
|
|
|
$content = file_get_contents($file->getPathname());
|
|
$sourceFile = str_replace($templatesDir.'/', '', $file->getPathname());
|
|
|
|
// Match extends, include(), and embed tags — capture the quoted template name
|
|
preg_match_all(
|
|
'/(?:extends|include|embed)\s*\(?[\'"]([^\'"]+)[\'"]\)?/',
|
|
$content,
|
|
$matches,
|
|
);
|
|
|
|
foreach ($matches[1] as $referencedTemplate) {
|
|
yield \sprintf('%s → %s', $sourceFile, $referencedTemplate) => [$sourceFile, $referencedTemplate];
|
|
}
|
|
}
|
|
}
|
|
|
|
#[DataProvider('templateReferenceProvider')]
|
|
public function testReferencedTemplateExists(string $sourceFile, string $referencedTemplate): void
|
|
{
|
|
$absolutePath = self::$templatesDir.'/'.$referencedTemplate;
|
|
|
|
$this->assertFileExists(
|
|
$absolutePath,
|
|
\sprintf("Template '%s' references '%s' which does not exist at '%s'.", $sourceFile, $referencedTemplate, $absolutePath),
|
|
);
|
|
}
|
|
}
|