summaryrefslogtreecommitdiff
path: root/sites/all/modules/l10n_update/tests/L10nUpdateTestBase.test
diff options
context:
space:
mode:
Diffstat (limited to 'sites/all/modules/l10n_update/tests/L10nUpdateTestBase.test')
-rw-r--r--sites/all/modules/l10n_update/tests/L10nUpdateTestBase.test284
1 files changed, 284 insertions, 0 deletions
diff --git a/sites/all/modules/l10n_update/tests/L10nUpdateTestBase.test b/sites/all/modules/l10n_update/tests/L10nUpdateTestBase.test
new file mode 100644
index 000000000..2738701e0
--- /dev/null
+++ b/sites/all/modules/l10n_update/tests/L10nUpdateTestBase.test
@@ -0,0 +1,284 @@
+<?php
+
+/**
+ * @file
+ * Contains L10nUpdateTest.
+ */
+
+/**
+ * Tests for update translations.
+ */
+class L10nUpdateTestBase extends DrupalWebTestCase {
+
+ /**
+ * Timestamp for an old translation.
+ *
+ * @var integer
+ */
+ protected $timestamp_old;
+
+ /**
+ * Timestamp for a medium aged translation.
+ *
+ * @var integer
+ */
+ protected $timestamp_medium;
+
+ /**
+ * Timestamp for a new translation.
+ *
+ * @var integer
+ */
+ protected $timestamp_new;
+
+ function setUp() {
+ parent::setUp('update', 'locale', 'l10n_update', 'l10n_update_test');
+
+ // Setup timestamps to identify old and new translation sources.
+ $this->timestamp_old = REQUEST_TIME - 300;
+ $this->timestamp_medium = REQUEST_TIME - 200;
+ $this->timestamp_new = REQUEST_TIME - 100;
+ $this->timestamp_now = REQUEST_TIME;
+ }
+
+ /**
+ * Sets the value of the default translations directory.
+ *
+ * @param string $path
+ * Path of the translations directory relative to the drupal installation
+ * directory.
+ */
+ protected function setTranslationsDirectory($path) {
+ file_prepare_directory($path, FILE_CREATE_DIRECTORY);
+ variable_set('l10n_update_download_store', $path);
+ }
+
+ /**
+ * Adds a language.
+ *
+ * @param $langcode
+ * The language code of the language to add.
+ */
+ protected function addLanguage($langcode) {
+ $edit = array('langcode' => $langcode);
+ $this->drupalPost('admin/config/regional/language/add', $edit, t('Add language'));
+ drupal_static_reset('language_list');
+ $languages = language_list();
+ $this->assertTrue(isset($languages[$langcode]), format_string('Language %langcode added.', array('%langcode' => $langcode)));
+ }
+
+ /**
+ * Creates a translation file and tests its timestamp.
+ *
+ * @param string $path
+ * Path of the file relative to the public file path.
+ * @param string $filename
+ * Name of the file to create.
+ * @param integer $timestamp
+ * Timestamp to set the file to. Defaults to current time.
+ * @param array $translations
+ * Array of source/target value translation strings. Only singular strings
+ * are supported, no plurals. No double quotes are allowed in source and
+ * translations strings.
+ */
+ protected function makePoFile($path, $filename, $timestamp = NULL, $translations = array()) {
+ $timestamp = $timestamp ? $timestamp : REQUEST_TIME;
+ $path = 'public://' . $path;
+ $text = '';
+ $po_header = <<<EOF
+msgid ""
+msgstr ""
+"Project-Id-Version: Drupal 7\\n"
+"MIME-Version: 1.0\\n"
+"Content-Type: text/plain; charset=UTF-8\\n"
+"Content-Transfer-Encoding: 8bit\\n"
+"Plural-Forms: nplurals=2; plural=(n > 1);\\n"
+
+EOF;
+
+ // Convert array of translations to Gettext source and translation strings.
+ if ($translations) {
+ foreach ($translations as $source => $target) {
+ $text .= 'msgid "'. $source . '"' . "\n";
+ $text .= 'msgstr "'. $target . '"' . "\n";
+ }
+ }
+
+ file_prepare_directory($path, FILE_CREATE_DIRECTORY);
+ $file = (object) array(
+ 'uid' => 1,
+ 'filename' => $filename,
+ 'uri' => $path . '/' . $filename,
+ 'filemime' => 'text/x-gettext-translation',
+ 'timestamp' => $timestamp,
+ 'status' => FILE_STATUS_PERMANENT,
+ );
+ file_put_contents($file->uri, $po_header . $text);
+ touch(drupal_realpath($file->uri), $timestamp);
+ file_save($file);
+ }
+
+ /**
+ * Setup the environment containing local and remote translation files.
+ *
+ * Update tests require a simulated environment for local and remote files.
+ * Normally remote files are located at a remote server (e.g. ftp.drupal.org).
+ * For testing we can not rely on this. A directory in the file system of the
+ * test site is designated for remote files and is addressed using an absolute
+ * URL. Because Drupal does not allow files with a po extension to be accessed
+ * (denied in .htaccess) the translation files get a _po extension. Another
+ * directory is designated for local translation files.
+ *
+ * The environment is set up with the following files. File creation times are
+ * set to create different variations in test conditions.
+ * contrib_module_one
+ * - remote file: timestamp new
+ * - local file: timestamp old
+ * - current: timestamp medium
+ * contrib_module_two
+ * - remote file: timestamp old
+ * - local file: timestamp new
+ * - current: timestamp medium
+ * contrib_module_three
+ * - remote file: timestamp old
+ * - local file: timestamp old
+ * - current: timestamp medium
+ * custom_module_one
+ * - local file: timestamp new
+ * - current: timestamp medium
+ * Time stamp of current translation set by setCurrentTranslations() is always
+ * timestamp medium. This makes it easy to predict which translation will be
+ * imported.
+ */
+ protected function setTranslationFiles() {
+ // A flag is set to let the l10n_update_test module replace the project data with
+ // a set of test projects which match the below project files.
+ variable_set('l10n_update_test_projects_alter', TRUE);
+
+ // Setup the environment.
+ $public_path = drupal_realpath('public://');
+ $this->setTranslationsDirectory($public_path . '/local');
+ variable_set('l10n_update_default_filename', '%project-%release.%language._po');
+
+ // Setting up sets of translations for the translation files.
+ $translations_one = array('January' => 'Januar_1', 'February' => 'Februar_1', 'March' => 'Marz_1');
+ $translations_two = array( 'February' => 'Februar_2', 'March' => 'Marz_2', 'April' => 'April_2');
+ $translations_three = array('April' => 'April_3', 'May' => 'Mai_3', 'June' => 'Juni_3');
+
+ // Add a number of files to the local file system to serve as remote
+ // translation server and match the project definitions set in
+ // l10n_update_test_l10n_update_projects_alter().
+ $this->makePoFile('remote/7.x/contrib_module_one', 'contrib_module_one-7.x-1.1.de._po', $this->timestamp_new, $translations_one);
+ $this->makePoFile('remote/7.x/contrib_module_two', 'contrib_module_two-7.x-2.0-beta4.de._po', $this->timestamp_old, $translations_two);
+ $this->makePoFile('remote/7.x/contrib_module_three', 'contrib_module_three-7.x-1.0.de._po', $this->timestamp_old, $translations_three);
+
+ // Add a number of files to the local file system to serve as local
+ // translation files and match the project definitions set in
+ // l10n_update_test_l10n_update_projects_alter().
+ $this->makePoFile('local', 'contrib_module_one-7.x-1.1.de._po', $this->timestamp_old, $translations_one);
+ $this->makePoFile('local', 'contrib_module_two-7.x-2.0-beta4.de._po', $this->timestamp_new, $translations_two);
+ $this->makePoFile('local', 'contrib_module_three-7.x-1.0.de._po', $this->timestamp_old, $translations_three);
+ $this->makePoFile('local', 'custom_module_one.de.po', $this->timestamp_new);
+ }
+
+ /**
+ * Setup existing translations in the database and set up the status of
+ * existing translations.
+ */
+ protected function setCurrentTranslations() {
+ // Setup to add German translations to the database.
+ $langcode = 'de';
+ $writer = new PoDatabaseWriter();
+ $writer->setLangcode($langcode);
+ $writer->setOptions(array(
+ 'overwrite_options' => array(
+ 'not_customized' => TRUE,
+ 'customized' => TRUE,
+ ),
+ ));
+
+ // Add non customized translations to the database.
+ $writer->setOptions(array('customized' => L10N_UPDATE_NOT_CUSTOMIZED));
+ $non_customized_translations = array(
+ 'March' => 'Marz',
+ 'June' => 'Juni',
+ );
+
+ foreach ($non_customized_translations as $source => $translation) {
+ $poItem = new PoItem();
+ $poItem->setFromArray(array(
+ 'source' => $source,
+ 'translation' => $translation,
+ ));
+ $writer->writeItem($poItem);
+ }
+
+ // Add customized translations to the database.
+ $writer->setOptions(array('customized' => L10N_UPDATE_CUSTOMIZED));
+ $customized_translations = array(
+ 'January' => 'Januar_customized',
+ 'February' => 'Februar_customized',
+ 'May' => 'Mai_customized',
+ );
+
+ foreach ($customized_translations as $source => $translation) {
+ $poItem = new PoItem();
+ $poItem->setFromArray(array(
+ 'source' => $source,
+ 'translation' => $translation,
+ ));
+ $writer->writeItem($poItem);
+ }
+
+ // Add a state of current translations in l10n_update_files.
+ $default = array(
+ 'language' => $langcode,
+ 'uri' => '',
+ 'timestamp' => $this->timestamp_medium,
+ 'last_checked' => $this->timestamp_medium,
+ );
+ $data[] = array(
+ 'project' => 'contrib_module_one',
+ 'filename' => 'contrib_module_one-7.x-1.1.de._po',
+ 'version' => '7.x-1.1',
+ );
+ $data[] = array(
+ 'project' => 'contrib_module_two',
+ 'filename' => 'contrib_module_two-7.x-2.0-beta4.de._po',
+ 'version' => '7.x-2.0-beta4',
+ );
+ $data[] = array(
+ 'project' => 'contrib_module_three',
+ 'filename' => 'contrib_module_three-7.x-1.0.de._po',
+ 'version' => '7.x-1.0',
+ );
+ $data[] = array(
+ 'project' => 'custom_module_one',
+ 'filename' => 'custom_module_one.de.po',
+ 'version' => '',
+ );
+ foreach ($data as $file) {
+ $file = (object) array_merge($default, $file);
+ drupal_write_record('l10n_update_file', $file);
+ }
+ }
+
+ /**
+ * Checks the translation of a string.
+ *
+ * @param string $source
+ * Translation source string
+ * @param string $translation
+ * Translation to check. Use empty string to check for a not existing
+ * translation.
+ * @param string $langcode
+ * Language code of the language to translate to.
+ * @param string $message
+ * (optional) A message to display with the assertion.
+ */
+ protected function assertTranslation($source, $translation, $langcode, $message = '') {
+ $db_translation = db_query('SELECT translation FROM {locales_target} lt INNER JOIN {locales_source} ls ON ls.lid = lt.lid WHERE ls.source = :source AND lt.language = :langcode', array(':source' => $source, ':langcode' => $langcode))->fetchField();
+ $db_translation = $db_translation == FALSE ? '' : $db_translation;
+ $this->assertEqual($translation, $db_translation, $message ? $message : format_string('Correct translation of %source (%language)', array('%source' => $source, '%language' => $langcode)));
+ }
+}