Error message

  • Warning: count(): Parameter must be an array or an object that implements Countable in _api_make_match_member_link() (line 1230 of /home/projects/api/www/sites/all/modules/api/api.formatting.inc).
  • Warning: count(): Parameter must be an array or an object that implements Countable in _api_make_match_member_link() (line 1230 of /home/projects/api/www/sites/all/modules/api/api.formatting.inc).

class ConfigSourceListTest

Tests the user interface for entity translation lists.

@group tmgmt

Hierarchy

Expanded class hierarchy of ConfigSourceListTest

File

sources/tmgmt_config/tests/src/Functional/ConfigSourceListTest.php, line 15

Namespace

Drupal\Tests\tmgmt_config\Functional
View source
class ConfigSourceListTest extends TMGMTTestBase {
  use TmgmtEntityTestTrait;

  /**
   * Modules to enable.
   *
   * @var array
   */
  protected static $modules = array(
    'tmgmt_config',
    'tmgmt_content',
    'config_translation',
    'views',
    'views_ui',
    'field_ui',
  );
  protected $nodes = array();
  function setUp() : void {
    parent::setUp();
    $this
      ->loginAsAdmin();
    $this
      ->loginAsTranslator(array(
      'translate configuration',
    ));
    $this
      ->addLanguage('de');
    $this
      ->addLanguage('it');
    $this
      ->drupalCreateContentType(array(
      'type' => 'article',
      'name' => 'Article',
    ));
    $this
      ->drupalCreateContentType(array(
      'type' => 'page',
      'name' => 'Page',
    ));
    $this
      ->drupalCreateContentType(array(
      'type' => 'simplenews_issue',
      'name' => 'Newsletter issue',
    ));
  }
  function testNodeTypeSubmissions() {

    // Simple submission.
    $this
      ->drupalGet('admin/tmgmt/sources/config/node_type');
    $edit = array(
      'items[node.type.article]' => TRUE,
    );
    $this
      ->submitForm($edit, 'Request translation');

    // Verify that we are on the translate tab.
    $this
      ->assertSession()
      ->pageTextContains('One job needs to be checked out.');
    $this
      ->assertSession()
      ->pageTextContains('Article content type (English to ?, Unprocessed)');

    // Submit.
    $this
      ->submitForm([], 'Submit to provider');

    // Make sure that we're back on the originally defined destination URL.
    $this
      ->assertSession()
      ->addressEquals('admin/tmgmt/sources/config/node_type');
    $this
      ->assertSession()
      ->pageTextContains('Test translation created.');
    $this
      ->assertSession()
      ->pageTextContains('The translation of Article content type to German is finished and can now be reviewed.');

    // Submission of two different entity types.
    $this
      ->drupalGet('admin/tmgmt/sources/config/node_type');
    $edit = array(
      'items[node.type.article]' => TRUE,
      'items[node.type.page]' => TRUE,
    );
    $this
      ->submitForm($edit, 'Request translation');

    // Verify that we are on the translate tab.
    // This is still one job, unlike when selecting more languages.
    $this
      ->assertSession()
      ->pageTextContains('One job needs to be checked out.');
    $this
      ->assertSession()
      ->pageTextContains('Article content type and 1 more (English to ?, Unprocessed)');
    $this
      ->assertSession()
      ->pageTextContains('1 item conflicts with pending item and will be dropped on submission. Conflicting item: Article content type.');

    // Submit.
    $this
      ->submitForm([], 'Submit to provider');

    // Make sure that we're back on the originally defined destination URL.
    $this
      ->assertSession()
      ->addressEquals('admin/tmgmt/sources/config/node_type');
    $this
      ->assertSession()
      ->pageTextContains('Test translation created.');
    $this
      ->assertSession()
      ->pageTextNotContains('The translation of Article content type to German is finished and can now be reviewed.');
    $this
      ->assertSession()
      ->pageTextContains('The translation of Page content type to German is finished and can now be reviewed.');
  }
  function testViewTranslation() {

    // Check if we have appropriate message in case there are no entity
    // translatable content types.
    $this
      ->drupalGet('admin/tmgmt/sources/config/view');
    $this
      ->assertSession()
      ->pageTextContains('View overview (Config Entity)');

    // Request a translation for archive.
    $edit = array(
      'items[views.view.archive]' => TRUE,
    );
    $this
      ->submitForm($edit, 'Request translation');

    // Verify that we are on the translate tab.
    $this
      ->assertSession()
      ->pageTextContains('One job needs to be checked out.');
    $this
      ->assertSession()
      ->pageTextContains('Archive view (English to ?, Unprocessed)');

    // Submit.
    $this
      ->submitForm([], 'Submit to provider');

    // Make sure that we're back on the originally defined destination URL.
    $this
      ->assertSession()
      ->addressEquals('admin/tmgmt/sources/config/view');
    $this
      ->assertSession()
      ->pageTextContains('Test translation created.');
    $this
      ->assertSession()
      ->pageTextContains('The translation of Archive view to German is finished and can now be reviewed.');

    // Request a translation for more archive, recent comments, content and job
    // overview.
    $edit = array(
      'items[views.view.archive]' => TRUE,
      'items[views.view.content_recent]' => TRUE,
      'items[views.view.content]' => TRUE,
      'items[views.view.tmgmt_job_overview]' => TRUE,
    );
    $this
      ->submitForm($edit, 'Request translation');

    // Verify that we are on the translate tab.
    $this
      ->assertSession()
      ->pageTextContains('One job needs to be checked out.');
    $this
      ->assertSession()
      ->pageTextContains('Archive view and 3 more (English to ?, Unprocessed)');
    $this
      ->assertSession()
      ->pageTextContains('1 item conflicts with pending item and will be dropped on submission. Conflicting item: Archive view.');

    // Submit.
    $this
      ->submitForm([], 'Submit to provider');

    // Make sure that we're back on the originally defined destination URL.
    $this
      ->assertSession()
      ->addressEquals('admin/tmgmt/sources/config/view');
    $this
      ->assertSession()
      ->pageTextContains('Test translation created.');
    $this
      ->assertSession()
      ->pageTextNotContains('The translation of Archive view to German is finished and can now be reviewed.');
    $this
      ->assertSession()
      ->pageTextContains('The translation of Recent content view to German is finished and can now be reviewed.');
    $this
      ->assertSession()
      ->pageTextContains('The translation of Content view to German is finished and can now be reviewed.');
    $this
      ->assertSession()
      ->pageTextContains('The translation of Job overview view to German is finished and can now be reviewed.');

    // Make sure that the Cart page works.
    $edit = array(
      'items[views.view.tmgmt_job_items]' => TRUE,
    );
    $this
      ->submitForm($edit, 'Add to cart');
    $this
      ->clickLink('cart');

    // Verify that we are on the Cart page.
    $cart_tab_active = $this
      ->xpath('//ul[@class="tabs primary"]/li[@class="is-active"]/a')[0];
    $this
      ->assertStringContainsString('Cart', $cart_tab_active
      ->getText());
    $this
      ->assertSession()
      ->titleEquals('Cart | Drupal');
    $this
      ->assertSession()
      ->pageTextContains('Request translation');
  }
  function testNodeTypeFilter() {
    $this
      ->drupalGet('admin/tmgmt/sources/config/node_type');
    $this
      ->assertSession()
      ->pageTextContains('Content type overview (Config Entity)');

    // Simple filtering.
    $this
      ->drupalGet('admin/tmgmt/sources/config/node_type');
    $filters = array(
      'search[name]' => '',
      'search[langcode]' => '',
      'search[target_language]' => '',
    );
    $this
      ->submitForm($filters, 'Search');

    // Random text in the name label.
    $this
      ->drupalGet('admin/tmgmt/sources/config/node_type');
    $filters = array(
      'search[name]' => $this
        ->randomMachineName(5),
      'search[langcode]' => '',
      'search[target_language]' => '',
    );
    $this
      ->submitForm($filters, 'Search');
    $this
      ->assertSession()
      ->pageTextContains('No source items matching given criteria have been found.');

    // Searching for article.
    $this
      ->drupalGet('admin/tmgmt/sources/config/node_type');
    $filters = array(
      'search[name]' => 'article',
      'search[langcode]' => '',
      'search[target_language]' => '',
    );
    $this
      ->submitForm($filters, 'Search');
    $rows = $this
      ->xpath('//tbody/tr/td[2]/a');
    foreach ($rows as $value) {
      $this
        ->assertEquals('Article', $value
        ->getText());
    }

    // Searching for article, with english source language and italian target language.
    $this
      ->drupalGet('admin/tmgmt/sources/config/node_type');
    $filters = array(
      'search[name]' => 'article',
      'search[langcode]' => 'en',
      'search[target_language]' => 'it',
    );
    $this
      ->submitForm($filters, 'Search');
    $rows = $this
      ->xpath('//tbody/tr/td[2]/a');
    foreach ($rows as $value) {
      $this
        ->assertEquals('Article', $value
        ->getText());
    }

    // Searching by keywords (shorter terms).
    $this
      ->drupalGet('admin/tmgmt/sources/config/node_type');
    $filters = array(
      'search[name]' => 'art',
      'search[langcode]' => 'en',
      'search[target_language]' => 'it',
    );
    $this
      ->submitForm($filters, 'Search');
    $rows = $this
      ->xpath('//tbody/tr/td[2]/a');
    foreach ($rows as $value) {
      $this
        ->assertEquals('Article', $value
        ->getText());
    }
  }

