Index: modules/translation/translation.test
===================================================================
RCS file: /cvs/drupal/drupal/modules/translation/translation.test,v
retrieving revision 1.32
diff -u -p -r1.32 translation.test
--- modules/translation/translation.test	9 Oct 2010 17:38:41 -0000	1.32
+++ modules/translation/translation.test	26 Oct 2010 16:33:59 -0000
@@ -16,7 +16,7 @@ class TranslationTestCase extends Drupal
     parent::setUp('locale', 'translation', 'translation_test');
 
     // Setup users.
-    $this->admin_user = $this->drupalCreateUser(array('administer languages', 'administer content types', 'access administration pages'));
+    $this->admin_user = $this->drupalCreateUser(array('bypass node access', 'administer nodes', 'administer languages', 'administer content types', 'administer blocks', 'access administration pages'));
     $this->translator = $this->drupalCreateUser(array('create page content', 'edit own page content', 'translate content'));
 
     $this->drupalLogin($this->admin_user);
@@ -24,6 +24,11 @@ class TranslationTestCase extends Drupal
     // Add languages.
     $this->addLanguage('en');
     $this->addLanguage('es');
+    $this->addLanguage('it');
+
+    // Disable Italian to test the translation behavior with disabled languages.
+    $edit = array('enabled[it]' => FALSE);
+    $this->drupalPost('admin/config/regional/language', $edit, t('Save configuration'));
 
     // Set "Basic page" content type to use multilingual support with translation.
     $this->drupalGet('admin/structure/types/manage/page');
@@ -32,6 +37,17 @@ class TranslationTestCase extends Drupal
     $this->drupalPost('admin/structure/types/manage/page', $edit, t('Save content type'));
     $this->assertRaw(t('The content type %type has been updated.', array('%type' => 'Basic page')), t('Basic page content type has been updated.'));
 
+    // Enable the language switcher block.
+    $language_type = LANGUAGE_TYPE_INTERFACE;
+    $edit = array("blocks[locale_$language_type][region]" => 'sidebar_first');
+    $this->drupalPost('admin/structure/block', $edit, t('Save blocks'));
+
+    // Enable URL language detection and selection to make the langugae switcher
+    // block appear.
+    $edit = array('language[enabled][locale-url]' => TRUE);
+    $this->drupalPost('admin/config/regional/language/configure', $edit, t('Save settings'));
+    drupal_static_reset('locale_url_outbound_alter');
+
     $this->drupalLogin($this->translator);
   }
 
@@ -43,12 +59,12 @@ class TranslationTestCase extends Drupal
     // Create Basic page in English.
     $node_title = $this->randomName();
     $node_body =  $this->randomName();
-    $node = $this->createPage($node_title, $node_body, 'en');
+    $node = $this->drupalCreatePage($node_title, $node_body, 'en');
 
     // Submit translation in Spanish.
     $node_translation_title = $this->randomName();
     $node_translation_body = $this->randomName();
-    $node_translation = $this->createTranslation($node, $node_translation_title, $node_translation_body, 'es');
+    $node_translation = $this->drupalCreateTranslation($node, $node_translation_title, $node_translation_body, 'es');
 
     // Attempt to submit a duplicate translation by visiting the node/add page
     // with identical query string.
@@ -67,8 +83,10 @@ class TranslationTestCase extends Drupal
     $this->assertEqual($duplicate->tnid, 0, t('The node does not have a tnid.'));
 
     // Update original and mark translation as outdated.
+    $node_body = $this->randomName();
+    $node->body[$node->language][0]['value'] = $node_body;
     $edit = array();
-    $edit["body[$node->language][0][value]"] = $this->randomName();
+    $edit["body[$node->language][0][value]"] = $node_body;
     $edit['translation[retranslate]'] = TRUE;
     $this->drupalPost('node/' . $node->nid . '/edit', $edit, t('Save'));
     $this->assertRaw(t('Basic page %title has been updated.', array('%title' => $node_title)), t('Original node updated.'));
@@ -84,108 +102,134 @@ class TranslationTestCase extends Drupal
     $this->drupalPost('node/' . $node_translation->nid . '/edit', $edit, t('Save'));
     $this->assertRaw(t('Basic page %title has been updated.', array('%title' => $node_translation_title)), t('Translated node updated.'));
 
-    $this->drupalLogin($this->admin_user);
-
-    // Disable Spanish and confirm that links to the Spanish translations do
-    // not appear on the English node.
-    $edit = array();
-    $edit['enabled[es]'] = FALSE;
-    $this->drupalPost('admin/config/regional/language', $edit, t('Save configuration'));
-    $this->drupalGet('node/' . $node->nid);
-    $languages = language_list();
-    $this->assertNoText($languages['es']->native);
-
-    $this->drupalLogin($this->translator);
-
-    // Confirm that Spanish is still an option for translators when creating nodes.
+    // Confirm that disabled languages are an option for translators when
+    // creating nodes.
     $this->drupalGet('node/add/page');
