RouteCachingLanguageTest.php 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186
  1. <?php
  2. namespace Drupal\FunctionalTests\Routing;
  3. use Drupal\field\Entity\FieldConfig;
  4. use Drupal\field\Entity\FieldStorageConfig;
  5. use Drupal\language\Entity\ConfigurableLanguage;
  6. use Drupal\link\LinkItemInterface;
  7. use Drupal\Tests\BrowserTestBase;
  8. /**
  9. * Tests that route lookup is cached by the current language.
  10. *
  11. * @group routing
  12. */
  13. class RouteCachingLanguageTest extends BrowserTestBase {
  14. /**
  15. * Modules to enable.
  16. *
  17. * @var array
  18. */
  19. public static $modules = ['path', 'node', 'content_translation', 'link', 'block'];
  20. /**
  21. * An user with permissions to administer content types.
  22. *
  23. * @var \Drupal\user\UserInterface
  24. */
  25. protected $webUser;
  26. protected function setUp() {
  27. parent::setUp();
  28. $this->createContentType(['type' => 'page']);
  29. $this->drupalPlaceBlock('local_tasks_block');
  30. $this->drupalPlaceBlock('page_title_block');
  31. $permissions = [
  32. 'access administration pages',
  33. 'administer content translation',
  34. 'administer content types',
  35. 'administer languages',
  36. 'administer url aliases',
  37. 'create content translations',
  38. 'create page content',
  39. 'create url aliases',
  40. 'edit any page content',
  41. 'translate any entity',
  42. ];
  43. // Create and log in user.
  44. $this->webUser = $this->drupalCreateUser($permissions);
  45. $this->drupalLogin($this->webUser);
  46. // Enable French language.
  47. ConfigurableLanguage::createFromLangcode('fr')->save();
  48. // Enable translation for page node.
  49. $edit = [
  50. 'entity_types[node]' => 1,
  51. 'settings[node][page][translatable]' => 1,
  52. 'settings[node][page][fields][path]' => 1,
  53. 'settings[node][page][fields][body]' => 1,
  54. 'settings[node][page][settings][language][language_alterable]' => 1,
  55. ];
  56. $this->drupalPostForm('admin/config/regional/content-language', $edit, t('Save configuration'));
  57. // Create a field with settings to validate.
  58. $field_storage = FieldStorageConfig::create([
  59. 'field_name' => 'field_link',
  60. 'entity_type' => 'node',
  61. 'type' => 'link',
  62. ]);
  63. $field_storage->save();
  64. $field = FieldConfig::create([
  65. 'field_storage' => $field_storage,
  66. 'bundle' => 'page',
  67. 'settings' => [
  68. 'title' => DRUPAL_OPTIONAL,
  69. 'link_type' => LinkItemInterface::LINK_GENERIC,
  70. ],
  71. ]);
  72. $field->save();
  73. entity_get_form_display('node', 'page', 'default')
  74. ->setComponent('field_link', [
  75. 'type' => 'link_default',
  76. ])
  77. ->save();
  78. entity_get_display('node', 'page', 'full')
  79. ->setComponent('field_link', [
  80. 'type' => 'link',
  81. ])
  82. ->save();
  83. // Enable URL language detection and selection and set a prefix for both
  84. // languages.
  85. $edit = ['language_interface[enabled][language-url]' => 1];
  86. $this->drupalPostForm('admin/config/regional/language/detection', $edit, 'Save settings');
  87. $edit = ['prefix[en]' => 'en'];
  88. $this->drupalPostForm('admin/config/regional/language/detection/url', $edit, 'Save configuration');
  89. // Reset the cache after changing the negotiation settings as that changes
  90. // how links are built.
  91. $this->resetAll();
  92. $definitions = \Drupal::service('entity_field.manager')->getFieldDefinitions('node', 'page');
  93. $this->assertTrue($definitions['path']->isTranslatable(), 'Node path is translatable.');
  94. $this->assertTrue($definitions['body']->isTranslatable(), 'Node body is translatable.');
  95. }
  96. /**
  97. * Creates content with a link field pointing to an alias of another language.
  98. *
  99. * @dataProvider providerLanguage
  100. */
  101. public function testLinkTranslationWithAlias($source_langcode) {
  102. $source_url_options = [
  103. 'language' => ConfigurableLanguage::load($source_langcode),
  104. ];
  105. // Create a target node in the source language that is the link target.
  106. $edit = [
  107. 'langcode[0][value]' => $source_langcode,
  108. 'title[0][value]' => 'Target page',
  109. 'path[0][alias]' => '/target-page',
  110. ];
  111. $this->drupalPostForm('node/add/page', $edit, t('Save'), $source_url_options);
  112. // Confirm that the alias works.
  113. $assert_session = $this->assertSession();
  114. $assert_session->addressEquals($source_langcode . '/target-page');
  115. $assert_session->statusCodeEquals(200);
  116. $assert_session->pageTextContains('Target page');
  117. // Create a second node that links to the first through the link field.
  118. $edit = [
  119. 'langcode[0][value]' => $source_langcode,
  120. 'title[0][value]' => 'Link page',
  121. 'field_link[0][uri]' => '/target-page',
  122. 'field_link[0][title]' => 'Target page',
  123. 'path[0][alias]' => '/link-page',
  124. ];
  125. $this->drupalPostForm('node/add/page', $edit, t('Save'), $source_url_options);
  126. // Make sure the link node is displayed with a working link.
  127. $assert_session->pageTextContains('Link page');
  128. $this->clickLink('Target page');
  129. $assert_session->addressEquals($source_langcode . '/target-page');
  130. $assert_session->statusCodeEquals(200);
  131. $assert_session->pageTextContains('Target page');
  132. // Clear all caches, then add a translation for the link node.
  133. $this->resetAll();
  134. $this->drupalGet('link-page', $source_url_options);
  135. $this->clickLink('Translate');
  136. $this->clickLink(t('Add'));
  137. // Do not change the link field.
  138. $edit = [
  139. 'title[0][value]' => 'Translated link page',
  140. 'path[0][alias]' => '/translated-link-page',
  141. ];
  142. $this->drupalPostForm(NULL, $edit, 'Save (this translation)');
  143. $assert_session->pageTextContains('Translated link page');
  144. // @todo Clicking on the link does not include the language prefix.
  145. $this->drupalGet('target-page', $source_url_options);
  146. $assert_session->statusCodeEquals(200);
  147. $assert_session->pageTextContains('Target page');
  148. }
  149. /**
  150. * Data provider for testFromUri().
  151. */
  152. public function providerLanguage() {
  153. return [
  154. ['en'],
  155. ['fr'],
  156. ];
  157. }
  158. }