  /**
   * Test for simple configuration translation.
   */
  function testSimpleConfigTranslation() {
    $this
      ->loginAsTranslator(array(
      'translate configuration',
    ));

    // Go to the translate tab.
    $this
      ->drupalGet('admin/tmgmt/sources/config/_simple_config');

    // Assert some basic strings on that page.
    $this
      ->assertSession()
      ->pageTextContains('Simple configuration overview (Config Entity)');

    // Request a translation for Site information settings.
    $edit = array(
      'items[system.site_information_settings]' => TRUE,
    );
    $this
      ->submitForm($edit, 'Request translation');

    // Verify that we are on the translate tab.
    $this
      ->assertSession()
      ->pageTextContains('One job needs to be checked out.');
    $this
      ->assertSession()
      ->pageTextContains('System information (English to ?, Unprocessed)');

    // Submit.
    $this
      ->submitForm([], 'Submit to provider');

    // Make sure that we're back on the originally defined destination URL.
    $this
      ->assertSession()
      ->addressEquals('admin/tmgmt/sources/config/_simple_config');
    $overview_url = Url::fromRoute('tmgmt.source_overview', array(
      'plugin' => 'config',
      'item_type' => '_simple_config',
    ))
      ->toString();

    // Translated languages should now be listed as Needs review.
    $url = JobItem::load(1)
      ->toUrl()
      ->setOption('query', [
      'destination' => $overview_url,
    ])
      ->toString();
    $imgs = $this
      ->xpath('//a[@href=:href]/img', [
      ':href' => $url,
    ]);
    $this
      ->assertEquals('Active job item: Needs review', $imgs[0]
      ->getAttribute('title'));
    $this
      ->assertSession()
      ->pageTextContains('Test translation created.');
    $this
      ->assertSession()
      ->pageTextContains('The translation of System information to German is finished and can now be reviewed.');

    // Verify that the pending translation is shown.
    $review = $this
      ->xpath('//table[@id="edit-items"]/tbody/tr[@class="even"][1]/td[@class="langstatus-de"]/a');
    $destination = $this
      ->getAbsoluteUrl($review[0]
      ->getAttribute('href'));
    $this
      ->drupalGet($destination);
    $this
      ->submitForm([], 'Save');

    // Request a translation for Account settings
    $edit = array(
      'items[entity.user.admin_form]' => TRUE,
    );
    $this
      ->submitForm($edit, 'Request translation');

    // Verify that we are on the checkout page.
    $this
      ->assertSession()
      ->pageTextContains('One job needs to be checked out.');
    $this
      ->assertSession()
      ->pageTextContains('Account settings (English to ?, Unprocessed)');
    $this
      ->submitForm([], 'Submit to provider');

    // Make sure that we're back on the originally defined destination URL.
    $this
      ->assertSession()
      ->addressEquals('admin/tmgmt/sources/config/_simple_config');

    // Translated languages should now be listed as Needs review.
    $links = $this
      ->xpath('//table[@id="edit-items"]/tbody/tr/td/a');
    $this
      ->assertEquals(2, count($links));

    // Save one translation.
    $this
      ->drupalGet('admin/tmgmt/items/1');
    $this
      ->submitForm([], 'Save as completed');

    // Test if the filter works.
    $this
      ->drupalGet('admin/tmgmt/sources/config/_simple_config');
    $filters = array(
      'search[name]' => 'system',
    );
    $this
      ->submitForm($filters, 'Search');

    // Check if the list has 2 rows.
    $this
      ->assertCount(2, $this
      ->xpath('//tbody/tr'));
    $this
      ->drupalGet('admin/tmgmt/sources/config/_simple_config');
    $filters = array(
      'search[target_language]' => 'de',
      'search[target_status]' => 'translated',
    );
    $this
      ->submitForm($filters, 'Search');

    // Just 1 simple configuration was translated.
    $this
      ->assertCount(1, $this
      ->xpath('//tbody/tr'));

    // Filter with name and target_status.
    $this
      ->drupalGet('admin/tmgmt/sources/config/_simple_config');
    $filters = array(
      'search[name]' => 'settings',
      'search[target_language]' => 'de',
      'search[target_status]' => 'untranslated',
    );
    $this
      ->submitForm($filters, 'Search');

    // There is 1 simple configuration untranslated with name 'settings'.
    $this
      ->assertCount(1, $this
      ->xpath('//tbody/tr'));
    $this
      ->drupalGet('admin/tmgmt/sources/config/_simple_config');
    $filters = array(
      'search[name]' => 'sys',
      'search[target_language]' => 'de',
      'search[target_status]' => 'translated',
    );
    $this
      ->submitForm($filters, 'Search');

    // There are 2 simple configurations with name 'sys' but just 1 is translated.
    $this
      ->assertCount(1, $this
      ->xpath('//tbody/tr'));
  }

