Chris@0
|
1 <?php
|
Chris@0
|
2
|
Chris@0
|
3 namespace Drupal\Tests\node\Functional;
|
Chris@0
|
4
|
Chris@0
|
5 use Drupal\field\Entity\FieldStorageConfig;
|
Chris@0
|
6 use Drupal\language\Entity\ConfigurableLanguage;
|
Chris@0
|
7 use Drupal\language\Plugin\LanguageNegotiation\LanguageNegotiationUrl;
|
Chris@0
|
8 use Drupal\Core\Language\LanguageInterface;
|
Chris@0
|
9 use Drupal\Tests\BrowserTestBase;
|
Chris@0
|
10
|
Chris@0
|
11 /**
|
Chris@0
|
12 * Tests multilingual support for fields.
|
Chris@0
|
13 *
|
Chris@0
|
14 * @group node
|
Chris@0
|
15 */
|
Chris@0
|
16 class NodeFieldMultilingualTest extends BrowserTestBase {
|
Chris@0
|
17
|
Chris@0
|
18 /**
|
Chris@0
|
19 * Modules to enable.
|
Chris@0
|
20 *
|
Chris@0
|
21 * @var array
|
Chris@0
|
22 */
|
Chris@0
|
23 public static $modules = ['node', 'language'];
|
Chris@0
|
24
|
Chris@0
|
25 protected function setUp() {
|
Chris@0
|
26 parent::setUp();
|
Chris@0
|
27
|
Chris@0
|
28 // Create Basic page node type.
|
Chris@0
|
29 $this->drupalCreateContentType(['type' => 'page', 'name' => 'Basic page']);
|
Chris@0
|
30
|
Chris@0
|
31 // Setup users.
|
Chris@0
|
32 $admin_user = $this->drupalCreateUser(['administer languages', 'administer content types', 'access administration pages', 'create page content', 'edit own page content']);
|
Chris@0
|
33 $this->drupalLogin($admin_user);
|
Chris@0
|
34
|
Chris@0
|
35 // Add a new language.
|
Chris@0
|
36 ConfigurableLanguage::createFromLangcode('it')->save();
|
Chris@0
|
37
|
Chris@0
|
38 // Enable URL language detection and selection.
|
Chris@0
|
39 $edit = ['language_interface[enabled][language-url]' => '1'];
|
Chris@0
|
40 $this->drupalPostForm('admin/config/regional/language/detection', $edit, t('Save settings'));
|
Chris@0
|
41
|
Chris@0
|
42 // Set "Basic page" content type to use multilingual support.
|
Chris@0
|
43 $edit = [
|
Chris@0
|
44 'language_configuration[language_alterable]' => TRUE,
|
Chris@0
|
45 ];
|
Chris@0
|
46 $this->drupalPostForm('admin/structure/types/manage/page', $edit, t('Save content type'));
|
Chris@0
|
47 $this->assertRaw(t('The content type %type has been updated.', ['%type' => 'Basic page']), 'Basic page content type has been updated.');
|
Chris@0
|
48
|
Chris@0
|
49 // Make node body translatable.
|
Chris@0
|
50 $field_storage = FieldStorageConfig::loadByName('node', 'body');
|
Chris@0
|
51 $field_storage->setTranslatable(TRUE);
|
Chris@0
|
52 $field_storage->save();
|
Chris@0
|
53 }
|
Chris@0
|
54
|
Chris@0
|
55 /**
|
Chris@0
|
56 * Tests whether field languages are correctly set through the node form.
|
Chris@0
|
57 */
|
Chris@0
|
58 public function testMultilingualNodeForm() {
|
Chris@0
|
59 // Create "Basic page" content.
|
Chris@0
|
60 $langcode = language_get_default_langcode('node', 'page');
|
Chris@0
|
61 $title_key = 'title[0][value]';
|
Chris@0
|
62 $title_value = $this->randomMachineName(8);
|
Chris@0
|
63 $body_key = 'body[0][value]';
|
Chris@0
|
64 $body_value = $this->randomMachineName(16);
|
Chris@0
|
65
|
Chris@0
|
66 // Create node to edit.
|
Chris@0
|
67 $edit = [];
|
Chris@0
|
68 $edit[$title_key] = $title_value;
|
Chris@0
|
69 $edit[$body_key] = $body_value;
|
Chris@0
|
70 $this->drupalPostForm('node/add/page', $edit, t('Save'));
|
Chris@0
|
71
|
Chris@0
|
72 // Check that the node exists in the database.
|
Chris@0
|
73 $node = $this->drupalGetNodeByTitle($edit[$title_key]);
|
Chris@0
|
74 $this->assertTrue($node, 'Node found in database.');
|
Chris@0
|
75 $this->assertTrue($node->language()->getId() == $langcode && $node->body->value == $body_value, 'Field language correctly set.');
|
Chris@0
|
76
|
Chris@0
|
77 // Change node language.
|
Chris@0
|
78 $langcode = 'it';
|
Chris@0
|
79 $this->drupalGet("node/{$node->id()}/edit");
|
Chris@0
|
80 $edit = [
|
Chris@0
|
81 $title_key => $this->randomMachineName(8),
|
Chris@0
|
82 'langcode[0][value]' => $langcode,
|
Chris@0
|
83 ];
|
Chris@0
|
84 $this->drupalPostForm(NULL, $edit, t('Save'));
|
Chris@0
|
85 $node = $this->drupalGetNodeByTitle($edit[$title_key], TRUE);
|
Chris@0
|
86 $this->assertTrue($node, 'Node found in database.');
|
Chris@0
|
87 $this->assertTrue($node->language()->getId() == $langcode && $node->body->value == $body_value, 'Field language correctly changed.');
|
Chris@0
|
88
|
Chris@0
|
89 // Enable content language URL detection.
|
Chris@0
|
90 $this->container->get('language_negotiator')->saveConfiguration(LanguageInterface::TYPE_CONTENT, [LanguageNegotiationUrl::METHOD_ID => 0]);
|
Chris@0
|
91
|
Chris@0
|
92 // Test multilingual field language fallback logic.
|
Chris@0
|
93 $this->drupalGet("it/node/{$node->id()}");
|
Chris@0
|
94 $this->assertRaw($body_value, 'Body correctly displayed using Italian as requested language');
|
Chris@0
|
95
|
Chris@0
|
96 $this->drupalGet("node/{$node->id()}");
|
Chris@0
|
97 $this->assertRaw($body_value, 'Body correctly displayed using English as requested language');
|
Chris@0
|
98 }
|
Chris@0
|
99
|
Chris@0
|
100 /**
|
Chris@0
|
101 * Tests multilingual field display settings.
|
Chris@0
|
102 */
|
Chris@0
|
103 public function testMultilingualDisplaySettings() {
|
Chris@0
|
104 // Create "Basic page" content.
|
Chris@0
|
105 $title_key = 'title[0][value]';
|
Chris@0
|
106 $title_value = $this->randomMachineName(8);
|
Chris@0
|
107 $body_key = 'body[0][value]';
|
Chris@0
|
108 $body_value = $this->randomMachineName(16);
|
Chris@0
|
109
|
Chris@0
|
110 // Create node to edit.
|
Chris@0
|
111 $edit = [];
|
Chris@0
|
112 $edit[$title_key] = $title_value;
|
Chris@0
|
113 $edit[$body_key] = $body_value;
|
Chris@0
|
114 $this->drupalPostForm('node/add/page', $edit, t('Save'));
|
Chris@0
|
115
|
Chris@0
|
116 // Check that the node exists in the database.
|
Chris@0
|
117 $node = $this->drupalGetNodeByTitle($edit[$title_key]);
|
Chris@0
|
118 $this->assertTrue($node, 'Node found in database.');
|
Chris@0
|
119
|
Chris@0
|
120 // Check if node body is showed.
|
Chris@0
|
121 $this->drupalGet('node/' . $node->id());
|
Chris@0
|
122 $body = $this->xpath('//article[contains(concat(" ", normalize-space(@class), " "), :node-class)]//div[contains(concat(" ", normalize-space(@class), " "), :content-class)]/descendant::p', [
|
Chris@0
|
123 ':node-class' => ' node ',
|
Chris@0
|
124 ':content-class' => 'node__content',
|
Chris@0
|
125 ]);
|
Chris@0
|
126 $this->assertEqual($body[0]->getText(), $node->body->value, 'Node body found.');
|
Chris@0
|
127 }
|
Chris@0
|
128
|
Chris@0
|
129 }
|