-    $this->assertRaw('value="' . 'es' .'"', t('Spanish is available in language selection'));
+    $this->assertFieldByXPath('//select[@name="language"]//option', 'it', t('Italian (disabled) is available in language selection.'));
+    $translation_it = $this->drupalCreateTranslation($node, $this->randomName(), $this->randomName(), 'it');
+    $this->assertRaw($translation_it->body['it'][0]['value'], t('Content created in Italian (disabled).'));
   }
 
   /**
-   * Check that content translation links behave properly.
+   * Check that language switch links behave properly.
    */
-  function testContentTranslationLinks() {
-    // Create Basic page in English.
-    $node_title = $this->randomName();
-    $node_body = $this->randomName();
-    $node = $this->createPage($node_title, $node_body, 'en');
+  function testLanguageSwitchLinks() {
+    // Create a Basic page in English and its translations in Spanish and
+    // Italian.
+    $node = $this->drupalCreatePage($this->randomName(), $this->randomName(), 'en');
+    $translation_es = $this->drupalCreateTranslation($node, $this->randomName(), $this->randomName(), 'es');
+    $translation_it = $this->drupalCreateTranslation($node, $this->randomName(), $this->randomName(), 'it');
+
+    // Check that language switch links are correctly shown only for enabled
+    // languages.
+    $this->assertLanguageSwitchLinks($node, $translation_es);
+    $this->assertLanguageSwitchLinks($translation_es, $node);
+    $this->assertLanguageSwitchLinks($node, $translation_it, FALSE);
+
+    // Check that links to the displayed translation appear only in the language
+    // switcher block.
+    $this->assertLanguageSwitchLinks($node, $node, FALSE, 'node');
+    $this->assertLanguageSwitchLinks($node, $node, TRUE, 'block-locale');
 
-    // Submit translation in Spanish.
-    $node_translation_title = $this->randomName();
-    $node_translation_body = $this->randomName();
-    $node_translation = $this->createTranslation($node, $node_translation_title, $node_translation_body, 'es');
+    // Unpublish the Spanish translation to check that the related language
+    // switch link is not shown.
+    $this->drupalLogin($this->admin_user);
+    $edit = array('status' => FALSE);
+    $this->drupalPost("node/$translation_es->nid/edit", $edit, t('Save'));
+    $this->drupalLogin($this->translator);
+    $this->assertLanguageSwitchLinks($node, $translation_es, FALSE);
 
     // Check that content translation links are shown even when no language
     // negotiation is configured.
-    $languages = language_list();
-    $this->drupalGet("node/$node->nid");
-    $url = url("node/$node_translation->nid");
-    $this->assertContentByXPath('//a[@href=:url]', array(':url' => $url), $languages['es']->native, t('Spanish translation link found.'));
-
-    $this->drupalGet("node/$node_translation->nid");
-    $url = url("node/$node->nid");
-    $this->assertContentByXPath('//a[@href=:url]', array(':url' => $url), $languages['en']->native, t('English translation link found.'));
+    $this->drupalLogin($this->admin_user);
+    $edit = array('language[enabled][locale-url]' => FALSE);
+    $this->drupalPost('admin/config/regional/language/configure', $edit, t('Save settings'));
+    drupal_static_reset('locale_url_outbound_alter');
+    $edit = array('status' => TRUE);
+    $this->drupalPost("node/$translation_es->nid/edit", $edit, t('Save'));
+    $this->drupalLogin($this->translator);
+    $this->assertLanguageSwitchLinks($node, $translation_es, TRUE, 'node');
   }
 
   /**
-   * Install a the specified language if it has not been already. Otherwise make sure that
-   * the language is enabled.
-   *
-   * @param string $language_code The language code the check.
+   * Test that the language switcher block alterations work as intended.
    */
-  function addLanguage($language_code) {
-    // Check to make sure that language has not already been installed.
-    $this->drupalGet('admin/config/regional/language');
-
-    if (strpos($this->drupalGetContent(), 'enabled[' . $language_code . ']') === FALSE) {
-      // Doesn't have language installed so add it.
-      $edit = array();
-      $edit['langcode'] = $language_code;
-      $this->drupalPost('admin/config/regional/language/add', $edit, t('Add language'));
+  function testLanguageSwitcherBlockIntegration() {
+    // Enable Italian to have three items in the language switcher block.
+    $this->drupalLogin($this->admin_user);
+    $edit = array('enabled[it]' => TRUE);
+    $this->drupalPost('admin/config/regional/language', $edit, t('Save configuration'));
+    $this->drupalLogin($this->translator);
 
-      // Make sure we're not using a stale list.
-      drupal_static_reset('language_list');
-      $languages = language_list('language');
-      $this->assertTrue(array_key_exists($language_code, $languages), t('Language was installed successfully.'));
+    // Create a Basic page in English.
+    $type = 'block-locale';
+    $node = $this->drupalCreatePage($this->randomName(), $this->randomName(), 'en');
+    $this->assertLanguageSwitchLinks($node, $node, TRUE, $type);
+    $this->assertLanguageSwitchLinks($node, $this->emptyNode('es'), TRUE, $type);
+    $this->assertLanguageSwitchLinks($node, $this->emptyNode('it'), TRUE, $type);
+
+    // Create the Spanish translation.
+    $translation_es = $this->drupalCreateTranslation($node, $this->randomName(), $this->randomName(), 'es');
+    $this->assertLanguageSwitchLinks($node, $node, TRUE, $type);
+    $this->assertLanguageSwitchLinks($node, $translation_es, TRUE, $type);
+    $this->assertLanguageSwitchLinks($node, $this->emptyNode('it'), TRUE, $type);
+
+    // Create the Italian translation.
+    $translation_it = $this->drupalCreateTranslation($node, $this->randomName(), $this->randomName(), 'it');
+    $this->assertLanguageSwitchLinks($node, $node, TRUE, $type);
+    $this->assertLanguageSwitchLinks($node, $translation_es, TRUE, $type);
+    $this->assertLanguageSwitchLinks($node, $translation_it, TRUE, $type);
+  }
 
-      if (array_key_exists($language_code, $languages)) {
-        $this->assertRaw(t('The language %language has been created and can now be used. More information is available on the <a href="@locale-help">help screen</a>.', array('%language' => $languages[$language_code]->name, '@locale-help' => url('admin/help/locale'))), t('Language has been created.'));
-      }
-    }
-    elseif ($this->xpath('//input[@type="checkbox" and @name=:name and @checked="checked"]', array(':name' => 'enabled[' . $language_code . ']'))) {
-      // It's installed and enabled. No need to do anything.
-      $this->assertTrue(true, 'Language [' . $language_code . '] already installed and enabled.');
-    }
-    else {
-      // It's installed but not enabled. Enable it.
-      $this->assertTrue(true, 'Language [' . $language_code . '] already installed.');
-      $this->drupalPost(NULL, array('enabled[' . $language_code . ']' => TRUE), t('Save configuration'));
-      $this->assertRaw(t('Configuration saved.'), t('Language successfully enabled.'));
-    }
+  /**
+   * Return an empty node data structure.
+   */
+  function emptyNode($langcode) {
+    return (object) array('nid' => '', 'language' => $langcode);
   }
 
   /**
-   * Create a "Basic page" in the specified language.
+   * Check that the specified language switch links are found/not found.
    *
-   * @param string $title Title of basic page in specified language.
-   * @param string $body Body of basic page in specified language.
-   * @param string $language Language code.
+   * @param $node
+   *   The node to display.
+   * @param $translation
+   *   The translation whose link has to be checked.
+   * @param $find
+   *   TRUE if the link must be present in the node page.
+   * @param $types
+   *   The page areas to be checked.
+   *
+   * @return
+   *   TRUE if the language switch links are found/not found.
    */
-  function createPage($title, $body, $language) {
-    $edit = array();
-    $langcode = LANGUAGE_NONE;
-    $edit["title"] = $title;
-    $edit["body[$langcode][0][value]"] = $body;
-    $edit['language'] = $language;
-    $this->drupalPost('node/add/page', $edit, t('Save'));
-    $this->assertRaw(t('Basic page %title has been created.', array('%title' => $title)), t('Basic page created.'));
+  function assertLanguageSwitchLinks($node, $translation, $find = TRUE, $types = NULL) {
+    if (empty($types)) {
+      $types = array('node', 'block-locale');
+    }
+    elseif (is_string($types)) {
+      $types = array($types);
+    }
 
-    // Check to make sure the node was created.
-    $node = $this->drupalGetNodeByTitle($title);
-    $this->assertTrue($node, t('Node found in database.'));
+    $result = TRUE;
+    $languages = language_list();
+    $page_language = $languages[$node->language];
+    $translation_language = $languages[$translation->language];
+    $url = url("node/$translation->nid", array('language' => $translation_language));
+
+    $this->drupalGet("node/$node->nid", array('language' => $page_language));
+
+    foreach ($types as $type) {
+      $args = array('%translation_language' => $translation_language->native, '%page_language' => $page_language->native, '%type' => $type);
+      $message = $find ?
+        t('[%page_language] Language switch item found for %translation_language language in the %type page area.', $args) :
+        t('[%page_language] Language switch item not found for %translation_language language in the %type page area.', $args);
+      $xpath = !empty($translation->nid) ? '//div[contains(@class, :type)]//a[@href=:url]' : '//div[contains(@class, :type)]//span[@class="locale-untranslated"]';
+      $found = $this->findContentByXPath($xpath, array(':type' => $type, ':url' => $url), $translation_language->native);
+      $result = $this->assertTrue($found == $find, $message) && $result;
+    }
 
-    return $node;
+    return $result;
   }
 
   /**
@@ -199,15 +243,11 @@ class TranslationTestCase extends Drupal
    *   values.
    * @param $value
    *   The text content of the matched element to assert.
-   * @param $message
-   *   Message to display.
-   * @param $group
-   *   The group this message belongs to.
    *
    * @return
    *   TRUE on pass, FALSE on fail.
    */
-  function assertContentByXPath($xpath, array $arguments = array(), $value = NULL, $message = '', $group = 'Other') {
+  function findContentByXPath($xpath, array $arguments = array(), $value = NULL) {
     $elements = $this->xpath($xpath, $arguments);
 
     $found = TRUE;
@@ -221,18 +261,49 @@ class TranslationTestCase extends Drupal
       }
     }
 
-    return $this->assertTrue($elements && $found, $message, $group);
+    return $elements && $found;
+  }
+
+  /**
+   * Create a "Basic page" in the specified language.
+   *
+   * @param $title
+   *   Title of basic page in specified language.
+   * @param $body
+   *   Body of basic page in specified language.
+   * @param
+   *   $language Language code.
+   */
+  function drupalCreatePage($title, $body, $language) {
+    $edit = array();
+    $langcode = LANGUAGE_NONE;
+    $edit["title"] = $title;
+    $edit["body[$langcode][0][value]"] = $body;
+    $edit['language'] = $language;
+    $this->drupalPost('node/add/page', $edit, t('Save'));
+    $this->assertRaw(t('Basic page %title has been created.', array('%title' => $title)), t('Basic page created.'));
+
+    // Check to make sure the node was created.
+    $node = $this->drupalGetNodeByTitle($title);
+    $this->assertTrue($node, t('Node found in database.'));
+
+    return $node;
   }
 
   /**
-   * Create a translation for the specified basic page in the specified language.
+   * Create a translation for the specified basic page in the specified
+   * language.
    *
-   * @param object $node The basic page to create translation for.
-   * @param string $title Title of basic page in specified language.
-   * @param string $body Body of basic page in specified language.
-   * @param string $language Language code.
+   * @param $node
+   *   The basic page to create translation for.
+   * @param $title
+   *   Title of basic page in specified language.
+   * @param $body
+   *   Body of basic page in specified language.
+   * @param $language
+   *   Language code.
    */
-  function createTranslation($node, $title, $body, $language) {
+  function drupalCreateTranslation($node, $title, $body, $language) {
     $this->drupalGet('node/add/page', array('query' => array('translation' => $node->nid, 'target' => $language)));
 
     $body_key = "body[$language][0][value]";
@@ -252,4 +323,41 @@ class TranslationTestCase extends Drupal
 
     return $translation;
   }
+
+  /**
+   * Install a language or ensure it is enabled.
+   *
+   * @param $language_code
+   *   The language code the check.
+   */
+  function addLanguage($language_code) {
+    // Check to make sure that language has not already been installed.
+    $this->drupalGet('admin/config/regional/language');
+
+    if (strpos($this->drupalGetContent(), 'enabled[' . $language_code . ']') === FALSE) {
+      // Doesn't have language installed so add it.
+      $edit = array();
+      $edit['langcode'] = $language_code;
+      $this->drupalPost('admin/config/regional/language/add', $edit, t('Add language'));
+
+      // Make sure we're not using a stale list.
+      drupal_static_reset('language_list');
+      $languages = language_list('language');
+      $this->assertTrue(array_key_exists($language_code, $languages), t('Language was installed successfully.'));
+
+      if (array_key_exists($language_code, $languages)) {
+        $this->assertRaw(t('The language %language has been created and can now be used. More information is available on the <a href="@locale-help">help screen</a>.', array('%language' => $languages[$language_code]->name, '@locale-help' => url('admin/help/locale'))), t('Language has been created.'));
+      }
+    }
+    elseif ($this->xpath('//input[@type="checkbox" and @name=:name and @checked="checked"]', array(':name' => 'enabled[' . $language_code . ']'))) {
+      // It's installed and enabled. No need to do anything.
+      $this->assertTrue(true, 'Language [' . $language_code . '] already installed and enabled.');
+    }
+    else {
+      // It's installed but not enabled. Enable it.
+      $this->assertTrue(true, 'Language [' . $language_code . '] already installed.');
+      $this->drupalPost(NULL, array('enabled[' . $language_code . ']' => TRUE), t('Save configuration'));
+      $this->assertRaw(t('Configuration saved.'), t('Language successfully enabled.'));
+    }
+  }
 }