  /**
   * Test for field configuration translation from source list.
   */
  function testFieldConfigList() {
    $this
      ->drupalGet('admin/tmgmt/sources/config/field_config');

    // Test submission.
    $this
      ->submitForm([
      'items[field.field.node.article.body]' => TRUE,
    ], 'Request translation');
    $this
      ->assertSession()
      ->pageTextContains('One job needs to be checked out.');
    $this
      ->submitForm([], 'Submit to provider');

    // Make sure that we're back on the originally defined destination URL.
    $this
      ->assertSession()
      ->addressEquals('admin/tmgmt/sources/config/field_config');
    $this
      ->assertSession()
      ->pageTextContains('Test translation created.');
    $this
      ->assertSession()
      ->pageTextContains('The translation of Body to German is finished and can now be reviewed.');
  }

}

Members

Namesort descending Modifiers Type Description Overrides
ConfigSourceListTest::$modules protected static property Modules to enable. Overrides TMGMTTestBase::$modules
ConfigSourceListTest::$nodes protected property
ConfigSourceListTest::setUp function Overrides DrupalWebTestCase::setUp() Overrides TMGMTTestBase::setUp
ConfigSourceListTest::testFieldConfigList function Test for field configuration translation from source list.
ConfigSourceListTest::testNodeTypeFilter function
ConfigSourceListTest::testNodeTypeSubmissions function
ConfigSourceListTest::testSimpleConfigTranslation function Test for simple configuration translation.
ConfigSourceListTest::testViewTranslation function
TmgmtEntityTestTrait::$field_names public property
TmgmtEntityTestTrait::attachFields function Creates fields of type text and text_with_summary of different cardinality.
TmgmtEntityTestTrait::createNodeType function Creates node type with several text fields with different cardinality.
TmgmtEntityTestTrait::createTaxonomyTerm function Creates a taxonomy term of a given vocabulary.
TmgmtEntityTestTrait::createTaxonomyVocab function Creates taxonomy vocabulary with custom fields.
TmgmtEntityTestTrait::createTranslatableNode protected function Creates a node of a given bundle.
TMGMTTestBase::$defaultTheme protected property
TMGMTTestBase::$default_translator protected property A default translator using the test translator.
TmgmtTestTrait::$admin_permissions protected property List of permissions used by loginAsAdmin().
TmgmtTestTrait::$admin_user protected property Drupal user object created by loginAsAdmin().
TmgmtTestTrait::$languageWeight protected property The language weight for new languages.
TmgmtTestTrait::$translator_permissions protected property List of permissions used by loginAsTranslator().
TmgmtTestTrait::$translator_user protected property Drupal user object created by loginAsTranslator().
TmgmtTestTrait::addLanguage function Sets the proper environment.
TmgmtTestTrait::assertJobItemLangCodes function Asserts job item language codes.
TmgmtTestTrait::assertTextByXpath protected function Asserts text in the page with an xpath expression.
TmgmtTestTrait::clickLinkWithImageTitle function Clicks on an image link with the provided title attribute.
TmgmtTestTrait::createJob function Creates, saves and returns a translation job.
TmgmtTestTrait::createTranslator function Creates, saves and returns a translator.
TmgmtTestTrait::loginAsAdmin function Will create a user with admin permissions and log it in.
TmgmtTestTrait::loginAsTranslator function Will create a user with translator permissions and log it in.