annotate core/tests/Drupal/FunctionalTests/Routing/RouteCachingLanguageTest.php @ 19:fa3358dc1485 tip

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