TwigMarkupInterfaceTest.php 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. <?php
  2. /**
  3. * @file
  4. * Contains \Drupal\KernelTests\Core\Theme\TwigMarkupInterfaceTest.
  5. */
  6. namespace Drupal\KernelTests\Core\Theme;
  7. use Drupal\Component\Render\FormattableMarkup;
  8. use Drupal\Component\Render\MarkupInterface;
  9. use Drupal\Component\Render\MarkupTrait;
  10. use Drupal\Core\GeneratedLink;
  11. use Drupal\Core\Render\RenderContext;
  12. use Drupal\Core\Render\Markup;
  13. use Drupal\Core\Site\Settings;
  14. use Drupal\Core\StringTranslation\TranslatableMarkup;
  15. use Drupal\KernelTests\KernelTestBase;
  16. /**
  17. * Tests Twig with MarkupInterface objects.
  18. *
  19. * @group Theme
  20. */
  21. class TwigMarkupInterfaceTest extends KernelTestBase {
  22. /**
  23. * Modules to enable.
  24. *
  25. * @var array
  26. */
  27. public static $modules = [
  28. 'language'
  29. ];
  30. /**
  31. * @dataProvider providerTestMarkupInterfaceEmpty
  32. */
  33. public function testMarkupInterfaceEmpty($expected, $variable) {
  34. $this->assertEquals($expected, $this->renderObjectWithTwig($variable));
  35. }
  36. /**
  37. * Provide test examples.
  38. */
  39. public function providerTestMarkupInterfaceEmpty() {
  40. return [
  41. // @codingStandardsIgnoreStart
  42. // The first argument to \Drupal\Core\StringTranslation\TranslatableMarkup
  43. // is not supposed to be an empty string.
  44. 'empty TranslatableMarkup' => ['', new TranslatableMarkup('')],
  45. // @codingStandardsIgnoreEnd
  46. 'non-empty TranslatableMarkup' => ['<span>test</span>', new TranslatableMarkup('test')],
  47. 'empty FormattableMarkup' => ['', new FormattableMarkup('', ['@foo' => 'bar'])],
  48. 'non-empty FormattableMarkup' => ['<span>bar</span>', new FormattableMarkup('@foo', ['@foo' => 'bar'])],
  49. 'non-empty Markup' => ['<span>test</span>', Markup::create('test')],
  50. 'empty GeneratedLink' => ['', new GeneratedLink()],
  51. 'non-empty GeneratedLink' => ['<span><a hef="http://www.example.com">test</a></span>', (new GeneratedLink())->setGeneratedLink('<a hef="http://www.example.com">test</a>')],
  52. // Test objects that do not implement \Countable.
  53. 'empty SafeMarkupTestMarkup' => ['<span></span>', SafeMarkupTestMarkup::create('')],
  54. 'non-empty SafeMarkupTestMarkup' => ['<span>test</span>', SafeMarkupTestMarkup::create('test')],
  55. ];
  56. }
  57. /**
  58. * Tests behaviour if a string is translated to become an empty string.
  59. */
  60. public function testEmptyTranslation() {
  61. $settings = Settings::getAll();
  62. $settings['locale_custom_strings_en'] = ['' => ['test' => '']];
  63. // Recreate the settings static.
  64. new Settings($settings);
  65. $variable = new TranslatableMarkup('test');
  66. $this->assertEquals('', $this->renderObjectWithTwig($variable));
  67. $variable = new TranslatableMarkup('test', [], ['langcode' => 'de']);
  68. $this->assertEquals('<span>test</span>', $this->renderObjectWithTwig($variable));
  69. }
  70. /**
  71. * @return \Drupal\Component\Render\MarkupInterface
  72. * The rendered HTML.
  73. */
  74. protected function renderObjectWithTwig($variable) {
  75. /** @var \Drupal\Core\Render\RendererInterface $renderer */
  76. $renderer = \Drupal::service('renderer');
  77. $context = new RenderContext();
  78. return $renderer->executeInRenderContext($context, function () use ($renderer, $variable) {
  79. $elements = [
  80. '#type' => 'inline_template',
  81. '#template' => '{%- if variable is not empty -%}<span>{{ variable }}</span>{%- endif -%}',
  82. '#context' => ['variable' => $variable],
  83. ];
  84. return $renderer->render($elements);
  85. });
  86. }
  87. }
  88. /**
  89. * Implements MarkupInterface without implementing \Countable
  90. */
  91. class SafeMarkupTestMarkup implements MarkupInterface {
  92. use MarkupTrait;
  93. /**
  94. * Overrides MarkupTrait::create() to allow creation with empty strings.
  95. */
  96. public static function create($string) {
  97. $object = new static();
  98. $object->string = $string;
  99. return $object;
  100. }
  101. }