You are here

tmgmt_node_ui.test in Translation Management Tool 7

File

sources/node/ui/tmgmt_node_ui.test
View source
<?php

/**
 * Basic Node Source UI tests.
 */
class TMGMTNodeSourceUITestCase extends TMGMTEntityTestCaseUtility {
  static function getInfo() {
    return array(
      'name' => '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('&#x2611;');
    $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 <a href="@url">translation cart</a>.', 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 <a href="@url">cart</a>.', array(
      '@count' => 1,
      '@url' => url('admin/tmgmt/cart'),
    )));
    $this
      ->assertRaw(t('There are @count items in the <a href="@url">translation cart</a> including the current item.', array(
      '@count' => 3,
      '@url' => url('admin/tmgmt/cart'),
    )));
  }

}

Classes

Namesort descending Description
TMGMTNodeSourceUITestCase Basic Node Source UI tests.