function TranslatorTest::testTranslatorHandling

Tests creating and deleting a translator.

File

tests/src/Functional/TranslatorTest.php, line 37

Class

TranslatorTest
Verifies functionality of translator handling

Namespace

Drupal\Tests\tmgmt\Functional

Code

function testTranslatorHandling() {

  // Create a translator for later deletion.
  $translator = parent::createTranslator();

  // Does the translator exist in the listing?
  $this
    ->drupalGet('admin/tmgmt/translators');
  $this
    ->assertSession()
    ->pageTextContains($translator
    ->label());
  $this
    ->assertCount(2, $this
    ->xpath('//tbody/tr'));

  // Create job, attach to the translator and activate.
  $job = $this
    ->createJob();
  $job->settings = array();
  $job
    ->save();
  $job
    ->setState(Job::STATE_ACTIVE);
  $item = $job
    ->addItem('test_source', 'test', 1);
  $this
    ->drupalGet('admin/tmgmt/items/' . $item
    ->id());
  $this
    ->assertSession()
    ->pageTextContains('(Undefined)');
  $job->translator = $translator;
  $job
    ->save();

  // Try to delete the translator, should fail because of active job.
  $delete_url = '/admin/tmgmt/translators/manage/' . $translator
    ->id() . '/delete';
  $this
    ->drupalGet($delete_url);
  $this
    ->assertSession()
    ->statusCodeEquals(403);

  // Create a continuous job.
  $continuous = $this
    ->createJob('en', 'de', 1, [
    'label' => 'Continuous',
    'job_type' => Job::TYPE_CONTINUOUS,
  ]);
  $continuous->translator = $translator;
  $continuous
    ->save();

  // Delete a provider using an API call and assert that active job and its
  // job item used by deleted translator were aborted.
  $translator
    ->delete();

  /** @var \Drupal\tmgmt\JobInterface $job */
  $job = Job::load($job
    ->id());
  $continuous = Job::load($continuous
    ->id());
  $this
    ->assertEquals(Job::STATE_ABORTED, $job
    ->getState());
  $item = $job
    ->getMostRecentItem('test_source', 'test', 1);
  $this
    ->assertEquals(JobItem::STATE_ABORTED, $item
    ->getState());
  $this
    ->assertEquals(Job::STATE_ABORTED, $continuous
    ->getState());

  // Delete a finished job.
  $translator = parent::createTranslator();
  $job = $this
    ->createJob();
  $job->translator = $translator;
  $item = $job
    ->addItem('test_source', 'test', 2);
  $job
    ->setState(Job::STATE_FINISHED);
  $job
    ->set('label', $job
    ->label());
  $job
    ->save();
  $delete_url = '/admin/tmgmt/translators/manage/' . $translator
    ->id() . '/delete';
  $this
    ->drupalGet($delete_url);
  $this
    ->submitForm([], 'Delete');
  $this
    ->assertSession()
    ->pageTextContains('Add provider');

  // Check if the list of translators has 1 row.
  $this
    ->assertCount(1, $this
    ->xpath('//tbody/tr'));
  $this
    ->assertSession()
    ->pageTextContains(t('@label has been deleted.', array(
    '@label' => $translator
      ->label(),
  )));

  // Check if the clone action works.
  $this
    ->clickLink('Clone');
  $edit = array(
    'name' => $translator
      ->id() . '_clone',
  );
  $this
    ->submitForm($edit, 'Save');

  // Check if the list of translators has 2 row.
  $this
    ->assertCount(2, $this
    ->xpath('//tbody/tr'));
  $this
    ->assertSession()
    ->pageTextContains('configuration has been created');

  // Assert that the job works and there is a text saying that the translator
  // is missing.
  $this
    ->drupalGet('admin/tmgmt/jobs/' . $job
    ->id());
  $this
    ->assertSession()
    ->pageTextContains('The job has no provider assigned.');

  // Assert that also the job items are working.
  $this
    ->drupalGet('admin/tmgmt/items/' . $item
    ->id());
  $this
    ->assertSession()
    ->pageTextContains('(Missing)');

  // Testing the translators form with no installed translator plugins.
  // Uninstall the test module (which provides a translator).
  \Drupal::service('module_installer')
    ->uninstall(array(
    'tmgmt_test',
  ), FALSE);

  // Assert that job deletion works correctly.
  \Drupal::service('module_installer')
    ->install(array(
    'tmgmt_file',
  ), FALSE);
  $this
    ->drupalGet($job
    ->toUrl('delete-form'));
  $this
    ->submitForm([], 'Delete');
  $this
    ->assertSession()
    ->statusCodeEquals(200);
  $this
    ->assertSession()
    ->pageTextContains(t('The translation job @value has been deleted.', array(
    '@value' => $job
      ->label(),
  )));
  \Drupal::service('module_installer')
    ->uninstall(array(
    'tmgmt_file',
  ), FALSE);

  // Get the overview.
  $this
    ->drupalGet('admin/tmgmt/translators');
  $this
    ->assertSession()
    ->pageTextNotContains('Add provider');
  $this
    ->assertSession()
    ->pageTextContains('There are no provider plugins available. Please install a provider plugin.');
}