You are here

tmgmt.crud.test in Translation Management Tool 7

File

tests/tmgmt.crud.test
View source
<?php

/*
 * @file
 * Contains tests for Translation management
 */

/**
 * Basic CRUD tests.
 */
class TMGMTCRUDTestCase extends TMGMTBaseTestCase {
  static function getInfo() {
    return array(
      'name' => 'CRUD tests',
      'description' => 'Basic crud operations for jobs and translators',
      'group' => 'Translation Management',
    );
  }

  /**
   * Test crud operations of translators.
   */
  function testTranslators() {
    $translator = $this
      ->createTranslator();
    $loaded_translator = tmgmt_translator_load($translator->tid);
    $this
      ->assertEqual($translator->name, $loaded_translator->name);
    $this
      ->assertEqual($translator->label, $loaded_translator->label);
    $this
      ->assertEqual($translator->settings, $loaded_translator->settings);

    // Update the settings.
    $translator->settings['new_key'] = $this
      ->randomString();
    $this
      ->assertEqual(SAVED_UPDATED, $translator
      ->save());
    $loaded_translator = tmgmt_translator_load($translator->tid);
    $this
      ->assertEqual($translator->name, $loaded_translator->name);
    $this
      ->assertEqual($translator->label, $loaded_translator->label);
    $this
      ->assertEqual($translator->settings, $loaded_translator->settings);

    // Delete the translator, make sure the translator is gone.
    $translator
      ->delete();
    $this
      ->assertFalse(tmgmt_translator_load($translator->tid));
  }

