3 namespace Drupal\system\Tests\Entity;
5 use Drupal\Core\Language\LanguageInterface;
6 use Drupal\field\Entity\FieldStorageConfig;
7 use Drupal\language\Entity\ConfigurableLanguage;
8 use Drupal\simpletest\WebTestBase;
11 * Tests entity translation form.
15 class EntityTranslationFormTest extends WebTestBase {
22 public static $modules = ['entity_test', 'language', 'node'];
26 protected function setUp() {
28 // Enable translations for the test entity type.
29 \Drupal::state()->set('entity_test.translation', TRUE);
31 // Create test languages.
32 $this->langcodes = [];
33 for ($i = 0; $i < 2; ++$i) {
34 $language = ConfigurableLanguage::create([
36 'label' => $this->randomString(),
38 $this->langcodes[$i] = $language->id();
44 * Tests entity form language.
46 public function testEntityFormLanguage() {
47 $this->drupalCreateContentType(['type' => 'page', 'name' => 'Basic page']);
49 $web_user = $this->drupalCreateUser(['create page content', 'edit own page content', 'administer content types']);
50 $this->drupalLogin($web_user);
52 // Create a node with language LanguageInterface::LANGCODE_NOT_SPECIFIED.
54 $edit['title[0][value]'] = $this->randomMachineName(8);
55 $edit['body[0][value]'] = $this->randomMachineName(16);
56 $this->drupalGet('node/add/page');
57 $form_langcode = \Drupal::state()->get('entity_test.form_langcode');
58 $this->drupalPostForm(NULL, $edit, t('Save'));
60 $node = $this->drupalGetNodeByTitle($edit['title[0][value]']);
62 $this->assertTrue($node->language()->getId() == $form_langcode, 'Form language is the same as the entity language.');
64 // Edit the node and test the form language.
65 $this->drupalGet($this->langcodes[0] . '/node/' . $node->id() . '/edit');
66 $form_langcode = \Drupal::state()->get('entity_test.form_langcode');
67 $this->assertTrue($node->language()->getId() == $form_langcode, 'Form language is the same as the entity language.');
69 // Explicitly set form langcode.
70 $langcode = $this->langcodes[0];
71 $form_state_additions['langcode'] = $langcode;
72 \Drupal::service('entity.form_builder')->getForm($node, 'default', $form_state_additions);
73 $form_langcode = \Drupal::state()->get('entity_test.form_langcode');
74 $this->assertTrue($langcode == $form_langcode, 'Form language is the same as the language parameter.');
76 // Enable language selector.
77 $this->drupalGet('admin/structure/types/manage/page');
78 $edit = ['language_configuration[language_alterable]' => TRUE, 'language_configuration[langcode]' => LanguageInterface::LANGCODE_NOT_SPECIFIED];
79 $this->drupalPostForm('admin/structure/types/manage/page', $edit, t('Save content type'));
80 $this->assertRaw(t('The content type %type has been updated.', ['%type' => 'Basic page']), 'Basic page content type has been updated.');
82 // Create a node with language.
84 $langcode = $this->langcodes[0];
85 $edit['title[0][value]'] = $this->randomMachineName(8);
86 $edit['body[0][value]'] = $this->randomMachineName(16);
87 $edit['langcode[0][value]'] = $langcode;
88 $this->drupalPostForm('node/add/page', $edit, t('Save'));
89 $this->assertText(t('Basic page @title has been created.', ['@title' => $edit['title[0][value]']]), 'Basic page created.');
91 // Verify that the creation message contains a link to a node.
92 $view_link = $this->xpath('//div[@class="messages"]//a[contains(@href, :href)]', [':href' => 'node/']);
93 $this->assert(isset($view_link), 'The message area contains a link to a node');
95 // Check to make sure the node was created.
96 $node = $this->drupalGetNodeByTitle($edit['title[0][value]']);
97 $this->assertTrue($node, 'Node found in database.');
99 // Make body translatable.
100 $field_storage = FieldStorageConfig::loadByName('node', 'body');
101 $field_storage->setTranslatable(TRUE);
102 $field_storage->save();
103 $field_storage = FieldStorageConfig::loadByName('node', 'body');
104 $this->assertTrue($field_storage->isTranslatable(), 'Field body is translatable.');
106 // Create a body translation and check the form language.
107 $langcode2 = $this->langcodes[1];
108 $translation = $node->addTranslation($langcode2);
109 $translation->title->value = $this->randomString();
110 $translation->body->value = $this->randomMachineName(16);
111 $translation->setOwnerId($web_user->id());
113 $this->drupalGet($langcode2 . '/node/' . $node->id() . '/edit');
114 $form_langcode = \Drupal::state()->get('entity_test.form_langcode');
115 $this->assertTrue($langcode2 == $form_langcode, "Node edit form language is $langcode2.");