예제 #1
0
 /**
  * Test the basic translation workflow.
  */
 public function testBasicWorkflow()
 {
     $translator = Translator::load('local');
     /** @var FilterFormat $basic_html_format */
     $basic_html_format = FilterFormat::create(array('format' => 'basic_html', 'name' => 'Basic HTML'));
     $basic_html_format->save();
     // Create a job and request a local translation.
     $this->loginAsTranslator();
     $job = $this->createJob();
     $job->translator = $translator->id();
     $job->addItem('test_source', 'test', '1');
     \Drupal::state()->set('tmgmt.test_source_data', ['dummy' => ['deep_nesting' => ['#text' => file_get_contents(drupal_get_path('module', 'tmgmt') . '/tests/testing_html/sample.html'), '#label' => 'Label for job item with type test and id 2.', '#translate' => TRUE, '#format' => 'basic_html']], 'second' => ['#text' => 'second text', '#label' => 'Second label', '#translate' => TRUE], 'third' => ['#text' => 'third text', '#label' => 'Third label', '#translate' => TRUE]]);
     $job->addItem('test_source', 'test', '2');
     $job->save();
     // Make sure that the checkout page works as expected when there are no
     // roles.
     $this->drupalGet($job->toUrl());
     $this->assertText(t('@translator can not translate from @source to @target.', array('@translator' => 'Drupal user', '@source' => 'English', '@target' => 'German')));
     $xpath = $this->xpath('//*[@id="edit-translator"]')[0];
     $this->assertEqual($xpath->option[0], 'Drupal user (unsupported)');
     $this->assignee = $this->drupalCreateUser(array_merge($this->localTranslatorPermissions, [$basic_html_format->getPermissionName()]));
     // The same when there is a single role.
     $this->drupalGet($job->toUrl());
     $this->assertText(t('@translator can not translate from @source to @target.', array('@translator' => 'Drupal user', '@source' => 'English', '@target' => 'German')));
     // Create another local translator with the required abilities.
     $other_assignee_same = $this->drupalCreateUser($this->localTranslatorPermissions);
     // And test again with two roles but still no abilities.
     $this->drupalGet($job->toUrl());
     $this->assertText(t('@translator can not translate from @source to @target.', array('@translator' => 'Drupal user', '@source' => 'English', '@target' => 'German')));
     $this->drupalLogin($other_assignee_same);
     // Configure language abilities.
     $edit = array('tmgmt_translation_skills[0][language_from]' => 'en', 'tmgmt_translation_skills[0][language_to]' => 'de');
     $this->drupalPostForm('user/' . $other_assignee_same->id() . '/edit', $edit, t('Save'));
     // Check that the user is not listed in the translator selection form.
     $this->loginAsAdmin();
     $this->drupalGet($job->toUrl());
     $xpath = $this->xpath('//*[@id="edit-translator"]')[0];
     $this->assertEqual($xpath->option[0], 'Drupal user');
     $this->assertText(t('Assign job to'));
     $this->assertText($other_assignee_same->getUsername());
     $this->assertNoText($this->assignee->getUsername());
     $this->drupalLogin($this->assignee);
     // Configure language abilities.
     $edit = array('tmgmt_translation_skills[0][language_from]' => 'en', 'tmgmt_translation_skills[0][language_to]' => 'de');
     $this->drupalPostForm('user/' . $this->assignee->id() . '/edit', $edit, t('Save'));
     // Check that the translator is now listed.
     $this->loginAsAdmin();
     $this->drupalGet($job->toUrl());
     $this->assertText($this->assignee->getUsername());
     // Test assign task while submitting job.
     $job_comment = 'Dummy job comment';
     $edit = ['settings[translator]' => $this->assignee->id(), 'settings[job_comment]' => $job_comment];
     $this->drupalPostForm(NULL, $edit, t('Submit to provider'));
     $this->drupalLogin($this->assignee);
     $this->drupalGet('translate/pending');
     $this->assertText($job->label());
     $this->loginAsAdmin($this->localManagerPermissions);
     $this->drupalGet('manage-translate/assigned');
     $this->assertNoLink(t('Delete'));
     $this->clickLink(t('Unassign'));
     $this->drupalPostForm(NULL, [], t('Unassign'));
     // Test for job comment in the job checkout info pane.
     $this->drupalGet($job->toUrl());
     $this->assertText($job_comment);
     $this->drupalLogin($this->assignee);
     // Create a second local translator with different language abilities,
     // make sure that he does not see the task.
     $other_translator = $this->drupalCreateUser($this->localTranslatorPermissions);
     $this->drupalLogin($other_translator);
     // Configure language abilities.
     $edit = array('tmgmt_translation_skills[0][language_from]' => 'de', 'tmgmt_translation_skills[0][language_to]' => 'en');
     $this->drupalPostForm('user/' . $other_translator->id() . '/edit', $edit, t('Save'));
     $this->drupalGet('translate');
     $this->assertNoText($job->label());
     $this->drupalLogin($this->assignee);
     // Check the translate overview.
     $this->drupalGet('translate');
     $this->assertText($job->label());
     // @todo: Fails, encoding problem?
     // $this->assertText(t('@from => @to', array('@from' => 'en', '@to' => 'de')));
     // Test LocalTaskForm.
     $this->clickLink('View');
     $this->assertText('Unassigned');
     $xpath = $this->xpath('//*[@id="edit-status"]');
     $this->assertTrue(empty($xpath));
     $this->loginAsAdmin($this->localManagerPermissions);
     $this->drupalGet('translate');
     $this->clickLink('View');
     $xpath = $this->xpath('//*[@id="edit-tuid"]');
     $this->assertFalse(empty($xpath));
     $edit = array('tuid' => $this->assignee->id());
     $this->drupalPostForm(NULL, $edit, t('Save task'));
     $this->assertText(t('Assigned to user @assignee.', ['@assignee' => $this->assignee->getDisplayName()]));
     $this->drupalGet('manage-translate/assigned');
     $this->clickLink('View');
     $edit = array('tuid' => 0);
     $this->drupalPostForm(NULL, $edit, t('Save task'));
     $this->drupalLogin($this->assignee);
     $this->drupalGet('translate');
     // Assign to action not working yet.
     $edit = array('tmgmt_local_task_bulk_form[0]' => TRUE, 'action' => 'tmgmt_local_task_assign_to_me');
     $this->drupalPostForm(NULL, $edit, t('Apply'));
     $this->assertText(t('Assign to me was applied to 1 item.'));
     // Unassign again.
     $edit = array('tmgmt_local_task_bulk_form[0]' => TRUE, 'action' => 'tmgmt_local_task_unassign_multiple');
     $this->drupalPostForm(NULL, $edit, t('Apply'));
     $this->assertText(t('Unassign was applied to 1 item.'));
     // Now test the assign link.
     // @todo Action should not redirect to mine.
     $this->drupalGet('translate');
     $this->clickLink(t('Assign to me'));
     $this->assertText(t('The task has been assigned to you.'));
     // Assert created local task and task items.
     $this->drupalGet('translate/pending');
     $this->clickLink(t('View'));
     $this->assertTrue(preg_match('|translate/(\\d+)|', $this->getUrl(), $matches), 'Task found');
     /** @var \Drupal\tmgmt_local\Entity\LocalTask $task */
     $task = \Drupal::entityTypeManager()->getStorage('tmgmt_local_task')->load($matches[1]);
     $this->assertTrue($task->isPending());
     $items = $task->getItems();
     /** @var \Drupal\tmgmt_local\Entity\LocalTaskItem $first_task_item */
     $first_task_item = reset($items);
     $this->assertTrue($first_task_item->isPending());
     // Log in with the translator with the same abilities, make sure that he
     // does not see the assigned task.
     $this->drupalLogin($other_assignee_same);
     $this->drupalGet('translate');
     $this->assertNoText($job->label());
     $this->drupalGet('translate/items/' . $first_task_item->id());
     $this->assertResponse(403);
     $this->drupalLogin($this->assignee);
     // Translate the task.
     $this->drupalGet('translate/' . $task->id());
     $this->assertText('test_source:test:1');
     $this->assertText('test_source:test:2');
     // Translate the first item.
     $this->clickLink(t('Translate'));
     // Assert the breadcrumb.
     $this->assertLink(t('Home'));
     $this->assertLink(t('Local Tasks'));
     $this->assertText($job->label());
     // Assert the header.
     $this->assertLink($first_task_item->getJobItem()->getSourceLabel());
     $this->assertText($first_task_item->getJobItem()->getSourceType());
     $this->assertText($first_task_item->getJobItem()->getJob()->getSourceLanguage()->getName());
     $this->assertText($first_task_item->getJobItem()->getJob()->getTargetLanguage()->getName());
     $this->assertText(\Drupal::service('date.formatter')->format($first_task_item->getChangedTime()));
     $this->assertText($first_task_item->getStatus());
     $this->assertLink($first_task_item->getTask()->label());
     $this->assertText(t('Dummy'));
     // Check if Save as completed button is displayed.
     $elements = $this->xpath('//*[@id="edit-save-as-completed"]');
     $this->assertTrue(!empty($elements), "'Save as completed' button appears.");
     // Job comment is present in the translate tool as well.
     $this->assertText($job_comment);
     $this->assertText('test_source:test:1');
     // Try to complete a translation when translations are missing.
     $edit = array('dummy|deep_nesting[translation]' => '');
     $this->drupalPostForm(NULL, $edit, t('Save as completed'));
     $this->assertText(t('Missing translation.'));
     $edit = array('dummy|deep_nesting[translation]' => $translation1 = 'German translation of source 1');
     $this->drupalPostForm(NULL, $edit, t('Save as completed'));
     $this->assertRaw('tmgmt/icons/gray-check.svg" title="Translated"');
     $this->assertText('The translation for ' . $first_task_item->label() . ' has been saved as completed.');
     // Check that the source has not being modified.
     $this->clickLink(t('View'));
     /** @var \Drupal\tmgmt\JobItemInterface $job_item */
     $job_items = $job->getItems(['tjiid' => 1]);
     $job_item = reset($job_items);
     $source = $job_item->getData(['dummy', 'deep_nesting', '#text']);
     $this->assertText($source);
     // Review and accept the first item.
     \Drupal::entityTypeManager()->getStorage('tmgmt_job_item')->resetCache();
     drupal_static_reset('tmgmt_local_task_statistics_load');
     /** @var \Drupal\tmgmt\JobItemInterface $item1 */
     $item1 = JobItem::load(1);
     // The first item should be available for review.
     $this->assertTrue($item1->isNeedsReview(), 'Job item 1 needs review.');
     $item1->acceptTranslation();
     // The first item should be accepted now, the second still in progress.
     \Drupal::entityTypeManager()->getStorage('tmgmt_local_task_item')->resetCache();
     $this->drupalGet('translate/1');
     // Checking if the 'Save as completed' button is not displayed.
     $this->drupalGet('translate/items/1');
     $elements = $this->xpath('//*[@id="edit-save-as-completed"]');
     $this->assertTrue(empty($elements), "'Save as completed' button does not appear.");
     // Checking if the item status is not displayed.
     $this->assertNoRaw('title="Finish"');
     $this->assertNoRaw('title="Reject"');
     // We can go back to the Task from the item.
     $this->drupalGet('translate/items/1');
     $this->clickLink($task->label());
     // Let's check the task status.
     /** @var \Drupal\tmgmt_local\Entity\LocalTask $task */
     $task = entity_load('tmgmt_local_task', $task->id(), TRUE);
     $this->assertTrue($task->isPending());
     /** @var \Drupal\tmgmt_local\Entity\LocalTaskItem $second_task_item */
     list($first_task_item, $second_task_item) = array_values($task->getItems());
     $this->assertTrue($first_task_item->isClosed());
     // Assert that translator can provide translations for a "Dummy" field. An
     // empty text field should be displayed as translator does not have a
     // permission to use "full_html" text format.
     $second_task_item->updateData('dummy|deep_nesting', ['#format' => 'full_html']);
     $second_task_item->save();
     $this->clickLink(t('Translate'));
     $this->assertFieldByName('dummy|deep_nesting[translation]');
     $this->assertRaw('Save as completed" class="button button--primary js-form-submit form-submit"');
     $translation_field = $this->xpath('//*[@id="edit-dummydeep-nesting-translation"]')[0];
     $this->assertEqual($translation_field, '');
     // Translate the second item but do not mark as translated it yet.
     $second_task_item->updateData('dummy|deep_nesting', ['#format' => 'basic_html']);
     $second_task_item->save();
     $this->drupalGet('translate/items/' . $second_task_item->id());
     $xpath = $this->xpath('//*[@id="edit-dummydeep-nesting-translation-format-guidelines"]/div')[0];
     $this->assertEqual($xpath[0]->h4[0], t('Basic HTML'));
     // Assert the order of the displayed elements.
     $translate_elements = $this->xpath('//*[@id="edit-translation"]/table');
     $ids = [];
     foreach ($translate_elements as $translate_element) {
         $ids[] = (string) $translate_element['id'];
     }
     $this->assertEqual($ids[0], 'tmgmt-local-element-dummy-deep-nesting');
     $this->assertEqual($ids[1], 'tmgmt-local-element-second');
     $this->assertEqual($ids[2], 'tmgmt-local-element-third');
     $edit = array('dummy|deep_nesting[translation][value]' => $translation2 = 'German translation of source 2');
     $this->drupalPostForm(NULL, $edit, t('Save'));
     $this->assertText('The translation for ' . $second_task_item->label() . ' has been saved.');
     drupal_static_reset('tmgmt_local_task_statistics_load');
     /** @var \Drupal\tmgmt_local\Entity\LocalTask $task */
     $task = entity_load('tmgmt_local_task', $task->id(), TRUE);
     $this->assertTrue($task->isPending());
     // Mark the data item as translated but don't save the task item as
     // completed.
     $this->clickLink(t('Translate'));
     $this->drupalPostAjaxForm(NULL, [], 'finish-dummy|deep_nesting');
     $this->assertRaw('name="reject-dummy|deep_nesting"', "'✗' button appears.");
     $this->drupalGet('translate/' . $task->id());
     \Drupal::entityTypeManager()->getStorage('tmgmt_local_task_item')->resetCache();
     drupal_static_reset('tmgmt_local_task_statistics_load');
     /** @var \Drupal\tmgmt_local\Entity\LocalTask $task */
     $task = entity_load('tmgmt_local_task', $task->id(), TRUE);
     $this->assertTrue($task->isPending());
     list($first_task_item, $second_task_item) = array_values($task->getItems());
     $this->assertTrue($first_task_item->isClosed());
     $this->assertTrue($second_task_item->isPending());
     // Check the job data.
     \Drupal::entityTypeManager()->getStorage('tmgmt_job_item')->resetCache();
     /** @var \Drupal\tmgmt\JobInterface $job */
     $job = Job::load($job->id());
     /** @var \Drupal\tmgmt\JobItemInterface $item2 */
     list($item1, $item2) = array_values($job->getItems());
     $this->assertTrue($item1->isAccepted(), 'Job item 1 is accepted.');
     // The first item should be active.
     $this->assertTrue($item2->isActive(), 'Job item 2 is still active.');
     // Check the overview page, the task should still show in progress.
     $this->drupalGet('translate');
     $this->assertText(t('Pending'));
     // Mark the second item as completed now.
     $this->clickLink(t('View'));
     $this->clickLink(t('Translate'));
     $remaining_translations = ['second[translation]' => 'Third translation', 'third[translation]' => 'Third translation'];
     $this->drupalPostForm(NULL, $remaining_translations, t('Save as completed'));
     $this->assertText('The translation for ' . $second_task_item->label() . ' has been saved as completed.');
     $this->clickLink('View');
     // Review and accept the second item.
     \Drupal::entityTypeManager()->getStorage('tmgmt_job_item')->resetCache();
     drupal_static_reset('tmgmt_local_task_statistics_load');
     $item1 = JobItem::load(2);
     $item1->acceptTranslation();
     // Refresh the page.
     $this->drupalGet('translate');
     // We should have been redirect back to the overview, the task should be
     // completed now.
     $this->assertNoText($task->getJob()->label());
     $this->clickLink(t('Closed'));
     $this->assertText($task->getJob()->label());
     $this->assertText(t('Completed'));
     \Drupal::entityTypeManager()->getStorage('tmgmt_local_task_item')->resetCache();
     $task = tmgmt_local_task_load($task->id());
     $this->assertTrue($task->isClosed());
     list($first_task_item, $second_task_item) = array_values($task->getItems());
     $this->assertTrue($first_task_item->isClosed());
     $this->assertTrue($second_task_item->isClosed());
     \Drupal::entityTypeManager()->getStorage('tmgmt_job_item')->resetCache();
     $job = Job::load($job->id());
     list($item1, $item2) = array_values($job->getItems());
     // Job was accepted and finished automatically due to the default approve
     // setting.
     $this->assertTrue($job->isFinished());
     $this->assertEqual($item1->getData(array('dummy', 'deep_nesting', '#translation', '#text')), $translation1);
     $this->assertEqual($item2->getData(array('dummy', 'deep_nesting', '#translation', '#text')), $translation2);
     // Delete the job, make sure that the corresponding task and task items were
     // deleted.
     $job->delete();
     $this->assertFalse(tmgmt_local_task_item_load($task->id()));
     $this->assertFalse($task->getItems());
 }
예제 #2
0
 /**
  * {@inheritdoc}
  */
 public function submitForm(array &$form, FormStateInterface $form_state)
 {
     /** @var User $assignee */
     $assignee = User::load($form_state->getValue('tuid'));
     $how_many = 0;
     foreach ($form_state->get('tasks') as $task_id) {
         $task = tmgmt_local_task_load($task_id);
         if ($task) {
             $task->assign($assignee);
             $task->save();
             ++$how_many;
         }
     }
     drupal_set_message(t('Assigned @how_many to user @assignee_name.', array('@how_many' => $how_many, '@assignee_name' => $assignee->getAccountName())));
     $view = Views::getView('tmgmt_local_task_overview');
     $view->initDisplay();
     $form_state->setRedirect($view->getUrl()->getRouteName());
 }