You are here

i18n_taxonomy.test in Internationalization 7

Test case for multilingual taxonomy

File

i18n_taxonomy/i18n_taxonomy.test
View source
<?php

/**
 * @file
 * Test case for multilingual taxonomy
 */
class i18nTaxonomyTestCase extends Drupali18nTestCase {
  public static function getInfo() {
    return array(
      'name' => 'Taxonomy translation',
      'group' => 'Internationalization',
      'description' => 'Taxonomy translation functions',
    );
  }
  function setUp() {
    parent::setUp(array(
      'i18n_taxonomy',
      'field_test',
    ));
    parent::setUpLanguages();

    // Create users.
    $filtered_html_format = filter_format_load('filtered_html');
    $full_html_format = filter_format_load('full_html');
    $this->admin_user = $this
      ->drupalCreateUser(array(
      'access field_test content',
      'administer field_test content',
      'administer taxonomy',
      'administer languages',
      'administer site configuration',
      filter_permission_name($filtered_html_format),
      filter_permission_name($full_html_format),
    ));
    $this->translator = $this
      ->drupalCreateUser(array(
      'translate interface',
      'translate user-defined strings',
    ));
  }
  function testTaxonomyTermLocalize() {
    $this
      ->drupalLogin($this->admin_user);

    // Make Input Format "Filter Text" translatable
    $edit = array(
      'i18n_string_allowed_formats[filtered_html]' => 'filtered_html',
      'i18n_string_allowed_formats[plain_text]' => 'plain_text',
    );
    $this
      ->drupalPost('admin/config/regional/i18n/strings', $edit, t('Save configuration'));

    // Create a localizable vocabulary.
    $vocab = $this
      ->createVocabulary(array(
      'i18n_mode' => I18N_MODE_LOCALIZE,
    ));
    $this
      ->assertEqual(i18n_taxonomy_vocabulary_mode($vocab->vid), I18N_MODE_LOCALIZE, 'A vocabulary has been created and it is localizable.');
    $this->field_name = $this
      ->createTermField($vocab->machine_name);

    // Create a term to be localized. We use a common prefix to facilitate the testing of autocomplete suggestions.
    $prefix = $this
      ->randomName() . '_';
    $term = $this
      ->createTerm(array(
      'vid' => $vocab->vid,
      'name' => $prefix . $this
        ->randomName(),
    ));
    $this
      ->drupalLogin($this->translator);

    // Create and Save Spanish translation, again using the same prefix.
    $term_translation = array(
      'name' => $this
        ->createStringTranslation('taxonomy', $term->name, array(
        $this->secondary_language => $prefix . $this
          ->randomName(),
      )),
      'description' => $this
        ->createStringTranslation('taxonomy', $term->description, array(
        $this->secondary_language => $prefix . $this
          ->randomName(),
      )),
    );
    $this
      ->drupalLogin($this->admin_user);
    $langcode = LANGUAGE_NONE;
    $edit = array(
      "{$this->field_name}[{$langcode}]" => array(
        $term->tid,
      ),
    );

    // Test the widgets in the original language.
    $this
      ->drupalGet('test-entity/add/test-bundle');
    $this
      ->assertText($term->name, 'Widget values are displayed correctly in default language.');
    $this
      ->drupalPost(NULL, $edit, t('Save'));
    $this
      ->assertText($term->name, 'Field values are displayed correctly in default language.');

    // Terms should be localized in the field widget.
    $this
      ->drupalGet($this->secondary_language . '/test-entity/add/test-bundle');
    $this
      ->assertText($term_translation['name'][$this->secondary_language], 'Widget values are displayed correctly in non-default languages.');
    $this
      ->drupalPost(NULL, $edit, t('Save'));
    $this
      ->assertText($term_translation['name'][$this->secondary_language], 'Field values are displayed correctly in non-default languages.');

    // Term name and term description should be localized
    $this
      ->drupalGet('taxonomy/term/' . $term->tid, array(
      'language' => i18n_language_object($this->default_language),
    ));
    $this
      ->assertText($term->name, 'Term title is displayed correctly in default language.');
    $this
      ->assertText($term->description, 'Term description is displayed correctly in default language.');

    // Term name and term description should be localized
    $this
      ->drupalGet('taxonomy/term/' . $term->tid, array(
      'language' => i18n_language_object($this->secondary_language),
    ));
    $this
      ->assertText($term_translation['name'][$this->secondary_language], 'Term title is displayed correctly in non-default language.');
    $this
      ->assertText($term_translation['description'][$this->secondary_language], 'Term description is displayed correctly in non-default language.');

    // Autocomplete should respect localization.
    $autocomplete_path = 'taxonomy/autocomplete/' . $this->field_name . '/' . $prefix;
    $autocomplete_values = $this
      ->drupalGetAJAX($autocomplete_path);
    $this
      ->assertTrue(isset($autocomplete_values[$term->name]), 'Correct autocomplete suggestions in default language.');
    $this
      ->assertFalse(isset($autocomplete_values[$term_translation['name'][$this->secondary_language]]), 'No incorrect autocomplete suggestions in non-default languages');

    // Autocomplete should respect localization, but doesn't.
    //   $autocomplete_path = $this->secondary_language . '/taxonomy/autocomplete/' . $this->field_name . '/' . $prefix;
    //   $autocomplete_values = $this->drupalGetAJAX($autocomplete_path);
    //   $this->assertFalse(isset($autocomplete_values[$term->name]), 'Correct autocomplete suggestions in non-default languages.');
    //   $this->assertTrue(isset($autocomplete_values[$term_translation[$this->secondary_language]]), 'No incorrect autocomplete suggestions in non-default languages.');
  }
  function testTaxonomyTermTranslate() {

    // Create a translateable vocabulary.
    $vocab = $this
      ->createVocabulary(array(
      'i18n_mode' => I18N_MODE_TRANSLATE,
    ));
    $this
      ->assertEqual(i18n_taxonomy_vocabulary_mode($vocab->vid), I18N_MODE_TRANSLATE, 'A vocabulary has been created and it is translateable.');
    $this->field_select = $this
      ->createTermField($vocab->machine_name);
    $this->field_autocomplete = $this
      ->createTermField($vocab->machine_name, 'taxonomy_autocomplete');

    // Create a term to be translated.
    $en_term = $this
      ->createTerm(array(
      'vid' => $vocab->vid,
      'language' => $this->default_language,
    ));
    $es_term = $this
      ->createTerm(array(
      'vid' => $vocab->vid,
      'language' => $this->secondary_language,
    ));
    $this
      ->drupalLogin($this->admin_user);

    // Set terms as translations of each other.
    $edit = array(
      'translations[' . $this->default_language . ']' => $en_term->name,
      'translations[' . $this->secondary_language . ']' => $es_term->name,
    );
    $this
      ->drupalPost('admin/structure/taxonomy/' . $vocab->machine_name . '/list/sets/add', $edit, t('Save'));
    $this
      ->drupalGet('admin/structure/taxonomy/' . $vocab->machine_name . '/list/sets');

    // Freetagging creates terms with the correct language.
    $new_term_name = $this
      ->randomName();
    $langcode = LANGUAGE_NONE;
    $edit = array(
      "{$this->field_autocomplete}[{$langcode}]" => $new_term_name,
    );
    $this
      ->drupalPost($this->secondary_language . '/test-entity/add/test-bundle', $edit, t('Save'));
    $new_term = current(taxonomy_get_term_by_name($new_term_name));
    $this
      ->assertEqual($new_term->language, $this->secondary_language, 'Freetagging creates terms with the correct language.');

    // Term translations are used for language switching.
    $language_switcher = language_negotiation_get_switch_links(LANGUAGE_TYPE_INTERFACE, 'taxonomy/term/' . $en_term->tid);
    $this
      ->assertEqual($language_switcher->links[$this->secondary_language]['href'], 'taxonomy/term/' . $es_term->tid, 'Term translations are used for language switching.');
  }