  /**
   * Test crud operations of jobs.
   */
  function testJobs() {
    $job = $this
      ->createJob();
    $loaded_job = tmgmt_job_load($job->tjid);
    $this
      ->assertEqual($job->source_language, $loaded_job->source_language);
    $this
      ->assertEqual($job->target_language, $loaded_job->target_language);

    // Assert that the created and changed information has been set to the
    // default value.
    $this
      ->assertTrue($loaded_job->created > 0);
    $this
      ->assertTrue($loaded_job->changed > 0);
    $this
      ->assertEqual(0, $loaded_job->state);

    // Update the settings.
    $job->reference = 7;
    $this
      ->assertEqual(SAVED_UPDATED, $job
      ->save());
    $loaded_job = tmgmt_job_load($job->tjid);
    $this
      ->assertEqual($job->reference, $loaded_job->reference);

    // Test the job items.
    $item1 = $job
      ->addItem('test_source', 'type', 5);
    $item2 = $job
      ->addItem('test_source', 'type', 4);

    // Load and compare the items.
    $items = $job
      ->getItems();
    $this
      ->assertEqual(2, count($items));
    $this
      ->assertEqual($item1->plugin, $items[$item1->tjiid]->plugin);
    $this
      ->assertEqual($item1->item_type, $items[$item1->tjiid]->item_type);
    $this
      ->assertEqual($item1->item_id, $items[$item1->tjiid]->item_id);
    $this
      ->assertEqual($item2->plugin, $items[$item2->tjiid]->plugin);
    $this
      ->assertEqual($item2->item_type, $items[$item2->tjiid]->item_type);
    $this
      ->assertEqual($item2->item_id, $items[$item2->tjiid]->item_id);

    // Delete the job and make sure it is gone.
    $job
      ->delete();
    $this
      ->assertFalse(tmgmt_job_load($job->tjid));
  }
  function testRemoteMappings() {
    $data_key = '5][test_source][type';
    $translator = $this
      ->createTranslator();
    $job = $this
      ->createJob();
    $job->translator = $translator->name;
    $job
      ->save();
    $item1 = $job
      ->addItem('test_source', 'type', 5);
    $item2 = $job
      ->addItem('test_source', 'type', 4);
    $mapping_data = array(
      'remote_identifier_2' => 'id12',
      'remote_identifier_3' => 'id13',
      'amount' => 1043,
      'currency' => 'EUR',
    );
    $result = $item1
      ->addRemoteMapping($data_key, 'id11', $mapping_data);
    $this
      ->assertEqual($result, SAVED_NEW);
    $job_mappings = $job
      ->getRemoteMappings();
    $item_mappings = $item1
      ->getRemoteMappings();
    $job_mapping = array_shift($job_mappings);
    $item_mapping = array_shift($item_mappings);
    $_job = $job_mapping
      ->getJob();
    $this
      ->assertEqual($job->tjid, $_job->tjid);
    $_job = $item_mapping
      ->getJob();
    $this
      ->assertEqual($job->tjid, $_job->tjid);
    $_item1 = $item_mapping
      ->getJobItem();
    $this
      ->assertEqual($item1->tjiid, $_item1->tjiid);

    /**
     * @var TMGMTRemoteController $remote_mapping_controller
     */
    $remote_mapping_controller = entity_get_controller('tmgmt_remote');
    $remote_mappings = $remote_mapping_controller
      ->loadByRemoteIdentifier('id11', 'id12', 'id13');
    $remote_mapping = array_shift($remote_mappings);
    $this
      ->assertEqual($remote_mapping->tjiid, $item1->tjiid);
    $this
      ->assertEqual($remote_mapping->amount, $mapping_data['amount']);
    $this
      ->assertEqual($remote_mapping->currency, $mapping_data['currency']);
    $this
      ->assertEqual(count($remote_mapping_controller
      ->loadByRemoteIdentifier('id11')), 1);
    $this
      ->assertEqual(count($remote_mapping_controller
      ->loadByRemoteIdentifier('id11', '')), 0);
    $this
      ->assertEqual(count($remote_mapping_controller
      ->loadByRemoteIdentifier('id11', NULL, '')), 0);
    $this
      ->assertEqual(count($remote_mapping_controller
      ->loadByRemoteIdentifier(NULL, NULL, 'id13')), 1);

    // Test remote data.
    $item_mapping
      ->addRemoteData('test_data', 'test_value');
    entity_save('tmgmt_remote', $item_mapping);
    $item_mapping = entity_load_single('tmgmt_remote', $item_mapping->trid);
    $this
      ->assertEqual($item_mapping
      ->getRemoteData('test_data'), 'test_value');

    // Add mapping to the other job item as well.
    $item2
      ->addRemoteMapping($data_key, 'id21', array(
      'remote_identifier_2' => 'id22',
      'remote_identifier_3' => 'id23',
    ));

    // Test deleting.
    // Delete item1.
    entity_get_controller('tmgmt_job_item')
      ->delete(array(
      $item1->tjiid,
    ));

    // Test if mapping for item1 has been removed as well.
    $this
      ->assertEqual(count($remote_mapping_controller
      ->loadByLocalData(NULL, $item1->tjiid)), 0);

    // We still should have mapping for item2.
    $this
      ->assertEqual(count($remote_mapping_controller
      ->loadByLocalData(NULL, $item2->tjiid)), 1);

    // Now delete the job and see if remaining mappings were removed as well.
    entity_get_controller('tmgmt_job')
      ->delete(array(
      $job->tjid,
    ));
    $this
      ->assertEqual(count($remote_mapping_controller
      ->loadByLocalData(NULL, $item2->tjiid)), 0);
  }

  /**
   * Test crud operations of job items.
   */
  function testJobItems() {
    $job = $this
      ->createJob();

    // Add some test items.
    $item1 = $job
      ->addItem('test_source', 'type', 5);
    $item2 = $job
      ->addItem('test_source', 'test_with_long_label', 4);

    // Test single load callback.
    $item = tmgmt_job_item_load($item1->tjiid);
    $this
      ->assertEqual($item1->plugin, $item->plugin);
    $this
      ->assertEqual($item1->item_type, $item->item_type);
    $this
      ->assertEqual($item1->item_id, $item->item_id);

    // Test multiple load callback.
    $items = tmgmt_job_item_load_multiple(array(
      $item1->tjiid,
      $item2->tjiid,
    ));
    $this
      ->assertEqual(2, count($items));
    $this
      ->assertEqual($item1->plugin, $items[$item1->tjiid]->plugin);
    $this
      ->assertEqual($item1->item_type, $items[$item1->tjiid]->item_type);
    $this
      ->assertEqual($item1->item_id, $items[$item1->tjiid]->item_id);
    $this
      ->assertEqual($item2->plugin, $items[$item2->tjiid]->plugin);
    $this
      ->assertEqual($item2->item_type, $items[$item2->tjiid]->item_type);
    $this
      ->assertEqual($item2->item_id, $items[$item2->tjiid]->item_id);

    // Test the second item label length - it must not exceed the
    // TMGMT_JOB_LABEL_MAX_LENGTH.
    $this
      ->assertTrue(TMGMT_JOB_LABEL_MAX_LENGTH >= strlen($items[$item2->tjiid]
      ->label()));
  }

