mirror of
https://github.com/twigphp/Twig.git
synced 2026-10-11 06:15:43 +00:00
04ace9dba0
* 3.x: Handle single-node child template bodies in cleanup Keep captured block definitions supported Clarify captured block deprecation wording Simplify correctness visitor checks Move extends validation into correctness visitor Fix correctness visitor regressions Fix test assertions that did not verify the intended behavior Address review: fix block-nesting checks in CorrectnessNodeVisitor Move the extends-in-block and extends-in-macro errors into the CorrectnessNodeVisitor Introduce a CorrectnessNodeVisitor to validate that templates are semantically correct Mark Markup as final Allow calling a macro with a dynamic name via the dot operator Add an allow-list for tests to the sandbox security policy Fix markdown_to_html mangling content that starts with a blank line # Conflicts: # CHANGELOG # doc/deprecated.rst # doc/sandbox.rst # src/ExpressionParser/Infix/DotExpressionParser.php # src/Extension/CoreExtension.php # src/Markup.php # src/Node/CheckSecurityNode.php # src/Node/Expression/Filter/DefaultFilter.php # src/Node/Expression/NullCoalesceExpression.php # src/Node/IfNode.php # src/NodeVisitor/SandboxNodeVisitor.php # src/Parser.php # src/Sandbox/SecurityPolicy.php # tests/Extension/SandboxTest.php # tests/ParserTest.php
69 lines
2.3 KiB
PHP
69 lines
2.3 KiB
PHP
<?php
|
|
|
|
/*
|
|
* This file is part of Twig.
|
|
*
|
|
* (c) Fabien Potencier
|
|
*
|
|
* For the full copyright and license information, please view the LICENSE
|
|
* file that was distributed with this source code.
|
|
*/
|
|
|
|
namespace Twig\Tests\Node\Expression;
|
|
|
|
use PHPUnit\Framework\Attributes\DataProvider;
|
|
use PHPUnit\Framework\TestCase;
|
|
use Twig\Environment;
|
|
use Twig\Loader\ArrayLoader;
|
|
use Twig\Node\Expression\ArrayExpression;
|
|
use Twig\Node\Expression\MacroReferenceExpression;
|
|
use Twig\Node\Expression\Variable\ContextVariable;
|
|
use Twig\Node\Expression\Variable\TemplateVariable;
|
|
|
|
class MacroReferenceTest extends TestCase
|
|
{
|
|
#[DataProvider('provideInvalidMacroNames')]
|
|
public function testConstructorRejectsNonIdentifierName(string $name)
|
|
{
|
|
$this->expectException(\LogicException::class);
|
|
$this->expectExceptionMessage(\sprintf('Macro name "%s" is not a valid PHP identifier.', $name));
|
|
|
|
new MacroReferenceExpression(new TemplateVariable('foo', 1), $name, new ArrayExpression([], 1), 1);
|
|
}
|
|
|
|
public static function provideInvalidMacroNames(): iterable
|
|
{
|
|
yield 'empty' => [''];
|
|
yield 'starts with digit' => ['1foo'];
|
|
yield 'contains space' => ['foo bar'];
|
|
yield 'contains semicolon' => ['foo;bar'];
|
|
yield 'PHP injection payload' => ['macro_foo + 1; trigger_error("BAD") //'];
|
|
yield 'contains NUL byte' => ["foo\x00bar"];
|
|
}
|
|
|
|
public function testConstructorAcceptsAnExpressionAsName()
|
|
{
|
|
$node = new MacroReferenceExpression(new TemplateVariable('foo', 1), new ContextVariable('name', 1), new ArrayExpression([], 1), 1);
|
|
|
|
$this->assertTrue($node->hasNode('name'));
|
|
$this->assertNull($node->getAttribute('name'));
|
|
}
|
|
|
|
public function testDynamicNamePrefixesMacroAtRuntime()
|
|
{
|
|
$env = new Environment(new ArrayLoader());
|
|
$compiler = new \Twig\Compiler($env);
|
|
|
|
$node = new MacroReferenceExpression(
|
|
new TemplateVariable('mac', 1),
|
|
new ContextVariable('name', 1),
|
|
new ArrayExpression([], 1),
|
|
1,
|
|
);
|
|
$compiler->compile($node);
|
|
|
|
$this->assertStringContainsString("getTemplateForMacro(\$_v0 = 'macro_'.", $compiler->getSource());
|
|
$this->assertStringContainsString('->{$_v0}(...', $compiler->getSource());
|
|
}
|
|
}
|