You are here

function TaxonomyTermTestCase::testTermAutocompletion in Drupal 7

Tests term autocompletion edge cases with slashes in the names.

File

modules/taxonomy/taxonomy.test, line 743
Tests for taxonomy.module.

Class

TaxonomyTermTestCase
Tests for taxonomy term functions.

Code

function testTermAutocompletion() {

  // Add a term with a slash in the name.
  $first_term = $this
    ->createTerm($this->vocabulary);
  $first_term->name = '10/16/2011';
  taxonomy_term_save($first_term);

  // Add another term that differs after the slash character.
  $second_term = $this
    ->createTerm($this->vocabulary);
  $second_term->name = '10/17/2011';
  taxonomy_term_save($second_term);

  // Add another term that has both a comma and a slash character.
  $third_term = $this
    ->createTerm($this->vocabulary);
  $third_term->name = 'term with, a comma and / a slash';
  taxonomy_term_save($third_term);

  // Try to autocomplete a term name that matches both terms.
  // We should get both term in a json encoded string.
  $input = '10/';
  $path = 'taxonomy/autocomplete/taxonomy_';
  $path .= $this->vocabulary->machine_name . '/' . $input;

  // The result order is not guaranteed, so check each term separately.
  $url = url($path, array(
    'absolute' => TRUE,
  ));
  $result = drupal_http_request($url);
  $data = drupal_json_decode($result->data);
  $this
    ->assertEqual($data[$first_term->name], check_plain($first_term->name), 'Autocomplete returned the first matching term.');
  $this
    ->assertEqual($data[$second_term->name], check_plain($second_term->name), 'Autocomplete returned the second matching term.');

  // Try to autocomplete a term name that matches first term.
  // We should only get the first term in a json encoded string.
  $input = '10/16';
  $url = 'taxonomy/autocomplete/taxonomy_';
  $url .= $this->vocabulary->machine_name . '/' . $input;
  $this
    ->drupalGet($url);
  $target = array(
    $first_term->name => check_plain($first_term->name),
  );
  $this
    ->assertRaw(drupal_json_encode($target), 'Autocomplete returns only the expected matching term.');

  // Try to autocomplete a term name with both a comma and a slash.
  $input = '"term with, comma and / a';
  $url = 'taxonomy/autocomplete/taxonomy_';
  $url .= $this->vocabulary->machine_name . '/' . $input;
  $this
    ->drupalGet($url);
  $n = $third_term->name;

  // Term names containing commas or quotes must be wrapped in quotes.
  if (strpos($third_term->name, ',') !== FALSE || strpos($third_term->name, '"') !== FALSE) {
    $n = '"' . str_replace('"', '""', $third_term->name) . '"';
  }
  $target = array(
    $n => check_plain($third_term->name),
  );
  $this
    ->assertRaw(drupal_json_encode($target), 'Autocomplete returns a term containing a comma and a slash.');
}