class FrontMatterTest in Drupal 10
Same name in this branch
- 10 core/tests/Drupal/Tests/Component/FrontMatter/FrontMatterTest.php \Drupal\Tests\Component\FrontMatter\FrontMatterTest
- 10 core/tests/Drupal/KernelTests/Core/Theme/FrontMatterTest.php \Drupal\KernelTests\Core\Theme\FrontMatterTest
Same name and namespace in other branches
- 9 core/tests/Drupal/KernelTests/Core/Theme/FrontMatterTest.php \Drupal\KernelTests\Core\Theme\FrontMatterTest
Tests Twig front matter support.
@covers \Drupal\Core\Template\Loader\FrontMatterLoaderDecorator @covers \Drupal\Core\Template\FrontMatterSourceDecorator @group Twig
Hierarchy
- class \Drupal\KernelTests\KernelTestBase extends \PHPUnit\Framework\TestCase implements ServiceProviderInterface uses \Drupal\Tests\PhpUnitCompatibilityTrait, \Symfony\Bridge\PhpUnit\ExpectDeprecationTrait, AssertContentTrait, ConfigTestTrait, ExtensionListTestTrait, RandomGeneratorTrait, TestRequirementsTrait, PhpUnitWarnings
- class \Drupal\KernelTests\Core\Theme\FrontMatterTest
Expanded class hierarchy of FrontMatterTest
File
- core/
tests/ Drupal/ KernelTests/ Core/ Theme/ FrontMatterTest.php, line 20
Namespace
Drupal\KernelTests\Core\ThemeView source
class FrontMatterTest extends KernelTestBase {
/**
* A broken source.
*/
const BROKEN_SOURCE = '<div>Hello {{ world</div>';
/**
* Twig service.
*
* @var \Drupal\Core\Template\TwigEnvironment
*/
protected $twig;
/**
* {@inheritdoc}
*/
protected function setUp() : void {
parent::setUp();
$this->twig = \Drupal::service('twig');
}
/**
* {@inheritdoc}
*/
public function register(ContainerBuilder $container) {
parent::register($container);
$definition = new Definition(FilesystemLoader::class, [
[
sys_get_temp_dir(),
],
]);
$definition
->setPublic(TRUE);
$container
->setDefinition('twig_loader__file_system', $definition)
->addTag('twig.loader');
}
/**
* Creates a new temporary Twig file.
*
* @param string $content
* The contents of the Twig file to save.
*
* @return string
* The absolute path to the temporary file.
*/
protected function createTwigTemplate(string $content = '') : string {
$file = tempnam(sys_get_temp_dir(), 'twig') . ".html.twig";
file_put_contents($file, $content);
return $file;
}
/**
* Tests broken front matter.
*
* @covers \Drupal\Core\Template\TwigEnvironment::getTemplateMetadata
* @covers \Drupal\Component\FrontMatter\Exception\FrontMatterParseException
*/
public function testFrontMatterBroken() {
$source = "---\ncollection:\n- key: foo\n foo: bar\n---\n" . ComponentFrontMatterTest::SOURCE;
$file = $this
->createTwigTemplate($source);
$this
->expectException(SyntaxError::class);
$this
->expectExceptionMessage('An error occurred when attempting to parse front matter data on line 4 in ' . $file);
$this->twig
->getTemplateMetadata(basename($file));
}
/**
* Test Twig template front matter.
*
* @param array|null $yaml
* The YAML used for metadata in a Twig template.
* @param int $line
* The expected line number where the source code starts.
* @param string $content
* The content to use for testing purposes.
*
* @covers \Drupal\Core\Template\TwigEnvironment::compileSource
* @covers \Drupal\Core\Template\TwigEnvironment::getTemplateMetadata
*
* @dataProvider \Drupal\Tests\Component\FrontMatter\FrontMatterTest::providerFrontMatterData
*/
public function testFrontMatter($yaml, $line, $content = ComponentFrontMatterTest::SOURCE) {
// Create a temporary Twig template.
$source = ComponentFrontMatterTest::createFrontMatterSource($yaml, $content);
$file = $this
->createTwigTemplate($source);
$name = basename($file);
// Ensure the proper metadata is returned.
$metadata = $this->twig
->getTemplateMetadata($name);
$this
->assertEquals($yaml === NULL ? [] : $yaml, $metadata);
// Ensure the metadata is never rendered.
$output = $this->twig
->load($name)
->render();
$this
->assertEquals($content, $output);
// Create a temporary Twig template.
$source = ComponentFrontMatterTest::createFrontMatterSource($yaml, static::BROKEN_SOURCE);
$file = $this
->createTwigTemplate($source);
$name = basename($file);
try {
$this->twig
->load($name);
} catch (Error $error) {
$this
->assertEquals($line, $error
->getTemplateLine());
}
// Ensure string based templates work too.
try {
$this->twig
->createTemplate($source)
->render();
} catch (Error $error) {
$this
->assertEquals($line, $error
->getTemplateLine());
}
}
}