'Node Source UI tests',
'description' => 'Tests the user interface for node translation sources.',
'group' => 'Translation Management',
);
}
function setUp() {
parent::setUp(array('tmgmt_node_ui', 'block'));
// We need the administer blocks permission.
$this->loginAsAdmin(array('administer blocks'));
$this->setEnvironment('de');
$this->setEnvironment('fr');
$this->setEnvironment('es');
$this->setEnvironment('el');
// @todo Re-enable this when switching to testing profile.
// Enable the main page content block for hook_page_alter() to work.
$edit = array(
'blocks[system_main][region]' => 'content',
);
$this->drupalPost('admin/structure/block', $edit, t('Save blocks'));
$this->createNodeType('page', 'Page', TRANSLATION_ENABLED, FALSE);
}
/**
* Tests the create, submit and accept permissions.
*/
function testPermissions() {
$no_permissions = $this->drupalCreateUser();
$this->drupalLogin($no_permissions);
$this->drupalGet('admin/tmgmt');
$this->assertResponse(403);
// Test with a user that is only allowed to create jobs.
$create_user = $this->drupalCreateUser(array('access administration pages', 'translate content', 'create translation jobs'));
$this->drupalLogin($create_user);
// Create an english source node.
$node = $this->drupalCreateNode(array('type' => 'page', 'language' => 'en', 'body' => array('en' => array(array()))));
// Go to the translate tab.
$this->drupalGet('node/' . $node->nid);
$this->clickLink('Translate');
// Request a translation for german.
$edit = array(
'languages[de]' => TRUE,
);
$this->drupalPost(NULL, $edit, t('Request translation'));
$this->assertText(t('One job has been created.'));
// Verify that we are still on the translate tab.
$this->assertText(t('Translations of @title', array('@title' => $node->title)));
// The job is unprocessed, check the status flag in the source list.
$this->drupalGet('admin/tmgmt/sources');
$links = $this->xpath('//a[contains(@title, :title)]', array(':title' => t('Active job item: @state', array('@state' => t('Unprocessed')))));
$attributes = $links[0]->attributes();
// Check if the found link points to the job checkout page instead of the
// job item review form.
$this->assertEqual($attributes['href'], url('admin/tmgmt/jobs/1', array('query' => array('destination' => 'admin/tmgmt/sources'))));
$this->drupalGet('admin/tmgmt');
$this->assertResponse(200);
$this->assertLink(t('manage'));
$this->assertNoLink(t('submit'));
$this->assertNoLink(t('delete'));
$this->assertText(t('@title', array('@title' => $node->title)));
$this->clickLink(t('manage'));
$this->assertResponse(200);
$this->assertNoRaw(t('Submit to translator'));
// Try to access the delete page directly.
$this->drupalGet($this->getUrl() . '/delete');
$this->assertResponse(403);
// Log in as user with only submit permission.
$submit_user = $this->drupalCreateUser(array('access administration pages', 'translate content', 'submit translation jobs'));
$this->drupalLogin($submit_user);
// Go to the translate tab, verify that there is no request translation
// button.
$this->drupalGet('node/' . $node->nid);
$this->clickLink('Translate');
$this->assertNoRaw(t('Request translation'));
// Go to the overview and submit the job.
$this->drupalGet('admin/tmgmt');
$this->assertResponse(200);
$this->assertLink(t('submit'));
$this->assertNoLink(t('manage'));
$this->assertNoLink(t('delete'));
$this->assertText(t('@title', array('@title' => $node->title)));
// Check VBO actions - "submit translation job" has the right to cancel
// translation only.
$element = $this->xpath('//select[@id=:id]/option/@value', array(':id' => 'edit-operation'));
$options = array();
foreach ($element as $option) {
$options[] = (string) $option;
}
$this->assertTrue(in_array('rules_component::rules_tmgmt_job_abort_translation', $options));
// Go to the job checkout page and submit it.
$this->clickLink('submit');
$this->drupalPost(NULL, array(), t('Submit to translator'));
// After submit the redirect goes back to the job overview.
$this->assertUrl('admin/tmgmt');
// Make sure that the job is active now.
$this->assertText(t('Active'));
// Click abort link and check if we are at the job abort confirm page.
$this->clickLink(t('abort'));
$this->assertText(t('This will send a request to the translator to abort the job. After the action the job translation process will be aborted and only remaining action will be resubmitting it.'));
// Return back to job overview and test the manage link.
$this->drupalGet('admin/tmgmt');
$this->clickLink(t('manage'));
$this->assertText(t('Needs review'));
$this->assertNoLink(t('review'));
// Now log in as user with only accept permission and review the job.
$accept_user = $this->drupalCreateUser(array('access administration pages', 'accept translation jobs'));
$this->drupalLogin($accept_user);
$this->drupalGet('admin/tmgmt');
// Check VBO actions - "accept translation jobs" has the right to accept
// translation only.
$element = $this->xpath('//select[@id=:id]/option/@value', array(':id' => 'edit-operation'));
$options = array();
foreach ($element as $option) {
$options[] = (string) $option;
}
$this->assertTrue(in_array('rules_component::rules_tmgmt_job_accept_translation', $options));
$this->clickLink('manage');
$this->clickLink('review');
$this->drupalPost(NULL, array(), '✓');
// Verify that the accepted character is shown.
$this->assertText('☑');
$this->drupalPost(NULL, array(), t('Save as completed'));
$this->assertText(t('Accepted'));
$this->assertText('1/0/0');
$create_user = $this->loginAsAdmin();
$this->drupalLogin($create_user);
$this->drupalGet('admin/tmgmt');
// Check VBO actions - "administer tmgmt" has rights for all actions.
$element = $this->xpath('//select[@id=:id]/option/@value', array(':id' => 'edit-operation'));
$options = array();
foreach ($element as $option) {
$options[] = (string) $option;
}
$this->assertTrue(in_array('rules_component::rules_tmgmt_job_accept_translation', $options));
$this->assertTrue(in_array('rules_component::rules_tmgmt_job_abort_translation', $options));
$this->assertTrue(in_array('rules_component::rules_tmgmt_job_delete', $options));
// Go to the translate tab, verify that there is no request translation
// button.
//$this->drupalGet('node/' . $node->nid);
//$this->clickLink('Translate');
//$this->assertNoRaw(t('Request translation'));
}
/**
* Test the translate tab for a single checkout.
*/
function testTranslateTabSingleCheckout() {
// Create a user that is allowed to translate nodes.
$translater = $this->drupalCreateUser(array('translate content', 'create translation jobs', 'submit translation jobs', 'accept translation jobs'));
$this->drupalLogin($translater);
// Create an english source node.
$node = $this->drupalCreateNode(array('type' => 'page', 'language' => 'en', 'body' => array('en' => array(array()))));
// Go to the translate tab.
$this->drupalGet('node/' . $node->nid);
$this->clickLink('Translate');
// Assert some basic strings on that page.
$this->assertText(t('Translations of @title', array('@title' => $node->title)));
$this->assertText(t('Pending Translations'));
// Request a translation for german.
$edit = array(
'languages[de]' => TRUE,
);
$this->drupalPost(NULL, $edit, t('Request translation'));
// Verify that we are on the translate tab.
$this->assertText(t('One job needs to be checked out.'));
$this->assertText($node->title);
// Go to the translate tab and check if the pending translation label is
// "Unprocessed" and links to the job checkout page.
$this->drupalGet('node/' . $node->nid . '/translate');
$this->assertLink(t('Unprocessed'));
$this->clickLink(t('Unprocessed'));
// Submit.
$this->drupalPost(NULL, array(), t('Submit to translator'));
// Make sure that we're back on the translate tab.
$this->assertEqual(url('node/' . $node->nid . '/translate', array('absolute' => TRUE)), $this->getUrl());
$this->assertText(t('Test translation created.'));
$this->assertText(t('The translation of @title to @language is finished and can now be reviewed.', array('@title' => $node->title, '@language' => t('German'))));
// Review.
$this->clickLink(t('Needs review'));
// @todo Review job throuh the UI.
$items = tmgmt_job_item_load_latest('node', 'node', $node->nid, 'en');
$items['de']->acceptTranslation();
// German node should now be listed and be clickable.
$this->drupalGet('node/' . $node->nid . '/translate');
$this->clickLink('de_' . $node->title);
// Test that the destination query argument does not break the redirect
// and we are redirected back to the correct page.
$this->drupalGet('node/' . $node->nid . '/translate', array('query' => array('destination' => 'node')));
// Request a spanish translation.
$edit = array(
'languages[es]' => TRUE,
);
$this->drupalPost(NULL, $edit, t('Request translation'));
// Verify that we are on the checkout page.
$this->assertText(t('One job needs to be checked out.'));
$this->assertText($node->title);
$this->drupalPost(NULL, array(), t('Submit to translator'));
// Make sure that we're back on the originally defined destination URL.
$this->assertEqual(url('node', array('absolute' => TRUE)), $this->getUrl());
}
/**
* Test the translate tab for a single checkout.
*/
function testTranslateTabMultipeCheckout() {
// Create a user that is allowed to translate nodes.
$translater = $this->drupalCreateUser(array('translate content', 'create translation jobs', 'submit translation jobs', 'accept translation jobs'));
$this->drupalLogin($translater);
// Create an english source node.
$node = $this->drupalCreateNode(array('type' => 'page', 'language' => 'en', 'body' => array('en' => array(array()))));
// Go to the translate tab.
$this->drupalGet('node/' . $node->nid);
$this->clickLink('Translate');
// Assert some basic strings on that page.
$this->assertText(t('Translations of @title', array('@title' => $node->title)));
$this->assertText(t('Pending Translations'));
// Request a translation for german.
$edit = array(
'languages[de]' => TRUE,
'languages[es]' => TRUE,
);
$this->drupalPost(NULL, $edit, t('Request translation'));
// Verify that we are on the translate tab.
$this->assertText(t('2 jobs need to be checked out.'));
// Submit all jobs.
$this->assertText($node->title);
$this->drupalPost(NULL, array(), t('Submit to translator and continue'));
$this->assertText($node->title);
$this->drupalPost(NULL, array(), t('Submit to translator'));
// Make sure that we're back on the translate tab.
$this->assertEqual(url('node/' . $node->nid . '/translate', array('absolute' => TRUE)), $this->getUrl());
$this->assertText(t('Test translation created.'));
$this->assertText(t('The translation of @title to @language is finished and can now be reviewed.', array('@title' => $node->title, '@language' => t('Spanish'))));
// Review.
$this->clickLink(t('Needs review'));
// @todo Review job throuh the UI.
$items = tmgmt_job_item_load_latest('node', 'node', $node->nid, 'en');
$items['de']->acceptTranslation();
$items['es']->acceptTranslation();
// Translated nodes should now be listed and be clickable.
$this->drupalGet('node/' . $node->nid . '/translate');
$this->clickLink('de_' . $node->title);
// Translated nodes should now be listed and be clickable.
$this->drupalGet('node/' . $node->nid . '/translate');
$this->clickLink('es_' . $node->title);
}
/**
* Test the translate tab for a single checkout.
*/
function testTranslateTabAutomatedCheckout() {
// Hide settings on the test translator.
$default_translator = tmgmt_translator_load('test_translator');
$default_translator->settings = array(
'expose_settings' => FALSE,
);
$default_translator->save();
// Create a user that is allowed to translate nodes.
$translater = $this->drupalCreateUser(array('translate content', 'create translation jobs', 'submit translation jobs', 'accept translation jobs'));
$this->drupalLogin($translater);
// Create an english source node.
$node = $this->drupalCreateNode(array('type' => 'page', 'language' => 'en', 'body' => array('en' => array(array()))));
// Go to the translate tab.
$this->drupalGet('node/' . $node->nid);
$this->clickLink('Translate');
// Assert some basic strings on that page.
$this->assertText(t('Translations of @title', array('@title' => $node->title)));
$this->assertText(t('Pending Translations'));
// Request a translation for german.
$edit = array(
'languages[de]' => TRUE,
);
$this->drupalPost(NULL, $edit, t('Request translation'));
// Verify that we are on the translate tab.
$this->assertNoText(t('One job needs to be checked out.'));
// Make sure that we're back on the translate tab.
$this->assertEqual(url('node/' . $node->nid . '/translate', array('absolute' => TRUE)), $this->getUrl());
$this->assertText(t('Test translation created.'));
$this->assertText(t('The translation of @title to @language is finished and can now be reviewed.', array('@title' => $node->title, '@language' => t('German'))));
// Review.
$this->clickLink(t('Needs review'));
// @todo Review job throuh the UI.
$items = tmgmt_job_item_load_latest('node', 'node', $node->nid, 'en');
$items['de']->acceptTranslation();
// German node should now be listed and be clickable.
$this->drupalGet('node/' . $node->nid . '/translate');
$this->clickLink('de_' . $node->title);
}
/**
* Test the translate tab for a single checkout.
*/
function testTranslateTabDisabledQuickCheckout() {
variable_set('tmgmt_quick_checkout', FALSE);
// Hide settings on the test translator.
$default_translator = tmgmt_translator_load('test_translator');
$default_translator->settings = array(
'expose_settings' => FALSE,
);
$default_translator->save();
// Create a user that is allowed to translate nodes.
$translater = $this->drupalCreateUser(array('translate content', 'create translation jobs', 'submit translation jobs', 'accept translation jobs'));
$this->drupalLogin($translater);
// Create an english source node.
$node = $this->drupalCreateNode(array('type' => 'page', 'language' => 'en', 'body' => array('en' => array(array()))));
// Go to the translate tab.
$this->drupalGet('node/' . $node->nid);
$this->clickLink('Translate');
// Assert some basic strings on that page.
$this->assertText(t('Translations of @title', array('@title' => $node->title)));
$this->assertText(t('Pending Translations'));
// Request a translation for german.
$edit = array(
'languages[de]' => TRUE,
);
$this->drupalPost(NULL, $edit, t('Request translation'));
// Verify that we are on the translate tab.
$this->assertText(t('One job needs to be checked out.'));
$this->assertText($node->title);
// Submit.
$this->drupalPost(NULL, array(), t('Submit to translator'));
// Make sure that we're back on the translate tab.
$this->assertEqual(url('node/' . $node->nid . '/translate', array('absolute' => TRUE)), $this->getUrl());
$this->assertText(t('Test translation created.'));
$this->assertText(t('The translation of @title to @language is finished and can now be reviewed.', array('@title' => $node->title, '@language' => t('German'))));
// Review.
$this->clickLink(t('Needs review'));
// @todo Review job throuh the UI.
$items = tmgmt_job_item_load_latest('node', 'node', $node->nid, 'en');
$items['de']->acceptTranslation();
// German node should now be listed and be clickable.
$this->drupalGet('node/' . $node->nid . '/translate');
$this->clickLink('de_' . $node->title);
}
/**
* Test the node source specific cart functionality.
*/
function testCart() {
$nodes = array();
for ($i = 0; $i < 4; $i++) {
$nodes[] = $this->createNode('page');
}
$this->loginAsAdmin(array_merge($this->translator_permissions, array('translate content')));
// Test the source overview.
$this->drupalPost('admin/tmgmt/sources/node', array(
'views_bulk_operations[0]' => TRUE,
'views_bulk_operations[1]' => TRUE,
), t('Add to cart'));
$this->drupalGet('admin/tmgmt/cart');
$this->assertText($nodes[0]->title);
$this->assertText($nodes[1]->title);
// Test the translate tab.
$this->drupalGet('node/' . $nodes[3]->nid . '/translate');
$this->assertRaw(t('There are @count items in the translation cart.',
array('@count' => 2, '@url' => url('admin/tmgmt/cart'))));
$this->drupalPost(NULL, array(), t('Add to cart'));
$this->assertRaw(t('@count content source was added into the cart.', array('@count' => 1, '@url' => url('admin/tmgmt/cart'))));
$this->assertRaw(t('There are @count items in the translation cart including the current item.',
array('@count' => 3, '@url' => url('admin/tmgmt/cart'))));
}
}