You are here

public function UniqueFieldAjaxLanguageTest::testUniqueFieldPerLang in Unique field ajax 2.x

Tests unique field per language.

Throws

\Drupal\Core\Entity\EntityStorageException

\Behat\Mink\Exception\ResponseTextException

File

tests/src/Functional/UniqueFieldAjaxLanguageTest.php, line 20

Class

UniqueFieldAjaxLanguageTest
Test the field permissions report page.

Namespace

Drupal\Tests\unique_field_ajax\Functional

Code

public function testUniqueFieldPerLang() {

  // Enable all the languages.
  foreach ($this->translationOptions as $lang_id => $name) {
    ConfigurableLanguage::createFromLangcode($lang_id)
      ->save();
  }

  // Grab the translation options and shuffle, for fun.
  $translation_options = $this->translationOptions;
  $this
    ->shuffleAssoc($translation_options);

  // Enable language settings.
  $edit = [
    'language_configuration[language_alterable]' => TRUE,
  ];
  $this
    ->drupalPostForm('admin/structure/types/manage/' . $this->contentTypeName, $edit, t('Save content type'));

  // Per-language not enabled, field has to be unique across languages.
  foreach ($this->fieldTypes as $field_type) {
    $this
      ->createField($field_type['type'], $field_type['widget'], $field_type['settings']);
    $field_name = $this->fieldStorage
      ->getName();
    $this
      ->updateThirdPartyFieldSetting('unique', TRUE);
    $this
      ->updateThirdPartyFieldSetting('per_lang', FALSE);
    $current_lang = 0;
    $edit = NULL;
    foreach ($translation_options as $lang_id => $name) {
      if (!$edit) {
        $edit = $this
          ->createUpdateFieldData($field_name, $field_type['value'], $field_type['effect'], $lang_id);
      }
      $edit['langcode[0][value]'] = $lang_id;

      // First language should save, the rest will fail.
      if ($current_lang === 0) {
        $this
          ->itCanSaveField($edit);
      }
      else {
        $this
          ->itCannotSaveField($edit);
      }
      ++$current_lang;
    }
  }

  // Per-language enabled, field only has to be unique across same language.
  foreach ($this->fieldTypes as $field_type) {
    $this
      ->createField($field_type['type'], $field_type['widget'], $field_type['settings']);
    $field_name = $this->fieldStorage
      ->getName();
    $this
      ->updateThirdPartyFieldSetting('unique', TRUE);
    $this
      ->updateThirdPartyFieldSetting('per_lang', TRUE);
    $current_lang = 0;
    $edit = NULL;

    // Confirms across languages can contain the same information.
    foreach ($translation_options as $lang_id => $name) {
      if (!$edit) {
        $edit = $this
          ->createUpdateFieldData($field_name, $field_type['value'], $field_type['effect'], $lang_id);
      }
      $edit['langcode[0][value]'] = $lang_id;

      // Confirm we can save one but not another.
      // Then on second loop if "pre_lang" enabled, it can still be saved.
      $this
        ->itCanSaveField($edit);
      $this
        ->itCannotSaveField($edit);
      ++$current_lang;
    }
  }
}