'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 reviewed.'); // 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()); } }