  /**
   * Tests the implementation of 'options_list_callback' for term reference fields.
   * Enable and disable the callback properly. Avoid WSOD!
   */
  function testTaxonomyFieldCallback() {
    $field_name = 'taxonomy_term_test_field';
    $field = field_create_field(array(
      'field_name' => $field_name,
      'type' => 'taxonomy_term_reference',
    ));
    $field = field_info_field($field_name);
    $callback = 'i18n_taxonomy_allowed_values';
    $this
      ->assertTrue(function_exists($callback), "Function {$callback} exists.");
    $this
      ->assertEqual($field['settings']['options_list_callback'], $callback, "{$callback} ist option list callback.");
    module_disable(array(
      'i18n_taxonomy',
    ));
    $field = field_info_field($field_name);
    $this
      ->assertNotEqual($field['settings']['options_list_callback'], $callback, "{$callback} ist option list callback.");
  }

  // Create vocabulary with given fields
  function drupalCreateVocabulary($vocab = array()) {
    $vocab += array(
      'name' => $this
        ->randomName(10),
      'description' => $this
        ->randomName(20),
    );
    taxonomy_vocabulary_save($vocab);
    return (object) $vocab;
  }

  // Create term with given fields
  function drupalCreateTerms($number = 1, $data = array()) {
    $list = array();
    for ($i = 1; $i <= $number; $i++) {
      $term = $this
        ->createTerm($data);
      $list[$term->tid] = $term;
    }
    return $list;
  }

  /**
   * Returns a new vocabulary with random properties.
   */
  function createVocabulary($data = array()) {

    // Create a vocabulary.
    $data += array(
      'i18n_mode' => I18N_MODE_LOCALIZE,
      'name' => $this
        ->randomName(),
      'description' => $this
        ->randomName(),
      'machine_name' => drupal_strtolower($this
        ->randomName()),
      'help' => '',
      'nodes' => array(
        'article' => 'article',
      ),
      'weight' => mt_rand(0, 10),
    );
    $vocabulary = (object) $data;
    taxonomy_vocabulary_save($vocabulary);
    return $vocabulary;
  }

  /**
   * Returns a new term with random properties in vocabulary $vid.
   */
  function createTerm($data = array()) {
    $data += array(
      'name' => $this
        ->randomName(),
      'description' => $this
        ->randomName(),
      // Use the first available text format and vocabulary.
      'format' => filter_default_format(),
      'vid' => 1,
    );
    $term = (object) $data;
    taxonomy_term_save($term);
    return $term;
  }

  /**
   * Setup a field and instance.
   */
  function createTermField($machine_name, $widget = 'options_select') {
    $field_name = drupal_strtolower($this
      ->randomName());
    $this->field = array(
      'field_name' => $field_name,
      'type' => 'taxonomy_term_reference',
      'settings' => array(
        'allowed_values' => array(
          array(
            'vocabulary' => $machine_name,
            'parent' => '0',
          ),
        ),
      ),
    );
    field_create_field($this->field);
    $this->instance = array(
      'field_name' => $field_name,
      'entity_type' => 'test_entity',
      'bundle' => 'test_bundle',
      'widget' => array(
        'type' => $widget,
      ),
      'display' => array(
        'full' => array(
          'type' => 'taxonomy_term_reference_link',
        ),
      ),
    );
    field_create_instance($this->instance);
    return $field_name;
  }

}

Classes

Namesort descending Description
i18nTaxonomyTestCase @file Test case for multilingual taxonomy