--- /dev/null
+<?php
+
+namespace Drupal\language\Tests;
+
+use Drupal\Core\Language\LanguageInterface;
+use Drupal\language\Entity\ConfigurableLanguage;
+use Drupal\language\Entity\ContentLanguageSettings;
+use Drupal\simpletest\WebTestBase;
+use Drupal\taxonomy\Entity\Vocabulary;
+
+/**
+ * Tests the features of the language configuration element field.
+ *
+ * @group language
+ */
+class LanguageConfigurationElementTest extends WebTestBase {
+
+ /**
+ * Modules to enable.
+ *
+ * @var array
+ */
+ public static $modules = ['taxonomy', 'node', 'language', 'language_elements_test', 'field_ui'];
+
+ protected function setUp() {
+ parent::setUp();
+ $user = $this->drupalCreateUser(['access administration pages', 'administer languages', 'administer content types']);
+ $this->drupalLogin($user);
+ }
+
+ /**
+ * Tests the language settings have been saved.
+ */
+ public function testLanguageConfigurationElement() {
+ $this->drupalGet('language-tests/language_configuration_element');
+ $edit['lang_configuration[langcode]'] = 'current_interface';
+ $edit['lang_configuration[language_alterable]'] = FALSE;
+ $this->drupalPostForm(NULL, $edit, 'Save');
+ $lang_conf = ContentLanguageSettings::loadByEntityTypeBundle('entity_test', 'some_bundle');
+
+ // Check that the settings have been saved.
+ $this->assertEqual($lang_conf->getDefaultLangcode(), 'current_interface');
+ $this->assertFalse($lang_conf->isLanguageAlterable());
+ $this->drupalGet('language-tests/language_configuration_element');
+ $this->assertOptionSelected('edit-lang-configuration-langcode', 'current_interface');
+ $this->assertNoFieldChecked('edit-lang-configuration-language-alterable');
+
+ // Reload the page and save again.
+ $this->drupalGet('language-tests/language_configuration_element');
+ $edit['lang_configuration[langcode]'] = 'authors_default';
+ $edit['lang_configuration[language_alterable]'] = TRUE;
+ $this->drupalPostForm(NULL, $edit, 'Save');
+ $lang_conf = ContentLanguageSettings::loadByEntityTypeBundle('entity_test', 'some_bundle');
+
+ // Check that the settings have been saved.
+ $this->assertEqual($lang_conf->getDefaultLangcode(), 'authors_default');
+ $this->assertTrue($lang_conf->isLanguageAlterable());
+ $this->drupalGet('language-tests/language_configuration_element');
+ $this->assertOptionSelected('edit-lang-configuration-langcode', 'authors_default');
+ $this->assertFieldChecked('edit-lang-configuration-language-alterable');
+
+ // Test if content type settings have been saved.
+ $edit = [
+ 'name' => 'Page',
+ 'type' => 'page',
+ 'language_configuration[langcode]' => 'authors_default',
+ 'language_configuration[language_alterable]' => TRUE,
+ ];
+ $this->drupalPostForm('admin/structure/types/add', $edit, 'Save and manage fields');
+
+ // Make sure the settings are saved when creating the content type.
+ $this->drupalGet('admin/structure/types/manage/page');
+ $this->assertOptionSelected('edit-language-configuration-langcode', 'authors_default');
+ $this->assertFieldChecked('edit-language-configuration-language-alterable');
+
+ }
+
+ /**
+ * Tests that the language_get_default_langcode() returns the correct values.
+ */
+ public function testDefaultLangcode() {
+ // Add some custom languages.
+ foreach (['aa', 'bb', 'cc'] as $language_code) {
+ ConfigurableLanguage::create([
+ 'id' => $language_code,
+ 'label' => $this->randomMachineName(),
+ ])->save();
+ }
+
+ // Fixed language.
+ ContentLanguageSettings::loadByEntityTypeBundle('entity_test', 'custom_bundle')
+ ->setLanguageAlterable(TRUE)
+ ->setDefaultLangcode('bb')
+ ->save();
+
+ $langcode = language_get_default_langcode('entity_test', 'custom_bundle');
+ $this->assertEqual($langcode, 'bb');
+
+ // Current interface.
+ ContentLanguageSettings::loadByEntityTypeBundle('entity_test', 'custom_bundle')
+ ->setLanguageAlterable(TRUE)
+ ->setDefaultLangcode('current_interface')
+ ->save();
+
+ $langcode = language_get_default_langcode('entity_test', 'custom_bundle');
+ $language_interface = \Drupal::languageManager()->getCurrentLanguage();
+ $this->assertEqual($langcode, $language_interface->getId());
+
+ // Site's default.
+ $old_default = \Drupal::languageManager()->getDefaultLanguage();
+ // Ensure the language entity default value is correct.
+ $configurable_language = ConfigurableLanguage::load($old_default->getId());
+ $this->assertTrue($configurable_language->isDefault(), 'The en language entity is flagged as the default language.');
+
+ $this->config('system.site')->set('default_langcode', 'cc')->save();
+ ContentLanguageSettings::loadByEntityTypeBundle('entity_test', 'custom_bundle')
+ ->setLanguageAlterable(TRUE)
+ ->setDefaultLangcode(LanguageInterface::LANGCODE_SITE_DEFAULT)
+ ->save();
+ $langcode = language_get_default_langcode('entity_test', 'custom_bundle');
+ $this->assertEqual($langcode, 'cc');
+
+ // Ensure the language entity default value is correct.
+ $configurable_language = ConfigurableLanguage::load($old_default->getId());
+ $this->assertFalse($configurable_language->isDefault(), 'The en language entity is not flagged as the default language.');
+ $configurable_language = ConfigurableLanguage::load('cc');
+ // Check calling the
+ // \Drupal\language\ConfigurableLanguageInterface::isDefault() method
+ // directly.
+ $this->assertTrue($configurable_language->isDefault(), 'The cc language entity is flagged as the default language.');
+
+ // Check the default value of a language field when authors preferred option
+ // is selected.
+ // Create first an user and assign a preferred langcode to him.
+ $some_user = $this->drupalCreateUser();
+ $some_user->preferred_langcode = 'bb';
+ $some_user->save();
+ $this->drupalLogin($some_user);
+ ContentLanguageSettings::create([
+ 'target_entity_type_id' => 'entity_test',
+ 'target_bundle' => 'some_bundle',
+ ])->setLanguageAlterable(TRUE)
+ ->setDefaultLangcode('authors_default')
+ ->save();
+
+ $this->drupalGet('language-tests/language_configuration_element_test');
+ $this->assertOptionSelected('edit-langcode', 'bb');
+ }
+
+ /**
+ * Tests that the configuration is retained when the node type is updated.
+ */
+ public function testNodeTypeUpdate() {
+ // Create the article content type first if the profile used is not the
+ // standard one.
+ if ($this->profile != 'standard') {
+ $this->drupalCreateContentType(['type' => 'article', 'name' => 'Article']);
+ }
+ $admin_user = $this->drupalCreateUser(['administer content types']);
+ $this->drupalLogin($admin_user);
+ $edit = [
+ 'language_configuration[langcode]' => 'current_interface',
+ 'language_configuration[language_alterable]' => TRUE,
+ ];
+ $this->drupalPostForm('admin/structure/types/manage/article', $edit, t('Save content type'));
+ // Check the language default configuration for the articles.
+ $configuration = ContentLanguageSettings::loadByEntityTypeBundle('node', 'article');
+ $uuid = $configuration->uuid();
+ $this->assertEqual($configuration->getDefaultLangcode(), 'current_interface', 'The default language configuration has been saved on the Article content type.');
+ $this->assertTrue($configuration->isLanguageAlterable(), 'The alterable language configuration has been saved on the Article content type.');
+ // Update the article content type by changing the title label.
+ $edit = [
+ 'title_label' => 'Name'
+ ];
+ $this->drupalPostForm('admin/structure/types/manage/article', $edit, t('Save content type'));
+ // Check that we still have the settings for the updated node type.
+ $configuration = ContentLanguageSettings::loadByEntityTypeBundle('node', 'article');
+ $this->assertEqual($configuration->getDefaultLangcode(), 'current_interface', 'The default language configuration has been kept on the updated Article content type.');
+ $this->assertTrue($configuration->isLanguageAlterable(), 'The alterable language configuration has been kept on the updated Article content type.');
+ $this->assertEqual($configuration->uuid(), $uuid, 'The language configuration uuid has been kept on the updated Article content type.');
+ }
+
+ /**
+ * Tests the language settings are deleted on bundle delete.
+ */
+ public function testNodeTypeDelete() {
+ // Create the article content type first if the profile used is not the
+ // standard one.
+ if ($this->profile != 'standard') {
+ $this->drupalCreateContentType([
+ 'type' => 'article',
+ 'name' => 'Article'
+ ]);
+ }
+ $admin_user = $this->drupalCreateUser(['administer content types']);
+ $this->drupalLogin($admin_user);
+
+ // Create language configuration for the articles.
+ $edit = [
+ 'language_configuration[langcode]' => 'authors_default',
+ 'language_configuration[language_alterable]' => TRUE,
+ ];
+ $this->drupalPostForm('admin/structure/types/manage/article', $edit, t('Save content type'));
+
+ // Check the language default configuration for articles is present.
+ $configuration = \Drupal::entityManager()->getStorage('language_content_settings')->load('node.article');
+ $this->assertTrue($configuration, 'The language configuration is present.');
+
+ // Delete 'article' bundle.
+ $this->drupalPostForm('admin/structure/types/manage/article/delete', [], t('Delete'));
+
+ // Check that the language configuration has been deleted.
+ \Drupal::entityManager()->getStorage('language_content_settings')->resetCache();
+ $configuration = \Drupal::entityManager()->getStorage('language_content_settings')->load('node.article');
+ $this->assertFalse($configuration, 'The language configuration was deleted after bundle was deleted.');
+ }
+
+ /**
+ * Tests that the configuration is retained when a vocabulary is updated.
+ */
+ public function testTaxonomyVocabularyUpdate() {
+ $vocabulary = Vocabulary::create([
+ 'name' => 'Country',
+ 'vid' => 'country',
+ ]);
+ $vocabulary->save();
+
+ $admin_user = $this->drupalCreateUser(['administer taxonomy']);
+ $this->drupalLogin($admin_user);
+ $edit = [
+ 'default_language[langcode]' => 'current_interface',
+ 'default_language[language_alterable]' => TRUE,
+ ];
+ $this->drupalPostForm('admin/structure/taxonomy/manage/country', $edit, t('Save'));
+
+ // Check the language default configuration.
+ $configuration = ContentLanguageSettings::loadByEntityTypeBundle('taxonomy_term', 'country');
+ $uuid = $configuration->uuid();
+ $this->assertEqual($configuration->getDefaultLangcode(), 'current_interface', 'The default language configuration has been saved on the Country vocabulary.');
+ $this->assertTrue($configuration->isLanguageAlterable(), 'The alterable language configuration has been saved on the Country vocabulary.');
+ // Update the vocabulary.
+ $edit = [
+ 'name' => 'Nation'
+ ];
+ $this->drupalPostForm('admin/structure/taxonomy/manage/country', $edit, t('Save'));
+ // Check that we still have the settings for the updated vocabulary.
+ $configuration = ContentLanguageSettings::loadByEntityTypeBundle('taxonomy_term', 'country');
+ $this->assertEqual($configuration->getDefaultLangcode(), 'current_interface', 'The default language configuration has been kept on the updated Country vocabulary.');
+ $this->assertTrue($configuration->isLanguageAlterable(), 'The alterable language configuration has been kept on the updated Country vocabulary.');
+ $this->assertEqual($configuration->uuid(), $uuid, 'The language configuration uuid has been kept on the updated Country vocabulary.');
+ }
+
+}