1 language.test LanguageListTest::testLanguageList()

Functional tests for adding, configuring, and deleting languages.

File

core/modules/language/tests/language.test, line 21
Tests for language.module.

Class

LanguageListTest
Functional tests for the language list configuration forms.

Code

function testLanguageList() {
  global $base_url;

  // User to add and remove language.
  $admin_user = $this->backdropCreateUser(array('administer languages', 'access administration pages'));
  $this->backdropLogin($admin_user);

  // Add predefined language.
  $edit = array(
    'predefined_langcode' => 'fr',
  );
  $this->backdropPost('admin/config/regional/language/add', $edit, t('Add language'));
  $this->assertText('French', t('Language added successfully.'));
  $this->assertEqual($this->getUrl(), url('admin/config/regional/language', array('absolute' => TRUE)), t('Correct page redirection.'));

  // Add custom language.
  $langcode = 'xx';
  $name = $this->randomName(16);
  $edit = array(
    'predefined_langcode' => 'custom',
    'langcode' => $langcode,
    'name' => $name,
    'native' => $name,
    'direction' => '0',
  );
  $this->backdropPost('admin/config/regional/language/add', $edit, t('Add custom language'));
  $this->assertEqual($this->getUrl(), url('admin/config/regional/language', array('absolute' => TRUE)), t('Correct page redirection.'));
  $this->assertRaw('"edit-site-default-' . $langcode . '"', t('Language code found.'));
  $this->assertText(t($name), t('Test language added.'));

  // Check if we can change the default language.
  $path = 'admin/config/regional/language';
  $this->backdropGet($path);
  $this->assertFieldChecked('edit-site-default-en', t('English is the default language.'));
  // Change the default language.
  $edit = array(
    'site_default' => $langcode,
  );
  $this->backdropPost(NULL, $edit, t('Save configuration'));
  $this->assertNoFieldChecked('edit-site-default-en', t('Default language updated.'));
  $this->assertEqual($this->getUrl(), url('admin/config/regional/language', array('absolute' => TRUE)), t('Correct page redirection.'));

  // Ensure we can't delete the default language.
  $this->backdropGet('admin/config/regional/language/delete/' . $langcode);
  $this->assertEqual($this->getUrl(), url('admin/config/regional/language', array('absolute' => TRUE)), t('Correct page redirection.'));
  $this->assertText(t('The default language cannot be deleted.'), t('Failed to delete the default language.'));

  // Check if we can disable a language.
  $edit = array(
    'languages[en][enabled]' => FALSE,
  );
  $this->backdropPost($path, $edit, t('Save configuration'));
  $this->assertNoFieldChecked('edit-languages-en-enabled', t('Language disabled.'));

  // Set disabled language to be the default and ensure it is re-enabled.
  $edit = array(
    'site_default' => 'en',
  );
  $this->backdropPost(NULL, $edit, t('Save configuration'));
  $this->assertFieldChecked('edit-languages-en-enabled', t('Default language re-enabled.'));

  // Ensure 'edit' link works.
  $this->clickLink(t('Configure'));
  $this->assertTitle(t('Configure language | Backdrop CMS'), t('Page title is "Configure language".'));
  // Configure a language.
  $name = $this->randomName(16);
  $edit = array(
    'name' => $name,
    'native' => $name,
  );
  $this->backdropPost('admin/config/regional/language/edit/' . $langcode, $edit, t('Save language'));
  $this->assertRaw($name, t('The language has been updated.'));
  $this->assertEqual($this->getUrl(), url('admin/config/regional/language', array('absolute' => TRUE)), t('Correct page redirection.'));

  // Ensure 'delete' link works.
  $this->backdropGet('admin/config/regional/language');
  $this->clickLink(t('Delete'));
  $this->assertText(t('Are you sure you want to delete the language'), t('"delete" link is correct.'));
  // Delete an enabled language.
  $this->backdropGet('admin/config/regional/language/delete/' . $langcode);
  // First test the 'cancel' link.
  $this->clickLink(t('Cancel'));
  $this->assertEqual($this->getUrl(), url('admin/config/regional/language', array('absolute' => TRUE)), t('Correct page redirection.'));
  $this->assertRaw($name, t('The language was not deleted.'));
  // Delete the language for real. This a confirm form, we do not need any
  // fields changed.
  $this->backdropPost('admin/config/regional/language/delete/' . $langcode, array(), t('Delete'));
  // We need raw here because %language and %langcode will add HTML.
  $t_args = array('%language' => $name, '%langcode' => $langcode);
  $this->assertRaw(t('The %language (%langcode) language has been removed.', $t_args), t('The test language has been removed.'));
  $this->assertEqual($this->getUrl(), url('admin/config/regional/language', array('absolute' => TRUE)), t('Correct page redirection.'));
  // Verify that language is no longer found.
  $this->backdropGet('admin/config/regional/language/delete/' . $langcode);
  $this->assertResponse(404, t('Language no longer found.'));
  // Make sure the "language_count" variable has been updated correctly.
  backdrop_static_reset('language_list');
  $enabled_languages = language_list(TRUE);
  $this->assertEqual(config_get('system.core', 'language_count'), count($enabled_languages), t('Language count is correct.'));
  // Delete a disabled language.
  // Disable an enabled language.
  $edit = array(
    'languages[fr][enabled]' => FALSE,
  );
  $this->backdropPost($path, $edit, t('Save configuration'));
  $this->assertNoFieldChecked('edit-languages-fr-enabled', t('French language disabled.'));
  // Get the count of enabled languages.
  backdrop_static_reset('language_list');
  $enabled_languages = language_list(TRUE);
  // Delete the disabled language.
  $this->backdropPost('admin/config/regional/language/delete/fr', array(), t('Delete'));
  // We need raw here because %language and %langcode will add HTML.
  $t_args = array('%language' => 'French', '%langcode' => 'fr');
  $this->assertRaw(t('The %language (%langcode) language has been removed.', $t_args), t('Disabled language has been removed.'));
  $this->assertEqual($this->getUrl(), url('admin/config/regional/language', array('absolute' => TRUE)), t('Correct page redirection.'));
  // Verify that language is no longer found.
  $this->backdropGet('admin/config/regional/language/delete/fr');
  $this->assertResponse(404, t('Language no longer found.'));
  // Make sure the "language_count" variable has not changed.
  $this->assertEqual(config_get('system.core', 'language_count'), count($enabled_languages), t('Language count is correct.'));

  // Ensure we can delete the English language. Right now English is the only
  // language so we must add a new language and make it the default before
  // deleting English.
  $langcode = 'xx';
  $name = $this->randomName(16);
  $edit = array(
    'predefined_langcode' => 'custom',
    'langcode' => $langcode,
    'name' => $name,
    'native' => $name,
    'direction' => '0',
  );
  $this->backdropPost('admin/config/regional/language/add', $edit, t('Add custom language'));
  $this->assertEqual($this->getUrl(), url('admin/config/regional/language', array('absolute' => TRUE)), t('Correct page redirection.'));
  $this->assertText($name, t('Name found.'));

  // Check if we can change the default language.
  $path = 'admin/config/regional/language';
  $this->backdropGet($path);
  $this->assertFieldChecked('edit-site-default-en', t('English is the default language.'));
  // Change the default language.
  $edit = array(
    'site_default' => $langcode,
  );
  $this->backdropPost(NULL, $edit, t('Save configuration'));
  $this->assertNoFieldChecked('edit-site-default-en', t('Default language updated.'));
  $this->assertEqual($this->getUrl(), url('admin/config/regional/language', array('absolute' => TRUE)), t('Correct page redirection.'));

  $this->backdropPost('admin/config/regional/language/delete/en', array(), t('Delete'));
  // We need raw here because %language and %langcode will add HTML.
  $t_args = array('%language' => 'English', '%langcode' => 'en');
  $this->assertRaw(t('The %language (%langcode) language has been removed.', $t_args), t('The English language has been removed.'));
}