class ContentTranslationRevisionTranslationDeletionTest in Drupal 10
Same name and namespace in other branches
- 8 core/modules/content_translation/tests/src/Functional/ContentTranslationRevisionTranslationDeletionTest.php \Drupal\Tests\content_translation\Functional\ContentTranslationRevisionTranslationDeletionTest
- 9 core/modules/content_translation/tests/src/Functional/ContentTranslationRevisionTranslationDeletionTest.php \Drupal\Tests\content_translation\Functional\ContentTranslationRevisionTranslationDeletionTest
Tests that revision translation deletion is handled correctly.
@group content_translation
Hierarchy
- class \Drupal\Tests\BrowserTestBase extends \PHPUnit\Framework\TestCase uses \Drupal\Tests\PhpUnitCompatibilityTrait, \Symfony\Bridge\PhpUnit\ExpectDeprecationTrait, FunctionalTestSetupTrait, TestSetupTrait, BlockCreationTrait, ConfigTestTrait, ExtensionListTestTrait, ContentTypeCreationTrait, NodeCreationTrait, RandomGeneratorTrait, TestRequirementsTrait, PhpUnitWarnings, UiHelperTrait, UserCreationTrait, XdebugRequestTrait
- class \Drupal\Tests\content_translation\Functional\ContentTranslationTestBase
- class \Drupal\Tests\content_translation\Functional\ContentTranslationPendingRevisionTestBase uses ContentModerationTestTrait, ContentTypeCreationTrait
- class \Drupal\Tests\content_translation\Functional\ContentTranslationRevisionTranslationDeletionTest
- class \Drupal\Tests\content_translation\Functional\ContentTranslationPendingRevisionTestBase uses ContentModerationTestTrait, ContentTypeCreationTrait
- class \Drupal\Tests\content_translation\Functional\ContentTranslationTestBase
Expanded class hierarchy of ContentTranslationRevisionTranslationDeletionTest
File
- core/
modules/ content_translation/ tests/ src/ Functional/ ContentTranslationRevisionTranslationDeletionTest.php, line 13
Namespace
Drupal\Tests\content_translation\FunctionalView source
class ContentTranslationRevisionTranslationDeletionTest extends ContentTranslationPendingRevisionTestBase {
/**
* {@inheritdoc}
*/
protected $defaultTheme = 'stark';
/**
* {@inheritdoc}
*/
protected function setUp() : void {
parent::setUp();
$this
->enableContentModeration();
}
/**
* Tests that translation overview handles pending revisions correctly.
*/
public function testOverview() {
$index = 1;
$accounts = [
$this->rootUser,
$this->editor,
$this->translator,
];
foreach ($accounts as $account) {
$this->currentAccount = $account;
$this
->doTestOverview($index++);
}
}
/**
* Performs a test run.
*
* @param int $index
* The test run index.
*/
public function doTestOverview($index) {
$this
->drupalLogin($this->currentAccount);
// Create a test node.
$values = [
'title' => "Test {$index}.1 EN",
'moderation_state' => 'published',
];
$id = $this
->createEntity($values, 'en');
/** @var \Drupal\Core\Entity\ContentEntityInterface $entity */
$entity = $this->storage
->load($id);
// Add a draft translation and check that it is available only in the latest
// revision.
$add_translation_url = Url::fromRoute("entity.{$this->entityTypeId}.content_translation_add", [
$entity
->getEntityTypeId() => $id,
'source' => 'en',
'target' => 'it',
], [
'language' => ConfigurableLanguage::load('it'),
'absolute' => FALSE,
]);
$add_translation_href = $add_translation_url
->toString();
$this
->drupalGet($add_translation_url);
$edit = [
'title[0][value]' => "Test {$index}.2 IT",
'moderation_state[0][state]' => 'draft',
];
$this
->submitForm($edit, 'Save (this translation)');
$entity = $this->storage
->loadUnchanged($id);
$this
->assertFalse($entity
->hasTranslation('it'));
$it_revision = $this
->loadRevisionTranslation($entity, 'it');
$this
->assertTrue($it_revision
->hasTranslation('it'));
// Check that translations cannot be deleted in drafts.
$overview_url = $entity
->toUrl('drupal:content-translation-overview');
$this
->drupalGet($overview_url);
$it_delete_url = $this
->getDeleteUrl($it_revision);
$it_delete_href = $it_delete_url
->toString();
$this
->assertSession()
->linkByHrefNotExists($it_delete_href);
$warning = 'The "Delete translation" action is only available for published translations.';
$this
->assertSession()
->statusMessageContains($warning, 'warning');
$this
->drupalGet($this
->getEditUrl($it_revision));
$this
->assertSession()
->buttonNotExists('Delete translation');
// Publish the translation and verify it can be deleted.
$edit = [
'title[0][value]' => "Test {$index}.3 IT",
'moderation_state[0][state]' => 'published',
];
$this
->submitForm($edit, 'Save (this translation)');
$entity = $this->storage
->loadUnchanged($id);
$this
->assertTrue($entity
->hasTranslation('it'));
$it_revision = $this
->loadRevisionTranslation($entity, 'it');
$this
->assertTrue($it_revision
->hasTranslation('it'));
$this
->drupalGet($overview_url);
$this
->assertSession()
->linkByHrefExists($it_delete_href);
$this
->assertSession()
->statusMessageNotContains($warning);
$this
->drupalGet($this
->getEditUrl($it_revision));
$this
->assertSession()
->buttonExists('Delete translation');
// Create an English draft and verify the published translation was
// preserved.
$this
->drupalLogin($this->editor);
$en_revision = $this
->loadRevisionTranslation($entity, 'en');
$this
->drupalGet($this
->getEditUrl($en_revision));
$edit = [
'title[0][value]' => "Test {$index}.4 EN",
'moderation_state[0][state]' => 'draft',
];
$this
->submitForm($edit, 'Save (this translation)');
$entity = $this->storage
->loadUnchanged($id);
$this
->assertTrue($entity
->hasTranslation('it'));
$en_revision = $this
->loadRevisionTranslation($entity, 'en');
$this
->assertTrue($en_revision
->hasTranslation('it'));
$this
->drupalLogin($this->currentAccount);
// Delete the translation and verify that it is actually gone and that it is
// possible to create it again.
$this
->drupalGet($it_delete_url);
$this
->submitForm([], 'Delete Italian translation');
$entity = $this->storage
->loadUnchanged($id);
$this
->assertFalse($entity
->hasTranslation('it'));
$it_revision = $this
->loadRevisionTranslation($entity, 'it');
$this
->assertTrue($it_revision
->wasDefaultRevision());
$this
->assertTrue($it_revision
->hasTranslation('it'));
$this
->assertLessThan($entity
->getRevisionId(), $it_revision
->getRevisionId());
$this
->drupalGet($overview_url);
$this
->assertSession()
->linkByHrefNotExists($this
->getEditUrl($it_revision)
->toString());
$this
->assertSession()
->linkByHrefExists($add_translation_href);
// Publish the English draft and verify the translation is not accidentally
// restored.
$this
->drupalLogin($this->editor);
$en_revision = $this
->loadRevisionTranslation($entity, 'en');
$this
->drupalGet($this
->getEditUrl($en_revision));
$edit = [
'title[0][value]' => "Test {$index}.6 EN",
'moderation_state[0][state]' => 'published',
];
$this
->submitForm($edit, 'Save');
$entity = $this->storage
->loadUnchanged($id);
$this
->assertFalse($entity
->hasTranslation('it'));
$this
->drupalLogin($this->currentAccount);
// Create a published translation again and verify it could be deleted.
$this
->drupalGet($add_translation_url);
$edit = [
'title[0][value]' => "Test {$index}.7 IT",
'moderation_state[0][state]' => 'published',
];
$this
->submitForm($edit, 'Save (this translation)');
$entity = $this->storage
->loadUnchanged($id);
$this
->assertTrue($entity
->hasTranslation('it'));
$it_revision = $this
->loadRevisionTranslation($entity, 'it');
$this
->assertTrue($it_revision
->hasTranslation('it'));
$this
->drupalGet($overview_url);
$this
->assertSession()
->linkByHrefExists($it_delete_href);
// Create a translation draft again and verify it cannot be deleted.
$this
->drupalGet($this
->getEditUrl($it_revision));
$edit = [
'title[0][value]' => "Test {$index}.8 IT",
'moderation_state[0][state]' => 'draft',
];
$this
->submitForm($edit, 'Save (this translation)');
$entity = $this->storage
->loadUnchanged($id);
$this
->assertTrue($entity
->hasTranslation('it'));
$it_revision = $this
->loadRevisionTranslation($entity, 'it');
$this
->assertTrue($it_revision
->hasTranslation('it'));
$this
->drupalGet($overview_url);
$this
->assertSession()
->linkByHrefNotExists($it_delete_href);
// Delete the translation draft and verify the translation can be deleted
// again, since the active revision is now a default revision.
$this
->drupalLogin($this->editor);
$this
->drupalGet($it_revision
->toUrl('version-history'));
$revision_deletion_url = Url::fromRoute('node.revision_delete_confirm', [
'node' => $id,
'node_revision' => $it_revision
->getRevisionId(),
], [
'language' => ConfigurableLanguage::load('it'),
'absolute' => FALSE,
]);
$revision_deletion_href = $revision_deletion_url
->toString();
$this
->getSession()
->getDriver()
->click("//a[@href='{$revision_deletion_href}']");
$this
->submitForm([], 'Delete');
$this
->drupalLogin($this->currentAccount);
$this
->drupalGet($overview_url);
$this
->assertSession()
->linkByHrefExists($it_delete_href);
// Verify that now the translation can be deleted.
$this
->drupalGet($it_delete_url);
$this
->submitForm([], 'Delete Italian translation');
$entity = $this->storage
->loadUnchanged($id);
$this
->assertFalse($entity
->hasTranslation('it'));
$it_revision = $this
->loadRevisionTranslation($entity, 'it');
$this
->assertTrue($it_revision
->wasDefaultRevision());
$this
->assertTrue($it_revision
->hasTranslation('it'));
$this
->assertLessThan($entity
->getRevisionId(), $it_revision
->getRevisionId());
$this
->drupalGet($overview_url);
$this
->assertSession()
->linkByHrefNotExists($this
->getEditUrl($it_revision)
->toString());
$this
->assertSession()
->linkByHrefExists($add_translation_href);
}
}