  /**
   * Tests adding translated data and revision handling.
   */
  function testAddingTranslatedData() {
    $translator = $this
      ->createTranslator();
    $job = $this
      ->createJob();
    $job->translator = $translator->name;
    $job
      ->save();

    // Add some test items.
    $item1 = $job
      ->addItem('test_source', 'test_with_long_label', 5);

    // Test the job label - it must not exceed the TMGMT_JOB_LABEL_MAX_LENGTH.
    $this
      ->assertTrue(TMGMT_JOB_LABEL_MAX_LENGTH >= strlen($job
      ->label()));
    $key = array(
      'dummy',
      'deep_nesting',
    );
    $translation['dummy']['deep_nesting']['#text'] = 'translated 1';
    $item1
      ->addTranslatedData($translation);
    $data = $item1
      ->getData($key);

    // Check job messages.
    $messages = $job
      ->getMessages();
    $this
      ->assertEqual(count($messages), 1);
    $last_message = end($messages);
    $this
      ->assertEqual($last_message->message, 'The translation of !source to @language is finished and can now be <a href="!review_url">reviewed</a>.');

    // Initial state - translation has been received for the first time.
    $this
      ->assertEqual($data['#translation']['#text'], 'translated 1');
    $this
      ->assertTrue(empty($data['#translation']['#text_revisions']));
    $this
      ->assertEqual($data['#translation']['#origin'], 'remote');
    $this
      ->assertEqual($data['#translation']['#timestamp'], REQUEST_TIME);

    // Set status back to pending as if the data item was rejected.
    $item1
      ->updateData(array(
      'dummy',
      'deep_nesting',
    ), array(
      '#status' => TMGMT_DATA_ITEM_STATE_PENDING,
    ));

    // Add same translation text.
    $translation['dummy']['deep_nesting']['#text'] = 'translated 1';
    $item1
      ->addTranslatedData($translation);
    $data = $item1
      ->getData($key);

    // Check if the status has been updated back to translated.
    $this
      ->assertEqual($data['#status'], TMGMT_DATA_ITEM_STATE_TRANSLATED);

    // Add translation, however locally customized.
    $translation['dummy']['deep_nesting']['#text'] = 'translated 2';
    $translation['dummy']['deep_nesting']['#origin'] = 'local';
    $translation['dummy']['deep_nesting']['#timestamp'] = REQUEST_TIME - 5;
    $item1
      ->addTranslatedData($translation);
    $data = $item1
      ->getData($key);

    // The translation text is updated.
    $this
      ->assertEqual($data['#translation']['#text'], 'translated 2');
    $this
      ->assertEqual($data['#translation']['#timestamp'], REQUEST_TIME - 5);

    // Previous translation is among text_revisions.
    $this
      ->assertEqual($data['#translation']['#text_revisions'][0]['#text'], 'translated 1');
    $this
      ->assertEqual($data['#translation']['#text_revisions'][0]['#origin'], 'remote');
    $this
      ->assertEqual($data['#translation']['#text_revisions'][0]['#timestamp'], REQUEST_TIME);

    // Current translation origin is local.
    $this
      ->assertEqual($data['#translation']['#origin'], 'local');

    // Check job messages.
    $messages = $job
      ->getMessages();
    $this
      ->assertEqual(count($messages), 1);

    // Add translation - not local.
    $translation['dummy']['deep_nesting']['#text'] = 'translated 3';
    unset($translation['dummy']['deep_nesting']['#origin']);
    unset($translation['dummy']['deep_nesting']['#timestamp']);
    $item1
      ->addTranslatedData($translation);
    $data = $item1
      ->getData($key);

    // The translation text is NOT updated.
    $this
      ->assertEqual($data['#translation']['#text'], 'translated 2');
    $this
      ->assertEqual($data['#translation']['#timestamp'], REQUEST_TIME - 5);

    // Received translation is the latest revision.
    $last_revision = end($data['#translation']['#text_revisions']);
    $this
      ->assertEqual($last_revision['#text'], 'translated 3');
    $this
      ->assertEqual($last_revision['#origin'], 'remote');
    $this
      ->assertEqual($last_revision['#timestamp'], REQUEST_TIME);

    // Current translation origin is local.
    $this
      ->assertEqual($data['#translation']['#origin'], 'local');

    // Check job messages.
    $messages = $job
      ->getMessages();
    $this
      ->assertEqual(count($messages), 2);
    $last_message = end($messages);
    $this
      ->assertEqual($last_message->message, 'Translation for customized @key received. Revert your changes if you wish to use it.');

    // Revert to previous revision which is the latest received translation.
    $item1
      ->dataItemRevert($key);
    $data = $item1
      ->getData($key);

    // The translation text is updated.
    $this
      ->assertEqual($data['#translation']['#text'], 'translated 3');
    $this
      ->assertEqual($data['#translation']['#origin'], 'remote');
    $this
      ->assertEqual($data['#translation']['#timestamp'], REQUEST_TIME);

    // Latest revision is now the formerly added local translation.
    $last_revision = end($data['#translation']['#text_revisions']);
    $this
      ->assertTrue($last_revision['#text'], 'translated 2');
    $this
      ->assertTrue($last_revision['#origin'], 'remote');
    $this
      ->assertEqual($last_revision['#timestamp'], REQUEST_TIME - 5);

    // Check job messages.
    $messages = $job
      ->getMessages();
    $this
      ->assertEqual(count($messages), 3);
    $last_message = end($messages);
    $this
      ->assertEqual($last_message->message, 'Translation for @key reverted to the latest version.');

    // There should be three revisions now.
    $this
      ->assertEqual(count($data['#translation']['#text_revisions']), 3);

    // Attempt to update the translation with the same text, this should not
    // lead to a new revision.
    $translation['dummy']['deep_nesting']['#text'] = 'translated 3';

    //unset($translation['dummy']['deep_nesting']['#origin']);

    //unset($translation['dummy']['deep_nesting']['#timestamp']);
    $item1
      ->addTranslatedData($translation);
    $data = $item1
      ->getData($key);
    $this
      ->assertEqual(count($data['#translation']['#text_revisions']), 3);

    // Mark the translation as reviewed, a new translation should not update the
    // existing one but create a new translation.
    $item1
      ->updateData($key, array(
      '#status' => TMGMT_DATA_ITEM_STATE_REVIEWED,
    ));
    $translation['dummy']['deep_nesting']['#text'] = 'translated 4';
    $item1
      ->addTranslatedData($translation);
    $data = $item1
      ->getData($key);

    // The translation text is NOT updated.
    $this
      ->assertEqual($data['#translation']['#text'], 'translated 3');

    // Received translation is the latest revision.
    $this
      ->assertEqual(count($data['#translation']['#text_revisions']), 4);
    $last_revision = end($data['#translation']['#text_revisions']);
    $this
      ->assertEqual($last_revision['#text'], 'translated 4');
    $this
      ->assertEqual($last_revision['#origin'], 'remote');
    $this
      ->assertEqual($last_revision['#timestamp'], REQUEST_TIME);

    // Check job messages.
    $messages = $job
      ->getMessages();
    $this
      ->assertEqual(count($messages), 4);
    $last_message = end($messages);
    $this
      ->assertEqual($last_message->message, 'Translation for already reviewed @key received and stored as a new revision. Revert to it if you wish to use it.');
  }

