From 9f5ed0e2968fb014e15f5c6f73b8da9e18938a9c Mon Sep 17 00:00:00 2001 From: Romain Monteil Date: Sun, 23 Apr 2023 12:32:42 +0200 Subject: [PATCH] [TwigBridge] Add FormLayoutTestCase class --- .../Bridge/Twig/Test/FormLayoutTestCase.php | 150 ++++++++++++++++++ .../Traits}/RuntimeLoaderProvider.php | 2 +- .../Extension/AbstractLayoutTestCase.php | 70 +------- ...xtensionBootstrap3HorizontalLayoutTest.php | 87 ++-------- .../FormExtensionBootstrap3LayoutTest.php | 86 ++-------- ...xtensionBootstrap4HorizontalLayoutTest.php | 87 ++-------- .../FormExtensionBootstrap4LayoutTest.php | 86 ++-------- ...xtensionBootstrap5HorizontalLayoutTest.php | 87 ++-------- .../FormExtensionBootstrap5LayoutTest.php | 86 ++-------- .../Extension/FormExtensionDivLayoutTest.php | 99 +++--------- .../FormExtensionTableLayoutTest.php | 93 +++-------- .../Bridge/Twig/Tests/Node/FormThemeTest.php | 2 +- 12 files changed, 282 insertions(+), 653 deletions(-) create mode 100644 src/Symfony/Bridge/Twig/Test/FormLayoutTestCase.php rename src/Symfony/Bridge/Twig/{Tests/Extension => Test/Traits}/RuntimeLoaderProvider.php (94%) diff --git a/src/Symfony/Bridge/Twig/Test/FormLayoutTestCase.php b/src/Symfony/Bridge/Twig/Test/FormLayoutTestCase.php new file mode 100644 index 0000000000000..71a71530831eb --- /dev/null +++ b/src/Symfony/Bridge/Twig/Test/FormLayoutTestCase.php @@ -0,0 +1,150 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Bridge\Twig\Test; + +use Symfony\Bridge\Twig\Form\TwigRendererEngine; +use Symfony\Bridge\Twig\Test\Traits\RuntimeLoaderProvider; +use Symfony\Component\Form\FormRenderer; +use Symfony\Component\Form\FormRendererInterface; +use Symfony\Component\Form\FormView; +use Symfony\Component\Form\Test\FormIntegrationTestCase; +use Symfony\Component\Security\Csrf\CsrfTokenManagerInterface; +use Twig\Environment; +use Twig\Loader\FilesystemLoader; + +/** + * @author Romain Monteil + */ +abstract class FormLayoutTestCase extends FormIntegrationTestCase +{ + use RuntimeLoaderProvider; + + protected FormRendererInterface $renderer; + + protected function setUp(): void + { + parent::setUp(); + + $loader = new FilesystemLoader($this->getTemplatePaths()); + + $environment = new Environment($loader, ['strict_variables' => true]); + $environment->setExtensions($this->getTwigExtensions()); + + foreach ($this->getTwigGlobals() as $name => $value) { + $environment->addGlobal($name, $value); + } + + $rendererEngine = new TwigRendererEngine($this->getThemes(), $environment); + $this->renderer = new FormRenderer($rendererEngine, $this->createMock(CsrfTokenManagerInterface::class)); + $this->registerTwigRuntimeLoader($environment, $this->renderer); + } + + protected function assertMatchesXpath($html, $expression, $count = 1): void + { + $dom = new \DOMDocument('UTF-8'); + + $html = preg_replace('/(]+)(?/', '$1/>', $html); + + try { + // Wrap in node so we can load HTML with multiple tags at + // the top level + $dom->loadXML(''.$html.''); + } catch (\Exception $e) { + $this->fail(sprintf( + "Failed loading HTML:\n\n%s\n\nError: %s", + $html, + $e->getMessage() + )); + } + $xpath = new \DOMXPath($dom); + $nodeList = $xpath->evaluate('/root'.$expression); + + if ($nodeList->length != $count) { + $dom->formatOutput = true; + $this->fail(sprintf( + "Failed asserting that \n\n%s\n\nmatches exactly %s. Matches %s in \n\n%s", + $expression, + 1 == $count ? 'once' : $count.' times', + 1 == $nodeList->length ? 'once' : $nodeList->length.' times', + // strip away and + substr($dom->saveHTML(), 6, -8) + )); + } else { + $this->addToAssertionCount(1); + } + } + + abstract protected function getTemplatePaths(): array; + + abstract protected function getTwigExtensions(): array; + + protected function getTwigGlobals(): array + { + return []; + } + + abstract protected function getThemes(): array; + + protected function renderForm(FormView $view, array $vars = []): string + { + return $this->renderer->renderBlock($view, 'form', $vars); + } + + protected function renderLabel(FormView $view, $label = null, array $vars = []): string + { + if (null !== $label) { + $vars += ['label' => $label]; + } + + return $this->renderer->searchAndRenderBlock($view, 'label', $vars); + } + + protected function renderHelp(FormView $view): string + { + return $this->renderer->searchAndRenderBlock($view, 'help'); + } + + protected function renderErrors(FormView $view): string + { + return $this->renderer->searchAndRenderBlock($view, 'errors'); + } + + protected function renderWidget(FormView $view, array $vars = []): string + { + return $this->renderer->searchAndRenderBlock($view, 'widget', $vars); + } + + protected function renderRow(FormView $view, array $vars = []): string + { + return $this->renderer->searchAndRenderBlock($view, 'row', $vars); + } + + protected function renderRest(FormView $view, array $vars = []): string + { + return $this->renderer->searchAndRenderBlock($view, 'rest', $vars); + } + + protected function renderStart(FormView $view, array $vars = []): string + { + return $this->renderer->renderBlock($view, 'form_start', $vars); + } + + protected function renderEnd(FormView $view, array $vars = []): string + { + return $this->renderer->renderBlock($view, 'form_end', $vars); + } + + protected function setTheme(FormView $view, array $themes, $useDefaultThemes = true): void + { + $this->renderer->setTheme($view, $themes, $useDefaultThemes); + } +} diff --git a/src/Symfony/Bridge/Twig/Tests/Extension/RuntimeLoaderProvider.php b/src/Symfony/Bridge/Twig/Test/Traits/RuntimeLoaderProvider.php similarity index 94% rename from src/Symfony/Bridge/Twig/Tests/Extension/RuntimeLoaderProvider.php rename to src/Symfony/Bridge/Twig/Test/Traits/RuntimeLoaderProvider.php index dea148192475a..1025288bc312e 100644 --- a/src/Symfony/Bridge/Twig/Tests/Extension/RuntimeLoaderProvider.php +++ b/src/Symfony/Bridge/Twig/Test/Traits/RuntimeLoaderProvider.php @@ -9,7 +9,7 @@ * file that was distributed with this source code. */ -namespace Symfony\Bridge\Twig\Tests\Extension; +namespace Symfony\Bridge\Twig\Test\Traits; use Symfony\Component\Form\FormRenderer; use Twig\Environment; diff --git a/src/Symfony/Bridge/Twig/Tests/Extension/AbstractLayoutTestCase.php b/src/Symfony/Bridge/Twig/Tests/Extension/AbstractLayoutTestCase.php index d9bab6cdaaf14..fc9eff09a375b 100644 --- a/src/Symfony/Bridge/Twig/Tests/Extension/AbstractLayoutTestCase.php +++ b/src/Symfony/Bridge/Twig/Tests/Extension/AbstractLayoutTestCase.php @@ -12,19 +12,19 @@ namespace Symfony\Bridge\Twig\Tests\Extension; use PHPUnit\Framework\MockObject\MockObject; +use Symfony\Bridge\Twig\Test\FormLayoutTestCase; use Symfony\Component\Form\Extension\Core\Type\PercentType; use Symfony\Component\Form\Extension\Core\Type\SubmitType; use Symfony\Component\Form\Extension\Csrf\CsrfExtension; use Symfony\Component\Form\FormError; use Symfony\Component\Form\FormView; -use Symfony\Component\Form\Test\FormIntegrationTestCase; use Symfony\Component\Form\Tests\VersionAwareTest; use Symfony\Component\Security\Csrf\CsrfTokenManagerInterface; use Symfony\Component\Translation\TranslatableMessage; use Symfony\Contracts\Translation\TranslatableInterface; use Symfony\Contracts\Translation\TranslatorInterface; -abstract class AbstractLayoutTestCase extends FormIntegrationTestCase +abstract class AbstractLayoutTestCase extends FormLayoutTestCase { use VersionAwareTest; @@ -61,49 +61,6 @@ protected function tearDown(): void parent::tearDown(); } - protected function assertXpathNodeValue(\DOMElement $element, $expression, $nodeValue) - { - $xpath = new \DOMXPath($element->ownerDocument); - $nodeList = $xpath->evaluate($expression); - $this->assertEquals(1, $nodeList->length); - $this->assertEquals($nodeValue, $nodeList->item(0)->nodeValue); - } - - protected function assertMatchesXpath($html, $expression, $count = 1) - { - $dom = new \DOMDocument('UTF-8'); - - $html = preg_replace('/(]+)(?/', '$1/>', $html); - - try { - // Wrap in node so we can load HTML with multiple tags at - // the top level - $dom->loadXML(''.$html.''); - } catch (\Exception $e) { - $this->fail(sprintf( - "Failed loading HTML:\n\n%s\n\nError: %s", - $html, - $e->getMessage() - )); - } - $xpath = new \DOMXPath($dom); - $nodeList = $xpath->evaluate('/root'.$expression); - - if ($nodeList->length != $count) { - $dom->formatOutput = true; - $this->fail(sprintf( - "Failed asserting that \n\n%s\n\nmatches exactly %s. Matches %s in \n\n%s", - $expression, - 1 == $count ? 'once' : $count.' times', - 1 == $nodeList->length ? 'once' : $nodeList->length.' times', - // strip away and - substr($dom->saveHTML(), 6, -8) - )); - } else { - $this->addToAssertionCount(1); - } - } - protected function assertWidgetMatchesXpath(FormView $view, array $vars, $xpath) { // include ampersands everywhere to validate escaping @@ -125,29 +82,6 @@ protected function assertWidgetMatchesXpath(FormView $view, array $vars, $xpath) $this->assertMatchesXpath($html, $xpath); } - abstract protected function renderForm(FormView $view, array $vars = []); - - abstract protected function renderLabel(FormView $view, $label = null, array $vars = []); - - protected function renderHelp(FormView $view) - { - $this->markTestSkipped(sprintf('%s::renderHelp() is not implemented.', static::class)); - } - - abstract protected function renderErrors(FormView $view); - - abstract protected function renderWidget(FormView $view, array $vars = []); - - abstract protected function renderRow(FormView $view, array $vars = []); - - abstract protected function renderRest(FormView $view, array $vars = []); - - abstract protected function renderStart(FormView $view, array $vars = []); - - abstract protected function renderEnd(FormView $view, array $vars = []); - - abstract protected function setTheme(FormView $view, array $themes, $useDefaultThemes = true); - public function testLabel() { $form = $this->factory->createNamed('name', 'Symfony\Component\Form\Extension\Core\Type\TextType'); diff --git a/src/Symfony/Bridge/Twig/Tests/Extension/FormExtensionBootstrap3HorizontalLayoutTest.php b/src/Symfony/Bridge/Twig/Tests/Extension/FormExtensionBootstrap3HorizontalLayoutTest.php index 2f5289ceda06f..b15f4e6895a2e 100644 --- a/src/Symfony/Bridge/Twig/Tests/Extension/FormExtensionBootstrap3HorizontalLayoutTest.php +++ b/src/Symfony/Bridge/Twig/Tests/Extension/FormExtensionBootstrap3HorizontalLayoutTest.php @@ -13,96 +13,35 @@ use Symfony\Bridge\Twig\Extension\FormExtension; use Symfony\Bridge\Twig\Extension\TranslationExtension; -use Symfony\Bridge\Twig\Form\TwigRendererEngine; use Symfony\Bridge\Twig\Tests\Extension\Fixtures\StubTranslator; -use Symfony\Component\Form\FormRenderer; -use Symfony\Component\Form\FormView; -use Symfony\Component\Security\Csrf\CsrfTokenManagerInterface; -use Twig\Environment; -use Twig\Loader\FilesystemLoader; class FormExtensionBootstrap3HorizontalLayoutTest extends AbstractBootstrap3HorizontalLayoutTestCase { - use RuntimeLoaderProvider; - protected array $testableFeatures = [ 'choice_attr', ]; - private FormRenderer $renderer; - - protected function setUp(): void + protected function getTemplatePaths(): array { - parent::setUp(); - - $loader = new FilesystemLoader([ + return [ __DIR__.'/../../Resources/views/Form', __DIR__.'/Fixtures/templates/form', - ]); - - $environment = new Environment($loader, ['strict_variables' => true]); - $environment->addExtension(new TranslationExtension(new StubTranslator())); - $environment->addExtension(new FormExtension()); - - $rendererEngine = new TwigRendererEngine([ - 'bootstrap_3_horizontal_layout.html.twig', - 'custom_widgets.html.twig', - ], $environment); - $this->renderer = new FormRenderer($rendererEngine, $this->createMock(CsrfTokenManagerInterface::class)); - $this->registerTwigRuntimeLoader($environment, $this->renderer); - } - - protected function renderForm(FormView $view, array $vars = []) - { - return $this->renderer->renderBlock($view, 'form', $vars); - } - - protected function renderLabel(FormView $view, $label = null, array $vars = []) - { - if (null !== $label) { - $vars += ['label' => $label]; - } - - return $this->renderer->searchAndRenderBlock($view, 'label', $vars); - } - - protected function renderHelp(FormView $view) - { - return $this->renderer->searchAndRenderBlock($view, 'help'); + ]; } - protected function renderErrors(FormView $view) + protected function getTwigExtensions(): array { - return $this->renderer->searchAndRenderBlock($view, 'errors'); + return [ + new TranslationExtension(new StubTranslator()), + new FormExtension(), + ]; } - protected function renderWidget(FormView $view, array $vars = []) + protected function getThemes(): array { - return $this->renderer->searchAndRenderBlock($view, 'widget', $vars); - } - - protected function renderRow(FormView $view, array $vars = []) - { - return $this->renderer->searchAndRenderBlock($view, 'row', $vars); - } - - protected function renderRest(FormView $view, array $vars = []) - { - return $this->renderer->searchAndRenderBlock($view, 'rest', $vars); - } - - protected function renderStart(FormView $view, array $vars = []) - { - return $this->renderer->renderBlock($view, 'form_start', $vars); - } - - protected function renderEnd(FormView $view, array $vars = []) - { - return $this->renderer->renderBlock($view, 'form_end', $vars); - } - - protected function setTheme(FormView $view, array $themes, $useDefaultThemes = true) - { - $this->renderer->setTheme($view, $themes, $useDefaultThemes); + return [ + 'bootstrap_3_horizontal_layout.html.twig', + 'custom_widgets.html.twig', + ]; } } diff --git a/src/Symfony/Bridge/Twig/Tests/Extension/FormExtensionBootstrap3LayoutTest.php b/src/Symfony/Bridge/Twig/Tests/Extension/FormExtensionBootstrap3LayoutTest.php index bb0f5687ed57b..90a1756361d9d 100644 --- a/src/Symfony/Bridge/Twig/Tests/Extension/FormExtensionBootstrap3LayoutTest.php +++ b/src/Symfony/Bridge/Twig/Tests/Extension/FormExtensionBootstrap3LayoutTest.php @@ -16,38 +16,12 @@ use Symfony\Bridge\Twig\Form\TwigRendererEngine; use Symfony\Bridge\Twig\Tests\Extension\Fixtures\StubTranslator; use Symfony\Component\Form\FormRenderer; -use Symfony\Component\Form\FormView; use Symfony\Component\Security\Csrf\CsrfTokenManagerInterface; use Twig\Environment; use Twig\Loader\FilesystemLoader; class FormExtensionBootstrap3LayoutTest extends AbstractBootstrap3LayoutTestCase { - use RuntimeLoaderProvider; - - private FormRenderer $renderer; - - protected function setUp(): void - { - parent::setUp(); - - $loader = new FilesystemLoader([ - __DIR__.'/../../Resources/views/Form', - __DIR__.'/Fixtures/templates/form', - ]); - - $environment = new Environment($loader, ['strict_variables' => true]); - $environment->addExtension(new TranslationExtension(new StubTranslator())); - $environment->addExtension(new FormExtension()); - - $rendererEngine = new TwigRendererEngine([ - 'bootstrap_3_layout.html.twig', - 'custom_widgets.html.twig', - ], $environment); - $this->renderer = new FormRenderer($rendererEngine, $this->createMock(CsrfTokenManagerInterface::class)); - $this->registerTwigRuntimeLoader($environment, $this->renderer); - } - public function testStartTagHasNoActionAttributeWhenActionIsEmpty() { $form = $this->factory->create('Symfony\Component\Form\Extension\Core\Type\FormType', null, [ @@ -102,57 +76,27 @@ public function testMoneyWidgetInIso() , trim($this->renderWidget($view))); } - protected function renderForm(FormView $view, array $vars = []) + protected function getTemplatePaths(): array { - return $this->renderer->renderBlock($view, 'form', $vars); - } - - protected function renderLabel(FormView $view, $label = null, array $vars = []) - { - if (null !== $label) { - $vars += ['label' => $label]; - } - - return $this->renderer->searchAndRenderBlock($view, 'label', $vars); - } - - protected function renderHelp(FormView $view) - { - return $this->renderer->searchAndRenderBlock($view, 'help'); - } - - protected function renderErrors(FormView $view) - { - return $this->renderer->searchAndRenderBlock($view, 'errors'); - } - - protected function renderWidget(FormView $view, array $vars = []) - { - return $this->renderer->searchAndRenderBlock($view, 'widget', $vars); - } - - protected function renderRow(FormView $view, array $vars = []) - { - return $this->renderer->searchAndRenderBlock($view, 'row', $vars); - } - - protected function renderRest(FormView $view, array $vars = []) - { - return $this->renderer->searchAndRenderBlock($view, 'rest', $vars); - } - - protected function renderStart(FormView $view, array $vars = []) - { - return $this->renderer->renderBlock($view, 'form_start', $vars); + return [ + __DIR__.'/../../Resources/views/Form', + __DIR__.'/Fixtures/templates/form', + ]; } - protected function renderEnd(FormView $view, array $vars = []) + protected function getTwigExtensions(): array { - return $this->renderer->renderBlock($view, 'form_end', $vars); + return [ + new TranslationExtension(new StubTranslator()), + new FormExtension(), + ]; } - protected function setTheme(FormView $view, array $themes, $useDefaultThemes = true) + protected function getThemes(): array { - $this->renderer->setTheme($view, $themes, $useDefaultThemes); + return [ + 'bootstrap_3_layout.html.twig', + 'custom_widgets.html.twig', + ]; } } diff --git a/src/Symfony/Bridge/Twig/Tests/Extension/FormExtensionBootstrap4HorizontalLayoutTest.php b/src/Symfony/Bridge/Twig/Tests/Extension/FormExtensionBootstrap4HorizontalLayoutTest.php index a7d6c04e4b37a..dbc2827f1315e 100644 --- a/src/Symfony/Bridge/Twig/Tests/Extension/FormExtensionBootstrap4HorizontalLayoutTest.php +++ b/src/Symfony/Bridge/Twig/Tests/Extension/FormExtensionBootstrap4HorizontalLayoutTest.php @@ -13,13 +13,7 @@ use Symfony\Bridge\Twig\Extension\FormExtension; use Symfony\Bridge\Twig\Extension\TranslationExtension; -use Symfony\Bridge\Twig\Form\TwigRendererEngine; use Symfony\Bridge\Twig\Tests\Extension\Fixtures\StubTranslator; -use Symfony\Component\Form\FormRenderer; -use Symfony\Component\Form\FormView; -use Symfony\Component\Security\Csrf\CsrfTokenManagerInterface; -use Twig\Environment; -use Twig\Loader\FilesystemLoader; /** * Class providing test cases for the Bootstrap 4 Twig form theme. @@ -28,86 +22,31 @@ */ class FormExtensionBootstrap4HorizontalLayoutTest extends AbstractBootstrap4HorizontalLayoutTestCase { - use RuntimeLoaderProvider; - protected array $testableFeatures = [ 'choice_attr', ]; - private FormRenderer $renderer; - - protected function setUp(): void + protected function getTemplatePaths(): array { - parent::setUp(); - - $loader = new FilesystemLoader([ + return [ __DIR__.'/../../Resources/views/Form', __DIR__.'/Fixtures/templates/form', - ]); - - $environment = new Environment($loader, ['strict_variables' => true]); - $environment->addExtension(new TranslationExtension(new StubTranslator())); - $environment->addExtension(new FormExtension()); - - $rendererEngine = new TwigRendererEngine([ - 'bootstrap_4_horizontal_layout.html.twig', - 'custom_widgets.html.twig', - ], $environment); - $this->renderer = new FormRenderer($rendererEngine, $this->createMock(CsrfTokenManagerInterface::class)); - $this->registerTwigRuntimeLoader($environment, $this->renderer); - } - - protected function renderForm(FormView $view, array $vars = []) - { - return $this->renderer->renderBlock($view, 'form', $vars); - } - - protected function renderLabel(FormView $view, $label = null, array $vars = []) - { - if (null !== $label) { - $vars += ['label' => $label]; - } - - return $this->renderer->searchAndRenderBlock($view, 'label', $vars); - } - - protected function renderHelp(FormView $view) - { - return $this->renderer->searchAndRenderBlock($view, 'help'); + ]; } - protected function renderErrors(FormView $view) + protected function getTwigExtensions(): array { - return $this->renderer->searchAndRenderBlock($view, 'errors'); + return [ + new TranslationExtension(new StubTranslator()), + new FormExtension(), + ]; } - protected function renderWidget(FormView $view, array $vars = []) + protected function getThemes(): array { - return $this->renderer->searchAndRenderBlock($view, 'widget', $vars); - } - - protected function renderRow(FormView $view, array $vars = []) - { - return $this->renderer->searchAndRenderBlock($view, 'row', $vars); - } - - protected function renderRest(FormView $view, array $vars = []) - { - return $this->renderer->searchAndRenderBlock($view, 'rest', $vars); - } - - protected function renderStart(FormView $view, array $vars = []) - { - return $this->renderer->renderBlock($view, 'form_start', $vars); - } - - protected function renderEnd(FormView $view, array $vars = []) - { - return $this->renderer->renderBlock($view, 'form_end', $vars); - } - - protected function setTheme(FormView $view, array $themes, $useDefaultThemes = true) - { - $this->renderer->setTheme($view, $themes, $useDefaultThemes); + return [ + 'bootstrap_4_horizontal_layout.html.twig', + 'custom_widgets.html.twig', + ]; } } diff --git a/src/Symfony/Bridge/Twig/Tests/Extension/FormExtensionBootstrap4LayoutTest.php b/src/Symfony/Bridge/Twig/Tests/Extension/FormExtensionBootstrap4LayoutTest.php index 3aecccf1df7f6..bffebe3f6425f 100644 --- a/src/Symfony/Bridge/Twig/Tests/Extension/FormExtensionBootstrap4LayoutTest.php +++ b/src/Symfony/Bridge/Twig/Tests/Extension/FormExtensionBootstrap4LayoutTest.php @@ -16,7 +16,6 @@ use Symfony\Bridge\Twig\Form\TwigRendererEngine; use Symfony\Bridge\Twig\Tests\Extension\Fixtures\StubTranslator; use Symfony\Component\Form\FormRenderer; -use Symfony\Component\Form\FormView; use Symfony\Component\Security\Csrf\CsrfTokenManagerInterface; use Twig\Environment; use Twig\Loader\FilesystemLoader; @@ -28,31 +27,6 @@ */ class FormExtensionBootstrap4LayoutTest extends AbstractBootstrap4LayoutTestCase { - use RuntimeLoaderProvider; - - private FormRenderer $renderer; - - protected function setUp(): void - { - parent::setUp(); - - $loader = new FilesystemLoader([ - __DIR__.'/../../Resources/views/Form', - __DIR__.'/Fixtures/templates/form', - ]); - - $environment = new Environment($loader, ['strict_variables' => true]); - $environment->addExtension(new TranslationExtension(new StubTranslator())); - $environment->addExtension(new FormExtension()); - - $rendererEngine = new TwigRendererEngine([ - 'bootstrap_4_layout.html.twig', - 'custom_widgets.html.twig', - ], $environment); - $this->renderer = new FormRenderer($rendererEngine, $this->createMock(CsrfTokenManagerInterface::class)); - $this->registerTwigRuntimeLoader($environment, $this->renderer); - } - public function testStartTagHasNoActionAttributeWhenActionIsEmpty() { $form = $this->factory->create('Symfony\Component\Form\Extension\Core\Type\FormType', null, [ @@ -107,57 +81,27 @@ public function testMoneyWidgetInIso() , trim($this->renderWidget($view))); } - protected function renderForm(FormView $view, array $vars = []) + protected function getTemplatePaths(): array { - return $this->renderer->renderBlock($view, 'form', $vars); - } - - protected function renderLabel(FormView $view, $label = null, array $vars = []) - { - if (null !== $label) { - $vars += ['label' => $label]; - } - - return $this->renderer->searchAndRenderBlock($view, 'label', $vars); - } - - protected function renderHelp(FormView $view) - { - return $this->renderer->searchAndRenderBlock($view, 'help'); - } - - protected function renderErrors(FormView $view) - { - return $this->renderer->searchAndRenderBlock($view, 'errors'); - } - - protected function renderWidget(FormView $view, array $vars = []) - { - return $this->renderer->searchAndRenderBlock($view, 'widget', $vars); - } - - protected function renderRow(FormView $view, array $vars = []) - { - return $this->renderer->searchAndRenderBlock($view, 'row', $vars); - } - - protected function renderRest(FormView $view, array $vars = []) - { - return $this->renderer->searchAndRenderBlock($view, 'rest', $vars); - } - - protected function renderStart(FormView $view, array $vars = []) - { - return $this->renderer->renderBlock($view, 'form_start', $vars); + return [ + __DIR__.'/../../Resources/views/Form', + __DIR__.'/Fixtures/templates/form', + ]; } - protected function renderEnd(FormView $view, array $vars = []) + protected function getTwigExtensions(): array { - return $this->renderer->renderBlock($view, 'form_end', $vars); + return [ + new TranslationExtension(new StubTranslator()), + new FormExtension(), + ]; } - protected function setTheme(FormView $view, array $themes, $useDefaultThemes = true) + protected function getThemes(): array { - $this->renderer->setTheme($view, $themes, $useDefaultThemes); + return [ + 'bootstrap_4_layout.html.twig', + 'custom_widgets.html.twig', + ]; } } diff --git a/src/Symfony/Bridge/Twig/Tests/Extension/FormExtensionBootstrap5HorizontalLayoutTest.php b/src/Symfony/Bridge/Twig/Tests/Extension/FormExtensionBootstrap5HorizontalLayoutTest.php index 9682129e3fbfc..54c8e5afd44f8 100644 --- a/src/Symfony/Bridge/Twig/Tests/Extension/FormExtensionBootstrap5HorizontalLayoutTest.php +++ b/src/Symfony/Bridge/Twig/Tests/Extension/FormExtensionBootstrap5HorizontalLayoutTest.php @@ -13,13 +13,7 @@ use Symfony\Bridge\Twig\Extension\FormExtension; use Symfony\Bridge\Twig\Extension\TranslationExtension; -use Symfony\Bridge\Twig\Form\TwigRendererEngine; use Symfony\Bridge\Twig\Tests\Extension\Fixtures\StubTranslator; -use Symfony\Component\Form\FormRenderer; -use Symfony\Component\Form\FormView; -use Symfony\Component\Security\Csrf\CsrfTokenManagerInterface; -use Twig\Environment; -use Twig\Loader\FilesystemLoader; /** * Class providing test cases for the Bootstrap 5 horizontal Twig form theme. @@ -28,86 +22,31 @@ */ class FormExtensionBootstrap5HorizontalLayoutTest extends AbstractBootstrap5HorizontalLayoutTestCase { - use RuntimeLoaderProvider; - protected array $testableFeatures = [ 'choice_attr', ]; - private FormRenderer $renderer; - - protected function setUp(): void + protected function getTemplatePaths(): array { - parent::setUp(); - - $loader = new FilesystemLoader([ + return [ __DIR__.'/../../Resources/views/Form', __DIR__.'/Fixtures/templates/form', - ]); - - $environment = new Environment($loader, ['strict_variables' => true]); - $environment->addExtension(new TranslationExtension(new StubTranslator())); - $environment->addExtension(new FormExtension()); - - $rendererEngine = new TwigRendererEngine([ - 'bootstrap_5_horizontal_layout.html.twig', - 'custom_widgets.html.twig', - ], $environment); - $this->renderer = new FormRenderer($rendererEngine, $this->getMockBuilder(CsrfTokenManagerInterface::class)->getMock()); - $this->registerTwigRuntimeLoader($environment, $this->renderer); - } - - protected function renderForm(FormView $view, array $vars = []): string - { - return $this->renderer->renderBlock($view, 'form', $vars); - } - - protected function renderLabel(FormView $view, $label = null, array $vars = []): string - { - if (null !== $label) { - $vars += ['label' => $label]; - } - - return $this->renderer->searchAndRenderBlock($view, 'label', $vars); - } - - protected function renderHelp(FormView $view): string - { - return $this->renderer->searchAndRenderBlock($view, 'help'); + ]; } - protected function renderErrors(FormView $view): string + protected function getTwigExtensions(): array { - return $this->renderer->searchAndRenderBlock($view, 'errors'); + return [ + new TranslationExtension(new StubTranslator()), + new FormExtension(), + ]; } - protected function renderWidget(FormView $view, array $vars = []): string + protected function getThemes(): array { - return $this->renderer->searchAndRenderBlock($view, 'widget', $vars); - } - - protected function renderRow(FormView $view, array $vars = []): string - { - return $this->renderer->searchAndRenderBlock($view, 'row', $vars); - } - - protected function renderRest(FormView $view, array $vars = []): string - { - return $this->renderer->searchAndRenderBlock($view, 'rest', $vars); - } - - protected function renderStart(FormView $view, array $vars = []): string - { - return $this->renderer->renderBlock($view, 'form_start', $vars); - } - - protected function renderEnd(FormView $view, array $vars = []): string - { - return $this->renderer->renderBlock($view, 'form_end', $vars); - } - - protected function setTheme(FormView $view, array $themes, $useDefaultThemes = true): void - { - $this->renderer->setTheme($view, $themes, $useDefaultThemes); + return [ + 'bootstrap_5_horizontal_layout.html.twig', + 'custom_widgets.html.twig', + ]; } } diff --git a/src/Symfony/Bridge/Twig/Tests/Extension/FormExtensionBootstrap5LayoutTest.php b/src/Symfony/Bridge/Twig/Tests/Extension/FormExtensionBootstrap5LayoutTest.php index 66f6bbb95a290..e7e537ac5ae49 100644 --- a/src/Symfony/Bridge/Twig/Tests/Extension/FormExtensionBootstrap5LayoutTest.php +++ b/src/Symfony/Bridge/Twig/Tests/Extension/FormExtensionBootstrap5LayoutTest.php @@ -18,7 +18,6 @@ use Symfony\Component\Form\Extension\Core\Type\FormType; use Symfony\Component\Form\Extension\Core\Type\MoneyType; use Symfony\Component\Form\FormRenderer; -use Symfony\Component\Form\FormView; use Symfony\Component\Security\Csrf\CsrfTokenManagerInterface; use Twig\Environment; use Twig\Loader\FilesystemLoader; @@ -30,31 +29,6 @@ */ class FormExtensionBootstrap5LayoutTest extends AbstractBootstrap5LayoutTestCase { - use RuntimeLoaderProvider; - - private FormRenderer $renderer; - - protected function setUp(): void - { - parent::setUp(); - - $loader = new FilesystemLoader([ - __DIR__.'/../../Resources/views/Form', - __DIR__.'/Fixtures/templates/form', - ]); - - $environment = new Environment($loader, ['strict_variables' => true]); - $environment->addExtension(new TranslationExtension(new StubTranslator())); - $environment->addExtension(new FormExtension()); - - $rendererEngine = new TwigRendererEngine([ - 'bootstrap_5_layout.html.twig', - 'custom_widgets.html.twig', - ], $environment); - $this->renderer = new FormRenderer($rendererEngine, $this->getMockBuilder(CsrfTokenManagerInterface::class)->getMock()); - $this->registerTwigRuntimeLoader($environment, $this->renderer); - } - public function testStartTagHasNoActionAttributeWhenActionIsEmpty() { $form = $this->factory->create(FormType::class, null, [ @@ -106,57 +80,27 @@ public function testMoneyWidgetInIso() , trim($this->renderWidget($view))); } - protected function renderForm(FormView $view, array $vars = []): string + protected function getTemplatePaths(): array { - return $this->renderer->renderBlock($view, 'form', $vars); - } - - protected function renderLabel(FormView $view, $label = null, array $vars = []): string - { - if (null !== $label) { - $vars += ['label' => $label]; - } - - return $this->renderer->searchAndRenderBlock($view, 'label', $vars); - } - - protected function renderHelp(FormView $view): string - { - return $this->renderer->searchAndRenderBlock($view, 'help'); - } - - protected function renderErrors(FormView $view): string - { - return $this->renderer->searchAndRenderBlock($view, 'errors'); - } - - protected function renderWidget(FormView $view, array $vars = []): string - { - return $this->renderer->searchAndRenderBlock($view, 'widget', $vars); - } - - protected function renderRow(FormView $view, array $vars = []): string - { - return $this->renderer->searchAndRenderBlock($view, 'row', $vars); - } - - protected function renderRest(FormView $view, array $vars = []): string - { - return $this->renderer->searchAndRenderBlock($view, 'rest', $vars); - } - - protected function renderStart(FormView $view, array $vars = []): string - { - return $this->renderer->renderBlock($view, 'form_start', $vars); + return [ + __DIR__.'/../../Resources/views/Form', + __DIR__.'/Fixtures/templates/form', + ]; } - protected function renderEnd(FormView $view, array $vars = []): string + protected function getTwigExtensions(): array { - return $this->renderer->renderBlock($view, 'form_end', $vars); + return [ + new TranslationExtension(new StubTranslator()), + new FormExtension(), + ]; } - protected function setTheme(FormView $view, array $themes, $useDefaultThemes = true): void + protected function getThemes(): array { - $this->renderer->setTheme($view, $themes, $useDefaultThemes); + return [ + 'bootstrap_5_layout.html.twig', + 'custom_widgets.html.twig', + ]; } } diff --git a/src/Symfony/Bridge/Twig/Tests/Extension/FormExtensionDivLayoutTest.php b/src/Symfony/Bridge/Twig/Tests/Extension/FormExtensionDivLayoutTest.php index c9dec6e248436..fa0f1824e0ec0 100644 --- a/src/Symfony/Bridge/Twig/Tests/Extension/FormExtensionDivLayoutTest.php +++ b/src/Symfony/Bridge/Twig/Tests/Extension/FormExtensionDivLayoutTest.php @@ -24,34 +24,6 @@ class FormExtensionDivLayoutTest extends AbstractDivLayoutTestCase { - use RuntimeLoaderProvider; - - private FormRenderer $renderer; - - protected function setUp(): void - { - parent::setUp(); - - $loader = new FilesystemLoader([ - __DIR__.'/../../Resources/views/Form', - __DIR__.'/Fixtures/templates/form', - ]); - - $environment = new Environment($loader, ['strict_variables' => true]); - $environment->addExtension(new TranslationExtension(new StubTranslator())); - $environment->addGlobal('global', ''); - // the value can be any template that exists - $environment->addGlobal('dynamic_template_name', 'child_label'); - $environment->addExtension(new FormExtension()); - - $rendererEngine = new TwigRendererEngine([ - 'form_div_layout.html.twig', - 'custom_widgets.html.twig', - ], $environment); - $this->renderer = new FormRenderer($rendererEngine, $this->createMock(CsrfTokenManagerInterface::class)); - $this->registerTwigRuntimeLoader($environment, $this->renderer); - } - public function testThemeBlockInheritanceUsingUse() { $view = $this->factory @@ -323,71 +295,50 @@ public function testLabelHtmlIsTrue() $this->assertMatchesXpath($html, '/label[@for="name"][@class="my&class required"]/b[.="Bolded label"]'); } - protected function renderForm(FormView $view, array $vars = []) - { - return $this->renderer->renderBlock($view, 'form', $vars); - } - - protected function renderLabel(FormView $view, $label = null, array $vars = []) - { - if (null !== $label) { - $vars += ['label' => $label]; - } - - return $this->renderer->searchAndRenderBlock($view, 'label', $vars); - } - - protected function renderHelp(FormView $view) - { - return $this->renderer->searchAndRenderBlock($view, 'help'); - } - - protected function renderErrors(FormView $view) - { - return $this->renderer->searchAndRenderBlock($view, 'errors'); - } - - protected function renderWidget(FormView $view, array $vars = []) - { - return $this->renderer->searchAndRenderBlock($view, 'widget', $vars); - } - - protected function renderRow(FormView $view, array $vars = []) - { - return $this->renderer->searchAndRenderBlock($view, 'row', $vars); - } - - protected function renderRest(FormView $view, array $vars = []) + public static function themeBlockInheritanceProvider() { - return $this->renderer->searchAndRenderBlock($view, 'rest', $vars); + return [ + [['theme.html.twig']], + ]; } - protected function renderStart(FormView $view, array $vars = []) + public static function themeInheritanceProvider() { - return $this->renderer->renderBlock($view, 'form_start', $vars); + return [ + [['parent_label.html.twig'], ['child_label.html.twig']], + ]; } - protected function renderEnd(FormView $view, array $vars = []) + protected function getTemplatePaths(): array { - return $this->renderer->renderBlock($view, 'form_end', $vars); + return [ + __DIR__.'/../../Resources/views/Form', + __DIR__.'/Fixtures/templates/form', + ]; } - protected function setTheme(FormView $view, array $themes, $useDefaultThemes = true) + protected function getTwigExtensions(): array { - $this->renderer->setTheme($view, $themes, $useDefaultThemes); + return [ + new TranslationExtension(new StubTranslator()), + new FormExtension(), + ]; } - public static function themeBlockInheritanceProvider() + protected function getTwigGlobals(): array { return [ - [['theme.html.twig']], + 'global' => '', + // the value can be any template that exists + 'dynamic_template_name' => 'child_label', ]; } - public static function themeInheritanceProvider() + protected function getThemes(): array { return [ - [['parent_label.html.twig'], ['child_label.html.twig']], + 'form_div_layout.html.twig', + 'custom_widgets.html.twig', ]; } } diff --git a/src/Symfony/Bridge/Twig/Tests/Extension/FormExtensionTableLayoutTest.php b/src/Symfony/Bridge/Twig/Tests/Extension/FormExtensionTableLayoutTest.php index 751d2b1f81e58..2ab48be2aca8c 100644 --- a/src/Symfony/Bridge/Twig/Tests/Extension/FormExtensionTableLayoutTest.php +++ b/src/Symfony/Bridge/Twig/Tests/Extension/FormExtensionTableLayoutTest.php @@ -13,42 +13,10 @@ use Symfony\Bridge\Twig\Extension\FormExtension; use Symfony\Bridge\Twig\Extension\TranslationExtension; -use Symfony\Bridge\Twig\Form\TwigRendererEngine; use Symfony\Bridge\Twig\Tests\Extension\Fixtures\StubTranslator; -use Symfony\Component\Form\FormRenderer; -use Symfony\Component\Form\FormView; -use Symfony\Component\Security\Csrf\CsrfTokenManagerInterface; -use Twig\Environment; -use Twig\Loader\FilesystemLoader; class FormExtensionTableLayoutTest extends AbstractTableLayoutTestCase { - use RuntimeLoaderProvider; - - private FormRenderer $renderer; - - protected function setUp(): void - { - parent::setUp(); - - $loader = new FilesystemLoader([ - __DIR__.'/../../Resources/views/Form', - __DIR__.'/Fixtures/templates/form', - ]); - - $environment = new Environment($loader, ['strict_variables' => true]); - $environment->addExtension(new TranslationExtension(new StubTranslator())); - $environment->addGlobal('global', ''); - $environment->addExtension(new FormExtension()); - - $rendererEngine = new TwigRendererEngine([ - 'form_table_layout.html.twig', - 'custom_widgets.html.twig', - ], $environment); - $this->renderer = new FormRenderer($rendererEngine, $this->createMock(CsrfTokenManagerInterface::class)); - $this->registerTwigRuntimeLoader($environment, $this->renderer); - } - public function testStartTagHasNoActionAttributeWhenActionIsEmpty() { $form = $this->factory->create('Symfony\Component\Form\Extension\Core\Type\FormType', null, [ @@ -209,57 +177,34 @@ public function testLabelHtmlIsTrue() $this->assertMatchesXpath($html, '/label[@for="name"][@class="my&class required"]/b[.="Bolded label"]'); } - protected function renderForm(FormView $view, array $vars = []) - { - return $this->renderer->renderBlock($view, 'form', $vars); - } - - protected function renderLabel(FormView $view, $label = null, array $vars = []) - { - if (null !== $label) { - $vars += ['label' => $label]; - } - - return $this->renderer->searchAndRenderBlock($view, 'label', $vars); - } - - protected function renderHelp(FormView $view) - { - return $this->renderer->searchAndRenderBlock($view, 'help'); - } - - protected function renderErrors(FormView $view) - { - return $this->renderer->searchAndRenderBlock($view, 'errors'); - } - - protected function renderWidget(FormView $view, array $vars = []) - { - return $this->renderer->searchAndRenderBlock($view, 'widget', $vars); - } - - protected function renderRow(FormView $view, array $vars = []) - { - return $this->renderer->searchAndRenderBlock($view, 'row', $vars); - } - - protected function renderRest(FormView $view, array $vars = []) + protected function getTemplatePaths(): array { - return $this->renderer->searchAndRenderBlock($view, 'rest', $vars); + return [ + __DIR__.'/../../Resources/views/Form', + __DIR__.'/Fixtures/templates/form', + ]; } - protected function renderStart(FormView $view, array $vars = []) + protected function getTwigExtensions(): array { - return $this->renderer->renderBlock($view, 'form_start', $vars); + return [ + new TranslationExtension(new StubTranslator()), + new FormExtension(), + ]; } - protected function renderEnd(FormView $view, array $vars = []) + protected function getTwigGlobals(): array { - return $this->renderer->renderBlock($view, 'form_end', $vars); + return [ + 'global' => '', + ]; } - protected function setTheme(FormView $view, array $themes, $useDefaultThemes = true) + protected function getThemes(): array { - $this->renderer->setTheme($view, $themes, $useDefaultThemes); + return [ + 'form_table_layout.html.twig', + 'custom_widgets.html.twig', + ]; } } diff --git a/src/Symfony/Bridge/Twig/Tests/Node/FormThemeTest.php b/src/Symfony/Bridge/Twig/Tests/Node/FormThemeTest.php index cf98191233057..a54f2c140326d 100644 --- a/src/Symfony/Bridge/Twig/Tests/Node/FormThemeTest.php +++ b/src/Symfony/Bridge/Twig/Tests/Node/FormThemeTest.php @@ -13,7 +13,7 @@ use PHPUnit\Framework\TestCase; use Symfony\Bridge\Twig\Node\FormThemeNode; -use Symfony\Bridge\Twig\Tests\Extension\RuntimeLoaderProvider; +use Symfony\Bridge\Twig\Test\Traits\RuntimeLoaderProvider; use Symfony\Component\Form\FormRenderer; use Symfony\Component\Form\FormRendererEngineInterface; use Twig\Compiler;