View source
<?php
class TMGMTUITestCase extends TMGMTBaseTestCase {
static function getInfo() {
return array(
'name' => 'UI tests',
'description' => 'Verifies basic functionality of the user interface',
'group' => 'Translation Management',
);
}
function setUp() {
parent::setup(array(
'tmgmt_ui',
));
parent::createLanguagesLoginTranslator();
}
function testCheckoutForm() {
$job = tmgmt_job_match_item('en', '');
$job
->addItem('test_source', 'test', 1);
$redirects = tmgmt_ui_job_checkout_multiple(array(
$job,
));
$this
->drupalGet(reset($redirects));
$this
->assertText('test_source:test:1');
$job
->addItem('test_source', 'test', 2);
$job
->addItem('test_source', 'test', 3);
$redirects = tmgmt_ui_job_checkout_multiple(array(
$job,
));
$this
->drupalGet(reset($redirects));
$this
->assertText('test_source:test:1');
$this
->assertText('test_source:test:2');
$this
->assertText('test_source:test:3');
$edit = array(
'target_language' => 'el',
'settings[action]' => 'translate',
);
$this
->drupalPost(NULL, $edit, t('Submit to translator'));
$this
->assertText(t('@translator can not translate from @source to @target.', array(
'@translator' => 'Test translator (auto created)',
'@source' => 'English',
'@target' => 'Greek',
)));
$job = entity_load_unchanged('tmgmt_job', $job->tjid);
$this
->assertTrue($job
->isUnprocessed());
$edit = array(
'target_language' => 'es',
'settings[action]' => 'translate',
);
$this
->drupalPost(NULL, $edit, t('Submit to translator'));
$job = entity_load_unchanged('tmgmt_job', $job->tjid);
$this
->assertTrue($job
->isActive());
foreach ($job
->getItems() as $job_item) {
$this
->assertTrue($job_item
->isNeedsReview());
}
$this
->assertText(t('Test translation created'));
$this
->assertNoText(t('Test translator called'));
$this
->assertText(t('Job overview'));
$previous_tjid = $job->tjid;
$job = tmgmt_job_match_item('en', '');
$job
->addItem('test_source', 'test', 1);
$this
->assertNotEqual($job->tjid, $previous_tjid);
$redirects = tmgmt_ui_job_checkout_multiple(array(
$job,
));
$this
->drupalGet(reset($redirects));
$this
->assertText('You can provide a label for this job in order to identify it easily later on.');
$this
->assertText('test_source:test:1');
$edit = array(
'target_language' => 'es',
'settings[action]' => 'submit',
);
$this
->drupalPost(NULL, $edit, t('Submit to translator'));
$this
->assertText(t('Test submit'));
$job = entity_load_unchanged('tmgmt_job', $job->tjid);
$this
->assertTrue($job
->isActive());
$job = tmgmt_job_match_item('en', 'es');
$job
->addItem('test_source', 'test', 1);
$redirects = tmgmt_ui_job_checkout_multiple(array(
$job,
));
$this
->drupalGet(reset($redirects));
$this
->assertText('You can provide a label for this job in order to identify it easily later on.');
$this
->assertText('test_source:test:1');
$edit = array(
'settings[action]' => 'reject',
);
$this
->drupalPost(NULL, $edit, t('Submit to translator'));
$this
->assertText(t('This is not supported'));
$job = entity_load_unchanged('tmgmt_job', $job->tjid);
$this
->assertTrue($job
->isRejected());
$args = array(
'@view' => 'view-tmgmt-ui-job-messages',
);
$this
->assertEqual(2, count($this
->xpath('//div[contains(@class, @view)]//tbody/tr', $args)));
$message_authors = $this
->xpath('////div[contains(@class, @view)]//td[contains(@class, @field)]/span', $args + array(
'@field' => 'views-field-name',
));
$this
->assertEqual(2, count($message_authors));
foreach ($message_authors as $message_author) {
$this
->assertEqual((string) $message_author, $this->translator_user->name);
}
$this
->assertTrue($job
->isSubmittable());
$edit = array(
'settings[action]' => 'translate',
);
$this
->drupalPost(NULL, $edit, t('Submit to translator'));
$this
->assertText(t('Test translation created'));
$job = tmgmt_job_match_item('en', 'es');
$job
->addItem('test_source', 'test', 1);
$redirects = tmgmt_ui_job_checkout_multiple(array(
$job,
));
$this
->drupalGet(reset($redirects));
$this
->assertText('You can provide a label for this job in order to identify it easily later on.');
$this
->assertText('test_source:test:1');
$edit = array(
'settings[action]' => 'fail',
);
$this
->drupalPost(NULL, $edit, t('Submit to translator'));
$this
->assertText(t('Service not reachable'));
$job = entity_load_unchanged('tmgmt_job', $job->tjid);
$this
->assertTrue($job
->isUnprocessed());
$this
->assertText('You can provide a label for this job in order to identify it easily later on.');
$job = tmgmt_job_match_item('en', 'es');
$job
->addItem('test_source', 'test', 1);
$redirects = tmgmt_ui_job_checkout_multiple(array(
$job,
));
$this
->drupalGet(reset($redirects));
$this
->assertText('You can provide a label for this job in order to identify it easily later on.');
$this
->assertText('test_source:test:1');
$edit = array(
'settings[action]' => 'not_translatable',
);
$this
->drupalPost(NULL, $edit, t('Submit to translator'));
$this
->assertText(t('Fail'));
$job = entity_load_unchanged('tmgmt_job', $job->tjid);
$this
->assertTrue($job
->isUnprocessed());
$this->default_translator->settings['action'] = 'reject';
$this->default_translator
->save();
$job = tmgmt_job_match_item('en', 'es');
$job
->addItem('test_source', 'test', 1);
$redirects = tmgmt_ui_job_checkout_multiple(array(
$job,
));
$this
->drupalGet(reset($redirects));
$this
->assertText('You can provide a label for this job in order to identify it easily later on.');
$this
->assertText('test_source:test:1');
$this
->drupalPost(NULL, array(), t('Submit to translator'));
$this
->assertText(t('This is not supported.'));
$job = entity_load_unchanged('tmgmt_job', $job->tjid);
$this
->assertTrue($job
->isRejected());
}
function testCheckoutFunction() {
$job = $this
->createJob();
$redirects = tmgmt_ui_job_checkout_multiple(array(
$job,
));
$uri = $job
->uri();
$this
->assertEqual($uri['path'], $redirects[0]);
$this
->assertTrue($job
->isUnprocessed());
$job
->delete();
$default_translator = tmgmt_translator_load('test_translator');
$default_translator->settings = array(
'expose_settings' => FALSE,
);
$job = $this
->createJob();
$redirects = tmgmt_ui_job_checkout_multiple(array(
$job,
));
$this
->assertFalse($redirects);
$this
->assertTrue($job
->isActive());
$job = $this
->createJob('en', '');
$redirects = tmgmt_ui_job_checkout_multiple(array(
$job,
));
$uri = $job
->uri();
$this
->assertEqual($uri['path'], $redirects[0]);
$this
->assertTrue($job
->isUnprocessed());
$job = $this
->createJob();
$second_translator = $this
->createTranslator();
$second_translator->settings = array(
'expose_settings' => FALSE,
);
$second_translator
->save();
$redirects = tmgmt_ui_job_checkout_multiple(array(
$job,
));
$uri = $job
->uri();
$this
->assertEqual($uri['path'], $redirects[0]);
$this
->assertTrue($job
->isUnprocessed());
}
public function testReview() {
$job = $this
->createJob();
$job->translator = $this->default_translator->name;
$job->settings = array();
$job
->save();
$item = $job
->addItem('test_source', 'test', 1);
$data = tmgmt_flatten_data($item
->getData());
$keys = array_keys($data);
$key = $keys[0];
$this
->drupalGet('admin/tmgmt/items/' . $item->tjiid);
$this
->assertText(t('Testing output of review data item element @key from the testing translator.', array(
'@key' => $key,
)));
$this
->assertFieldByName('dummy|deep_nesting[source]', $data[$key]['#text']);
$this
->drupalPost(NULL, array(
'dummy|deep_nesting[translation]' => $data[$key]['#text'] . 'translated',
), t('Save'));
$this
->drupalGet('admin/tmgmt/items/' . $item->tjiid);
$this
->assertFieldByName('dummy|deep_nesting[translation]', $data[$key]['#text'] . 'translated');
}
public function testSuggestions() {
$job = $this
->createJob();
$job
->addItem('test_source', 'test', 1);
$job
->addItem('test_source', 'test', 7);
$redirects = tmgmt_ui_job_checkout_multiple(array(
$job,
));
$this
->drupalGet(reset($redirects));
$this
->assertRaw('20');
$commands = $this
->drupalPostAJAX(NULL, array(), array(
'op' => t('Load suggestions'),
));
$this
->assertEqual(count($commands), 4, 'Found 4 commands in AJAX-Request.');
foreach ($commands as $command) {
if ($command['command'] == 'settings') {
}
else {
if ($command['command'] == 'insert') {
if ($command['method'] == 'prepend' && $command['selector'] == 'head') {
$this
->assertTrue(substr_count($command['data'], 'misc/tableselect.js'), 'Javascript for Tableselect found.');
}
else {
if ($command['method'] == NULL && $command['selector'] == NULL) {
$this
->assertTrue(substr_count($command['data'], '</th>') == 5, 'Found five table header.');
$this
->assertTrue(substr_count($command['data'], '</tr>') == 3, 'Found two suggestion and one table header.');
$this
->assertTrue(substr_count($command['data'], '<td>11</td>') == 2, 'Found 10 words to translate per suggestion.');
$this
->assertTrue(substr_count($command['data'], 'value="Add suggestions"'), 'Found add button.');
}
else {
if ($command['method'] == 'prepend' && $command['selector'] == NULL) {
$this
->assertTrue(empty($command['data']), 'No content will be prepended.');
}
else {
$this
->fail('Unknown method/selector combination.');
debug($command);
}
}
}
}
else {
$this
->fail('Unknown command.');
debug($command);
}
}
}
$this
->assertText('test_source:test_suggestion:1');
$this
->assertText('test_source:test_suggestion:7');
$this
->assertText('Test suggestion for test source 1');
$this
->assertText('Test suggestion for test source 7');
$edit = array(
'suggestions_table[2]' => TRUE,
);
$this
->drupalPost(NULL, $edit, t('Add suggestions'));
$this
->assertRaw('31');
$this
->assertNoText('Test suggestion for test source 7');
$this
->assertText('test_source:test_suggestion_suggestion:7');
}
function testAbortJob() {
$job = $this
->createJob();
$job
->addItem('test_source', 'test', 1);
$job
->addItem('test_source', 'test', 2);
$job
->addItem('test_source', 'test', 3);
$edit = array(
'target_language' => 'es',
'settings[action]' => 'translate',
);
$this
->drupalPost('admin/tmgmt/jobs/' . $job->tjid, $edit, t('Submit to translator'));
$this
->drupalPost('admin/tmgmt/jobs/' . $job->tjid, array(), t('Abort job'));
$this
->drupalPost(NULL, array(), t('Confirm'));
entity_get_controller('tmgmt_job')
->resetCache();
$job = tmgmt_job_load($job->tjid);
$this
->assertTrue($job
->isAborted());
foreach ($job
->getItems() as $item) {
$this
->assertTrue($item
->isAborted());
}
$this
->drupalPost('admin/tmgmt/jobs/' . $job->tjid, array(), t('Resubmit'));
$this
->drupalPost(NULL, array(), t('Confirm'));
$this
->assertRaw(t('This job is a duplicate of the previously aborted job <a href="@url">#@id</a>', array(
'@url' => url('admin/tmgmt/jobs/' . $job->tjid),
'@id' => $job->tjid,
)));
$url_parts = explode('/', $this
->getUrl());
$resubmitted_job = tmgmt_job_load(array_pop($url_parts));
$this
->assertTrue($resubmitted_job
->isUnprocessed());
$this
->assertEqual($job->translator, $resubmitted_job->translator);
$this
->assertEqual($job->source_language, $resubmitted_job->source_language);
$this
->assertEqual($job->target_language, $resubmitted_job->target_language);
$this
->assertEqual($job->settings, $resubmitted_job->settings);
foreach ($job
->getItems() as $item) {
$_items = $resubmitted_job
->getItems(array(
'data' => array(
'value' => '%id ' . $item->item_id . '%',
'operator' => 'LIKE',
),
));
$_item = reset($_items);
$this
->assertNotEqual($_item->tjid, $item->tjid);
$this
->assertEqual($_item->plugin, $item->plugin);
$this
->assertEqual($_item->item_id, $item->item_id);
$this
->assertEqual($_item->item_type, $item->item_type);
$this
->assertTrue($_item->word_count > 0);
$this
->assertTrue($_item->count_pending > 0);
$this
->assertEqual($_item->count_translated, 0);
$this
->assertEqual($_item->count_accepted, 0);
$this
->assertEqual($_item->count_reviewed, 0);
}
$this
->drupalGet('admin/tmgmt/jobs/' . $job->tjid);
$this
->assertRaw(t('Job has been duplicated as a new job <a href="@url">#@id</a>.', array(
'@url' => url('admin/tmgmt/jobs/' . $resubmitted_job->tjid),
'@id' => $resubmitted_job->tjid,
)));
$this
->drupalGet('admin/tmgmt/jobs');
$elements = $this
->xpath('//table[contains(@class, @view)]//td[contains(., @text)]', array(
'@view' => 'views-table',
'@text' => t('N/A'),
));
$status = $elements[0];
$this
->assertEqual(trim((string) $status), t('N/A'));
}
function testCart() {
$this
->setEnvironment('fr');
$job_items = array();
for ($i = 1; $i < 6; $i++) {
$job_item = tmgmt_job_item_create('test_source', 'test', $i);
$job_item
->save();
$job_items[$i] = $job_item;
}
$this
->loginAsTranslator();
foreach ($job_items as $job_item) {
$this
->drupalGet('tmgmt-add-to-cart/' . $job_item->tjiid);
}
$this
->drupalGet('admin/tmgmt/cart');
foreach ($job_items as $job_item) {
$this
->assertText($job_item
->label());
}
$this
->drupalPost(NULL, array(
'items[1]' => TRUE,
'items[4]' => TRUE,
), t('Remove selected'));
$this
->assertText($job_items[2]
->label());
$this
->assertText($job_items[3]
->label());
$this
->assertText($job_items[5]
->label());
$this
->assertNoText($job_items[1]
->label());
$this
->assertNoText($job_items[4]
->label());
$this
->assertText(t('Job items were removed from the cart.'));
$existing_items = tmgmt_job_item_load_multiple(NULL);
$this
->assertTrue(!isset($existing_items[$job_items[1]->tjiid]));
$this
->assertTrue(!isset($existing_items[$job_items[4]->tjiid]));
$this
->drupalPost(NULL, array(), t('Empty cart'));
$this
->assertNoText($job_items[2]
->label());
$this
->assertNoText($job_items[3]
->label());
$this
->assertNoText($job_items[5]
->label());
$this
->assertText(t('All job items were removed from the cart.'));
$existing_items = tmgmt_job_item_load_multiple(NULL);
$this
->assertTrue(empty($existing_items));
$language_sequence = array(
'en',
'en',
'fr',
'fr',
'de',
'de',
);
for ($i = 1; $i < 7; $i++) {
$job_item = tmgmt_job_item_create('test_source', 'test', $i);
$job_item
->save();
$job_items[$i] = $job_item;
$languages[$job_items[$i]->tjiid] = $language_sequence[$i - 1];
}
variable_set('tmgmt_test_source_languages', $languages);
foreach ($job_items as $job_item) {
$this
->drupalGet('tmgmt-add-to-cart/' . $job_item->tjiid);
}
$this
->drupalPost('admin/tmgmt/cart', array(
'items[' . $job_items[1]->tjiid . ']' => TRUE,
'items[' . $job_items[2]->tjiid . ']' => TRUE,
'items[' . $job_items[3]->tjiid . ']' => TRUE,
'items[' . $job_items[4]->tjiid . ']' => TRUE,
'items[' . $job_items[5]->tjiid . ']' => TRUE,
'target_language[]' => array(
'en',
'de',
),
), t('Request translation'));
$this
->assertText(t('@count jobs need to be checked out.', array(
'@count' => 4,
)));
$jobs = entity_load('tmgmt_job', FALSE, array(
'source_language' => 'fr',
'target_language' => 'en',
));
$job = reset($jobs);
$this
->assertEqual(count($job
->getItems()), 2);
$jobs = entity_load('tmgmt_job', FALSE, array(
'source_language' => 'de',
'target_language' => 'en',
));
$job = reset($jobs);
$this
->assertEqual(count($job
->getItems()), 1);
$jobs = entity_load('tmgmt_job', FALSE, array(
'source_language' => 'en',
'target_language' => 'de',
));
$job = reset($jobs);
$this
->assertEqual(count($job
->getItems()), 2);
$jobs = entity_load('tmgmt_job', FALSE, array(
'source_language' => 'fr',
'target_language' => 'de',
));
$job = reset($jobs);
$this
->assertEqual(count($job
->getItems()), 2);
$this
->drupalGet('admin/tmgmt/cart');
$this
->assertNoText($job_items[1]
->label());
$this
->assertNoText($job_items[2]
->label());
$this
->assertNoText($job_items[3]
->label());
$this
->assertNoText($job_items[4]
->label());
$this
->assertNoText($job_items[5]
->label());
$this
->assertText($job_items[6]
->label());
}
function testCartEnforceSourceLanguage() {
$this
->setEnvironment('sk');
$this
->setEnvironment('cs');
module_enable(array(
'tmgmt_node',
));
$content_type = $this
->drupalCreateContentType();
$node_sk = $this
->drupalCreateNode(array(
'title' => $this
->randomName(),
'language' => 'sk',
'body' => array(
'sk' => array(
array(
$this
->randomName(),
),
),
),
'type' => $content_type->type,
));
$this
->drupalCreateNode(array(
'title' => $this
->randomName(),
'language' => 'en',
'tnid' => $node_sk->nid,
'body' => array(
'en' => array(
array(
$this
->randomName(),
),
),
),
'type' => $content_type->type,
));
$node_cs = $this
->drupalCreateNode(array(
'title' => $this
->randomName(),
'language' => 'cs',
'body' => array(
'cs' => array(
array(
$this
->randomName(),
),
),
),
'type' => $content_type->type,
));
$this
->loginAsTranslator();
$job_item_sk = tmgmt_job_item_create('node', 'node', $node_sk->nid);
$job_item_sk
->save();
$this
->drupalGet('tmgmt-add-to-cart/' . $job_item_sk->tjiid);
$job_items_data[$job_item_sk->item_id] = $job_item_sk->item_type;
$job_item_cs = tmgmt_job_item_create('node', 'node', $node_cs->nid);
$job_item_cs
->save();
$this
->drupalGet('tmgmt-add-to-cart/' . $job_item_cs->tjiid);
$job_items_data[$job_item_cs->item_id] = $job_item_cs->item_type;
$this
->drupalPost('admin/tmgmt/cart', array(
'enforced_source_language' => TRUE,
'source_language' => 'en',
'items[' . $job_item_cs->tjiid . ']' => TRUE,
'items[' . $job_item_sk->tjiid . ']' => TRUE,
'target_language[]' => array(
'es',
),
), t('Request translation'));
$this
->assertText(t('One job needs to be checked out.'));
$this
->assertRaw(t('One item skipped. @language translation unavailable.', array(
'@language' => 'English',
)));
$args = explode('/', $this
->getUrl());
$tjid = array_pop($args);
$this
->drupalPost(NULL, array(), t('Submit to translator'));
foreach (tmgmt_job_load($tjid)
->getItems() as $job_item) {
$this
->assertEqual($job_items_data[$job_item->item_id], $job_item->item_type);
}
$this
->drupalGet('admin/tmgmt/cart');
$this
->assertText($node_cs->title);
$this
->assertNoText($node_sk->title);
}
}