  /**
   * Test the calculations of the counters.
   */
  function testJobItemsCounters() {
    $job = $this
      ->createJob();

    // Some test data items.
    $data1 = array(
      '#text' => 'The text to be translated.',
    );
    $data2 = array(
      '#text' => 'The text to be translated.',
      '#translation' => '',
    );
    $data3 = array(
      '#text' => 'The text to be translated.',
      '#translation' => 'The translated data. Set by the translator plugin.',
    );
    $data4 = array(
      '#text' => 'Another, longer text to be translated.',
      '#translation' => 'The translated data. Set by the translator plugin.',
      '#status' => TMGMT_DATA_ITEM_STATE_REVIEWED,
    );
    $data5 = array(
      '#label' => 'label',
      'data1' => $data1,
      'data4' => $data4,
    );

    // No data items.
    $this
      ->assertEqual(0, $job
      ->getCountPending());
    $this
      ->assertEqual(0, $job
      ->getCountTranslated());
    $this
      ->assertEqual(0, $job
      ->getCountReviewed());
    $this
      ->assertEqual(0, $job
      ->getCountAccepted());
    $this
      ->assertEqual(0, $job
      ->getWordCount());

    // Add a test items.
    $job_item1 = tmgmt_job_item_create('plugin', 'type', 4, array(
      'tjid' => $job->tjid,
    ));
    $job_item1
      ->save();

    // No pending, translated and confirmed data items.
    $job = entity_load_single('tmgmt_job', $job->tjid);
    $job_item1 = entity_load_single('tmgmt_job_item', $job_item1->tjiid);
    drupal_static_reset('tmgmt_job_statistics_load');
    $this
      ->assertEqual(0, $job_item1
      ->getCountPending());
    $this
      ->assertEqual(0, $job_item1
      ->getCountTranslated());
    $this
      ->assertEqual(0, $job_item1
      ->getCountReviewed());
    $this
      ->assertEqual(0, $job_item1
      ->getCountAccepted());
    $this
      ->assertEqual(0, $job
      ->getCountPending());
    $this
      ->assertEqual(0, $job
      ->getCountTranslated());
    $this
      ->assertEqual(0, $job
      ->getCountReviewed());
    $this
      ->assertEqual(0, $job
      ->getCountAccepted());

    // Add an untranslated data item.
    $job_item1->data['data_item1'] = $data1;
    $job_item1
      ->save();

    // One pending data items.
    $job = entity_load_single('tmgmt_job', $job->tjid);
    $job_item1 = entity_load_single('tmgmt_job_item', $job_item1->tjiid);
    drupal_static_reset('tmgmt_job_statistics_load');
    $this
      ->assertEqual(1, $job_item1
      ->getCountPending());
    $this
      ->assertEqual(0, $job_item1
      ->getCountTranslated());
    $this
      ->assertEqual(0, $job_item1
      ->getCountReviewed());
    $this
      ->assertEqual(5, $job_item1
      ->getWordCount());
    $this
      ->assertEqual(1, $job
      ->getCountPending());
    $this
      ->assertEqual(0, $job
      ->getCountReviewed());
    $this
      ->assertEqual(0, $job
      ->getCountTranslated());
    $this
      ->assertEqual(5, $job
      ->getWordCount());

    // Add another untranslated data item.
    // Test with an empty translation set.
    $job_item1->data['data_item1'] = $data2;
    $job_item1
      ->save();

    // One pending data items.
    $job = entity_load_single('tmgmt_job', $job->tjid);
    $job_item1 = entity_load_single('tmgmt_job_item', $job_item1->tjiid);
    drupal_static_reset('tmgmt_job_statistics_load');
    $this
      ->assertEqual(1, $job_item1
      ->getCountPending());
    $this
      ->assertEqual(0, $job_item1
      ->getCountTranslated());
    $this
      ->assertEqual(0, $job_item1
      ->getCountReviewed());
    $this
      ->assertEqual(5, $job_item1
      ->getWordCount());
    $this
      ->assertEqual(1, $job
      ->getCountPending());
    $this
      ->assertEqual(0, $job
      ->getCountTranslated());
    $this
      ->assertEqual(0, $job
      ->getCountReviewed());
    $this
      ->assertEqual(5, $job
      ->getWordCount());

    // Add a translated data item.
    $job_item1->data['data_item1'] = $data3;
    $job_item1
      ->save();

    // One translated data items.
    drupal_static_reset('tmgmt_job_statistics_load');
    $this
      ->assertEqual(0, $job_item1
      ->getCountPending());
    $this
      ->assertEqual(1, $job_item1
      ->getCountTranslated());
    $this
      ->assertEqual(0, $job_item1
      ->getCountReviewed());
    $this
      ->assertEqual(0, $job
      ->getCountPending());
    $this
      ->assertEqual(0, $job
      ->getCountReviewed());
    $this
      ->assertEqual(1, $job
      ->getCountTranslated());

    // Add a confirmed data item.
    $job_item1->data['data_item1'] = $data4;
    $job_item1
      ->save();

    // One reviewed data item.
    drupal_static_reset('tmgmt_job_statistics_load');
    $this
      ->assertEqual(1, $job_item1
      ->getCountReviewed());
    $this
      ->assertEqual(1, $job
      ->getCountReviewed());

    // Add a translated and an untranslated and a confirmed data item
    $job = entity_load_single('tmgmt_job', $job->tjid);
    $job_item1 = entity_load_single('tmgmt_job_item', $job_item1->tjiid);
    $job_item1->data['data_item1'] = $data1;
    $job_item1->data['data_item2'] = $data3;
    $job_item1->data['data_item3'] = $data4;
    $job_item1
      ->save();

    // One pending and translated data items each.
    drupal_static_reset('tmgmt_job_statistics_load');
    $this
      ->assertEqual(1, $job
      ->getCountPending());
    $this
      ->assertEqual(1, $job
      ->getCountTranslated());
    $this
      ->assertEqual(1, $job
      ->getCountReviewed());
    $this
      ->assertEqual(16, $job
      ->getWordCount());

    // Add nested data items.
    $job_item1->data['data_item1'] = $data5;
    $job_item1
      ->save();

    // One pending data items.
    $job = entity_load_single('tmgmt_job', $job->tjid);
    $job_item1 = entity_load_single('tmgmt_job_item', $job_item1->tjiid);
    $this
      ->assertEqual('label', $job_item1->data['data_item1']['#label']);
    $this
      ->assertEqual(3, count($job_item1->data['data_item1']));

    // Add a greater number of data items
    for ($index = 1; $index <= 3; $index++) {
      $job_item1->data['data_item' . $index] = $data1;
    }
    for ($index = 4; $index <= 10; $index++) {
      $job_item1->data['data_item' . $index] = $data3;
    }
    for ($index = 11; $index <= 15; $index++) {
      $job_item1->data['data_item' . $index] = $data4;
    }
    $job_item1
      ->save();

    // 3 pending and 7 translated data items each.
    $job = entity_load_single('tmgmt_job', $job->tjid);
    drupal_static_reset('tmgmt_job_statistics_load');
    $this
      ->assertEqual(3, $job
      ->getCountPending());
    $this
      ->assertEqual(7, $job
      ->getCountTranslated());
    $this
      ->assertEqual(5, $job
      ->getCountReviewed());

    // Add several job items
    $job_item2 = tmgmt_job_item_create('plugin', 'type', 5, array(
      'tjid' => $job->tjid,
    ));
    for ($index = 1; $index <= 4; $index++) {
      $job_item2->data['data_item' . $index] = $data1;
    }
    for ($index = 5; $index <= 12; $index++) {
      $job_item2->data['data_item' . $index] = $data3;
    }
    for ($index = 13; $index <= 16; $index++) {
      $job_item2->data['data_item' . $index] = $data4;
    }
    $job_item2
      ->save();

    // 3 pending and 7 translated data items each.
    $job = entity_load_single('tmgmt_job', $job->tjid);
    drupal_static_reset('tmgmt_job_statistics_load');
    $this
      ->assertEqual(7, $job
      ->getCountPending());
    $this
      ->assertEqual(15, $job
      ->getCountTranslated());
    $this
      ->assertEqual(9, $job
      ->getCountReviewed());

    // Accept the job items.
    foreach ($job
      ->getItems() as $item) {

      // Set the state directly to avoid triggering translator and source
      // controllers that do not exist.
      $item
        ->setState(TMGMT_JOB_ITEM_STATE_ACCEPTED);
      $item
        ->save();
    }
    drupal_static_reset('tmgmt_job_statistics_load');
    $this
      ->assertEqual(0, $job
      ->getCountPending());
    $this
      ->assertEqual(0, $job
      ->getCountTranslated());
    $this
      ->assertEqual(0, $job
      ->getCountReviewed());
    $this
      ->assertEqual(31, $job
      ->getCountAccepted());
  }

}

Classes

Namesort descending Description
TMGMTCRUDTestCase Basic CRUD tests.