<?php
/**
 * Class for testing messaging module.
 *
 * Tests basic API functions
 */

require_once 'i18n_strings.test';

class i18n_Blocks_Test extends Drupali18nTestCase {

  function getInfo() {
    return array(
      'name' => 'Block translation',
      'group' => 'Internationalization',
      'description' => 'Block translation functions'
    );
  }

  function setUp() {
    parent::setUp('118n', 'locale', 'i18nstrings', 'i18nblocks');
    $this->addLanguage('es');
    $this->addLanguage('de');
     // Create and login user
    $admin_user = $this->drupalCreateUser(array('administer blocks'));
    $this->drupalLogin($admin_user);
  }

  function testBlockTranslation() {
    // Create a translatable block
    $box = $this->i18nCreateBox(array('language' => I18N_BLOCK_LOCALIZE));
    $i18nblock = i18nblocks_load('block', $box->bid);
    $this->assertTrue($i18nblock->ibid && $i18nblock->language == I18N_BLOCK_LOCALIZE, "The block has been created with the right i18n settings.");
    // Create translations for title and body, source strings should be already there
    $translations = $this->i18nTranslateBlock('block', $box-bid, array('title', 'body'));
    // Now set a language for the block and confirm it shows just for that one (without translation)
    $languages = $this->getOtherLanguages();
    $setlanguage = array_shift($languages);
    $otherlanguage = array_shift($languages);
    $this->i18nUpdateBlock('block', $box->bid, array('language' => $setlanguage->language));
    // Do not show in default language
    $this->drupalGet('');
    $this->assertNoText($box->title);
    // Show in block's language but not translated
    $this->i18nGet($setlanguage);
    $this->assertText($box->title);
    // Do not show in the other language
    $this->i18nGet($otherlanguage);
    $this->assertNoText($box->title);
    $this->assertNoText($translations[$otherlanguage->language]['title']);
    
    // Add a custom title to any other block: Navigation (user, 1)
    $title = $this->randomName(10);
    $this->i18nUpdateBlock('user', 1, array('title' => $title));
    $this->assertText($title, "The new custom title is displayed on the home page.");
    $translate = $this->i18nTranslateBlock('user', 1, array('title'));
    $this->drupalGet('');
    
    // Refresh block strings, the ones for the first box should be gone. Not the others
    $box2 = $this->i18nCreateBox(array('language' => I18N_BLOCK_LOCALIZE));
    $translations = $this->i18nTranslateBlock('block', $box2->bid, array('title', 'body'));
    i18nstrings_refresh_group('blocks', TRUE);
    $this->assertFalse(i18nstrings_get_source("blocks:block:$box->bid:title", $box->title), "The string for the box title is gone.");
    $this->assertFalse(i18nstrings_get_source("blocks:block:$box->bid:body", $box->body), "The string for the box body is gone.");
    $this->assertTrue(i18nstrings_get_source("blocks:user:1:title"), "We have a string for the Navigation block title");
    $this->assertTrue(i18nstrings_get_source("blocks:block:$box2->bid:title", $box2->title), "The string for the second box title is still there.");
    $this->assertTrue(i18nstrings_get_source("blocks:block:$box2->bid:body", $box2->body), "The string for the second box body is still there.");
    // Test a block with filtering and input formats
    $box3 = $this->i18nCreateBox(array(
      'title' => '<div><script>alert(0)</script>Title</script>',
      'body' => "One line\nTwo lines<script>alert(1)</script>",
      'language' => I18N_BLOCK_LOCALIZE,
    ));
    $language = current($this->getOtherLanguages());
    // We add language name to the title just to make sure we get the right translation later
    $this->i18nstringsSaveTranslation("blocks:block:$box3->bid:title", $language->language, $box3->title . $language->name);
    $this->i18nstringsSaveTranslation("blocks:block:$box3->bid:body", $language->language, $box3->body);
    // This should be the actual HTML displayed
    $title = check_plain($box3->title);
    $body = check_markup($box3->body);
    $this->drupalGet('');
    $this->assertRaw($title, "Title being displayed for default language: " . $title);
    $this->assertRaw($body, "Body being displayed for default language: " . check_plain($body));
    $this->i18nGet($language);
    $this->assertRaw($title . $language->name, "Translated title displayed with right filtering.");
    $this->assertRaw($body, "Translated body displayed with right filtering.");
  }
 
  /**
   * Translate block fields to all languages
   */
  function i18nTranslateBlock($module, $delta, $fields = array('title', 'body')) {
    foreach ($this->getOtherLanguages() as $language) {
      foreach ($fields as $key) {
        $text[$key] = $this->i18nstringsCreateTranslation("blocks:$module:$delta:$key", $language->language);
      }
      // Now check translated strings display on page
      $this->i18nGet($language->language, '');
      foreach ($text as $string) {
        $this->assertText($string);
      }
      $translations[$language->language] = $text;
    } 
    return $translations;
  }
  /**
   * Test creating custom block (i.e. box), moving it to a specific region and then deleting it.
   */
  function i18nCreateBox($box = array(), $region = 'left', $check_display = TRUE) {
    // Add a new box by filling out the input form on the admin/build/block/add page.
    $box += array(
      'info' => $this->randomName(8),
      'title' => $this->randomName(8),
      'body' => $this->randomName(32),
    );
    $this->drupalPost('admin/build/block/add', $box, t('Save block'));
    // Confirm that the box has been created, and then query the created bid.
    $this->assertText(t('The block has been created.'), 'Box successfully created.');
    $bid = db_result(db_query("SELECT bid FROM {boxes} WHERE info = '%s'", array($box['info'])));
    // Check to see if the box was created by checking that it's in the database..
    $this->assertNotNull($bid, 'Box found in database');
    // Display the block on left region
    $this->i18nUpdateBlockRegion('block', $bid, $region);
    if ($check_display) {
      // Confirm that the box is being displayed.
      $this->assertText(check_plain($box['title']), 'Box successfully being displayed on the page.');
    }
    $box['bid'] = $block['delta'] = $bid;
    $box['module'] = 'block';
    return (object)$box;
  }
  /**
   * Update block
   */
  function i18nUpdateBlock($module, $delta, $update = array()) {
    $this->drupalPost("admin/build/block/configure/$module/$delta", $update, t('Save block'));
    $this->assertText(t('The block configuration has been saved.'));
  }
  /**
   * Update block region
   */
  function i18nUpdateBlockRegion($module, $delta, $region) {
    // Set the created box to a specific region.
    // TODO: Implement full region checking.
    $edit = array();
    $edit[$module . '_'. $delta .'[region]'] = $region;
    $this->drupalPost('admin/build/block', $edit, t('Save blocks'));
    // Confirm that the box was moved to the proper region.
    $this->assertText(t('The block settings have been updated.'), "Box successfully moved to $region region.");
  }
  /**
   * Delete block
   */
  function i18nDeleteBlock($bid) {
    // Delete the created box & verify that it's been deleted and no longer appearing on the page.
    $this->drupalPost('admin/build/block/delete/'. $bid, array(), t('Delete'));
    $this->assertRaw(t('The block %title has been removed.', array('%title' => $box['info'])), t('Box successfully deleted.'));
    $this->assertNoText(t($box['title']), t('Box no longer appears on page.'));
  }
}   