public function ContentTranslationFieldSyncRevisionTest::testFieldSynchronizationAndValidation in Drupal 10
Same name and namespace in other branches
- 8 core/modules/content_translation/tests/src/Kernel/ContentTranslationFieldSyncRevisionTest.php \Drupal\Tests\content_translation\Kernel\ContentTranslationFieldSyncRevisionTest::testFieldSynchronizationAndValidation()
- 9 core/modules/content_translation/tests/src/Kernel/ContentTranslationFieldSyncRevisionTest.php \Drupal\Tests\content_translation\Kernel\ContentTranslationFieldSyncRevisionTest::testFieldSynchronizationAndValidation()
Checks that field synchronization works as expected with revisions.
@covers \Drupal\content_translation\Plugin\Validation\Constraint\ContentTranslationSynchronizedFieldsConstraintValidator::create @covers \Drupal\content_translation\Plugin\Validation\Constraint\ContentTranslationSynchronizedFieldsConstraintValidator::validate @covers \Drupal\content_translation\Plugin\Validation\Constraint\ContentTranslationSynchronizedFieldsConstraintValidator::hasSynchronizedPropertyChanges @covers \Drupal\content_translation\FieldTranslationSynchronizer::getFieldSynchronizedProperties @covers \Drupal\content_translation\FieldTranslationSynchronizer::synchronizeFields @covers \Drupal\content_translation\FieldTranslationSynchronizer::synchronizeItems
File
- core/
modules/ content_translation/ tests/ src/ Kernel/ ContentTranslationFieldSyncRevisionTest.php, line 128
Class
- ContentTranslationFieldSyncRevisionTest
- Tests the field synchronization logic when revisions are involved.
Namespace
Drupal\Tests\content_translation\KernelCode
public function testFieldSynchronizationAndValidation() {
// Test that when untranslatable field widgets are displayed, synchronized
// field properties can be changed only in default revisions.
$this
->setUntranslatableFieldWidgetsDisplay(TRUE);
$entity = $this
->saveNewEntity();
$entity_id = $entity
->id();
$this
->assertLatestRevisionFieldValues($entity_id, [
1,
1,
1,
'Alt 1 EN',
]);
/** @var \Drupal\Core\Entity\ContentEntityInterface $en_revision */
$en_revision = $this
->createRevision($entity, FALSE);
$en_revision
->get($this->fieldName)->target_id = 2;
$violations = $en_revision
->validate();
$this
->assertViolations($violations);
$it_translation = $entity
->addTranslation('it', $entity
->toArray());
/** @var \Drupal\Core\Entity\ContentEntityInterface $it_revision */
$it_revision = $this
->createRevision($it_translation, FALSE);
$metadata = $this->contentTranslationManager
->getTranslationMetadata($it_revision);
$metadata
->setSource('en');
$it_revision
->get($this->fieldName)->target_id = 2;
$it_revision
->get($this->fieldName)->alt = 'Alt 2 IT';
$violations = $it_revision
->validate();
$this
->assertViolations($violations);
$it_revision
->isDefaultRevision(TRUE);
$violations = $it_revision
->validate();
$this
->assertEmpty($violations);
$this->storage
->save($it_revision);
$this
->assertLatestRevisionFieldValues($entity_id, [
2,
2,
2,
'Alt 1 EN',
'Alt 2 IT',
]);
$en_revision = $this
->createRevision($en_revision, FALSE);
$en_revision
->get($this->fieldName)->alt = 'Alt 3 EN';
$violations = $en_revision
->validate();
$this
->assertEmpty($violations);
$this->storage
->save($en_revision);
$this
->assertLatestRevisionFieldValues($entity_id, [
3,
2,
2,
'Alt 3 EN',
'Alt 2 IT',
]);
$it_revision = $this
->createRevision($it_revision, FALSE);
$it_revision
->get($this->fieldName)->alt = 'Alt 4 IT';
$violations = $it_revision
->validate();
$this
->assertEmpty($violations);
$this->storage
->save($it_revision);
$this
->assertLatestRevisionFieldValues($entity_id, [
4,
2,
2,
'Alt 1 EN',
'Alt 4 IT',
]);
$en_revision = $this
->createRevision($en_revision);
$en_revision
->get($this->fieldName)->alt = 'Alt 5 EN';
$violations = $en_revision
->validate();
$this
->assertEmpty($violations);
$this->storage
->save($en_revision);
$this
->assertLatestRevisionFieldValues($entity_id, [
5,
2,
2,
'Alt 5 EN',
'Alt 2 IT',
]);
$en_revision = $this
->createRevision($en_revision);
$en_revision
->get($this->fieldName)->target_id = 6;
$en_revision
->get($this->fieldName)->alt = 'Alt 6 EN';
$violations = $en_revision
->validate();
$this
->assertEmpty($violations);
$this->storage
->save($en_revision);
$this
->assertLatestRevisionFieldValues($entity_id, [
6,
6,
6,
'Alt 6 EN',
'Alt 2 IT',
]);
$it_revision = $this
->createRevision($it_revision);
$it_revision
->get($this->fieldName)->alt = 'Alt 7 IT';
$violations = $it_revision
->validate();
$this
->assertEmpty($violations);
$this->storage
->save($it_revision);
$this
->assertLatestRevisionFieldValues($entity_id, [
7,
6,
6,
'Alt 6 EN',
'Alt 7 IT',
]);
// Test that when untranslatable field widgets are hidden, synchronized
// field properties can be changed only when editing the default
// translation. This may lead to temporarily desynchronized values, when
// saving a pending revision for the default translation that changes a
// synchronized property (see revision 11).
$this
->setUntranslatableFieldWidgetsDisplay(FALSE);
$entity = $this
->saveNewEntity();
$entity_id = $entity
->id();
$this
->assertLatestRevisionFieldValues($entity_id, [
8,
1,
1,
'Alt 1 EN',
]);
/** @var \Drupal\Core\Entity\ContentEntityInterface $en_revision */
$en_revision = $this
->createRevision($entity, FALSE);
$en_revision
->get($this->fieldName)->target_id = 2;
$en_revision
->get($this->fieldName)->alt = 'Alt 2 EN';
$violations = $en_revision
->validate();
$this
->assertEmpty($violations);
$this->storage
->save($en_revision);
$this
->assertLatestRevisionFieldValues($entity_id, [
9,
2,
2,
'Alt 2 EN',
]);
$it_translation = $entity
->addTranslation('it', $entity
->toArray());
/** @var \Drupal\Core\Entity\ContentEntityInterface $it_revision */
$it_revision = $this
->createRevision($it_translation, FALSE);
$metadata = $this->contentTranslationManager
->getTranslationMetadata($it_revision);
$metadata
->setSource('en');
$it_revision
->get($this->fieldName)->target_id = 3;
$violations = $it_revision
->validate();
$this
->assertViolations($violations);
$it_revision
->isDefaultRevision(TRUE);
$violations = $it_revision
->validate();
$this
->assertViolations($violations);
$it_revision = $this
->createRevision($it_translation);
$metadata = $this->contentTranslationManager
->getTranslationMetadata($it_revision);
$metadata
->setSource('en');
$it_revision
->get($this->fieldName)->alt = 'Alt 3 IT';
$violations = $it_revision
->validate();
$this
->assertEmpty($violations);
$this->storage
->save($it_revision);
$this
->assertLatestRevisionFieldValues($entity_id, [
10,
1,
1,
'Alt 1 EN',
'Alt 3 IT',
]);
$en_revision = $this
->createRevision($en_revision, FALSE);
$en_revision
->get($this->fieldName)->alt = 'Alt 4 EN';
$violations = $en_revision
->validate();
$this
->assertEmpty($violations);
$this->storage
->save($en_revision);
$this
->assertLatestRevisionFieldValues($entity_id, [
11,
2,
1,
'Alt 4 EN',
'Alt 3 IT',
]);
$it_revision = $this
->createRevision($it_revision, FALSE);
$it_revision
->get($this->fieldName)->alt = 'Alt 5 IT';
$violations = $it_revision
->validate();
$this
->assertEmpty($violations);
$this->storage
->save($it_revision);
$this
->assertLatestRevisionFieldValues($entity_id, [
12,
1,
1,
'Alt 1 EN',
'Alt 5 IT',
]);
$en_revision = $this
->createRevision($en_revision);
$en_revision
->get($this->fieldName)->target_id = 6;
$en_revision
->get($this->fieldName)->alt = 'Alt 6 EN';
$violations = $en_revision
->validate();
$this
->assertEmpty($violations);
$this->storage
->save($en_revision);
$this
->assertLatestRevisionFieldValues($entity_id, [
13,
6,
6,
'Alt 6 EN',
'Alt 3 IT',
]);
$it_revision = $this
->createRevision($it_revision);
$it_revision
->get($this->fieldName)->target_id = 7;
$violations = $it_revision
->validate();
$this
->assertViolations($violations);
$it_revision = $this
->createRevision($it_revision);
$it_revision
->get($this->fieldName)->alt = 'Alt 7 IT';
$violations = $it_revision
->validate();
$this
->assertEmpty($violations);
$this->storage
->save($it_revision);
$this
->assertLatestRevisionFieldValues($entity_id, [
14,
6,
6,
'Alt 6 EN',
'Alt 7 IT',
]);
// Test that creating a default revision starting from a pending revision
// having changes to synchronized properties, without introducing new
// changes works properly.
$this
->setUntranslatableFieldWidgetsDisplay(FALSE);
$entity = $this
->saveNewEntity();
$entity_id = $entity
->id();
$this
->assertLatestRevisionFieldValues($entity_id, [
15,
1,
1,
'Alt 1 EN',
]);
$it_translation = $entity
->addTranslation('it', $entity
->toArray());
/** @var \Drupal\Core\Entity\ContentEntityInterface $it_revision */
$it_revision = $this
->createRevision($it_translation);
$metadata = $this->contentTranslationManager
->getTranslationMetadata($it_revision);
$metadata
->setSource('en');
$it_revision
->get($this->fieldName)->alt = 'Alt 2 IT';
$violations = $it_revision
->validate();
$this
->assertEmpty($violations);
$this->storage
->save($it_revision);
$this
->assertLatestRevisionFieldValues($entity_id, [
16,
1,
1,
'Alt 1 EN',
'Alt 2 IT',
]);
/** @var \Drupal\Core\Entity\ContentEntityInterface $en_revision */
$en_revision = $this
->createRevision($entity);
$en_revision
->get($this->fieldName)->target_id = 3;
$en_revision
->get($this->fieldName)->alt = 'Alt 3 EN';
$violations = $en_revision
->validate();
$this
->assertEmpty($violations);
$this->storage
->save($en_revision);
$this
->assertLatestRevisionFieldValues($entity_id, [
17,
3,
3,
'Alt 3 EN',
'Alt 2 IT',
]);
$en_revision = $this
->createRevision($entity, FALSE);
$en_revision
->get($this->fieldName)->target_id = 4;
$en_revision
->get($this->fieldName)->alt = 'Alt 4 EN';
$violations = $en_revision
->validate();
$this
->assertEmpty($violations);
$this->storage
->save($en_revision);
$this
->assertLatestRevisionFieldValues($entity_id, [
18,
4,
3,
'Alt 4 EN',
'Alt 2 IT',
]);
$en_revision = $this
->createRevision($entity);
$violations = $en_revision
->validate();
$this
->assertEmpty($violations);
$this->storage
->save($en_revision);
$this
->assertLatestRevisionFieldValues($entity_id, [
19,
4,
4,
'Alt 4 EN',
'Alt 2 IT',
]);
$it_revision = $this
->createRevision($it_revision);
$it_revision
->get($this->fieldName)->alt = 'Alt 6 IT';
$violations = $it_revision
->validate();
$this
->assertEmpty($violations);
$this->storage
->save($it_revision);
$this
->assertLatestRevisionFieldValues($entity_id, [
20,
4,
4,
'Alt 4 EN',
'Alt 6 IT',
]);
// Check that we are not allowed to perform changes to multiple translations
// in pending revisions when synchronized properties are involved.
$this
->setUntranslatableFieldWidgetsDisplay(FALSE);
$entity = $this
->saveNewEntity();
$entity_id = $entity
->id();
$this
->assertLatestRevisionFieldValues($entity_id, [
21,
1,
1,
'Alt 1 EN',
]);
$it_translation = $entity
->addTranslation('it', $entity
->toArray());
/** @var \Drupal\Core\Entity\ContentEntityInterface $it_revision */
$it_revision = $this
->createRevision($it_translation);
$metadata = $this->contentTranslationManager
->getTranslationMetadata($it_revision);
$metadata
->setSource('en');
$it_revision
->get($this->fieldName)->alt = 'Alt 2 IT';
$violations = $it_revision
->validate();
$this
->assertEmpty($violations);
$this->storage
->save($it_revision);
$this
->assertLatestRevisionFieldValues($entity_id, [
22,
1,
1,
'Alt 1 EN',
'Alt 2 IT',
]);
$en_revision = $this
->createRevision($entity, FALSE);
$en_revision
->get($this->fieldName)->target_id = 2;
$en_revision
->getTranslation('it')
->get($this->fieldName)->alt = 'Alt 3 IT';
$violations = $en_revision
->validate();
$this
->assertViolations($violations);
// Test that when saving a new default revision starting from a pending
// revision, outdated synchronized properties do not override more recent
// ones.
$this
->setUntranslatableFieldWidgetsDisplay(TRUE);
$entity = $this
->saveNewEntity();
$entity_id = $entity
->id();
$this
->assertLatestRevisionFieldValues($entity_id, [
23,
1,
1,
'Alt 1 EN',
]);
$it_translation = $entity
->addTranslation('it', $entity
->toArray());
/** @var \Drupal\Core\Entity\ContentEntityInterface $it_revision */
$it_revision = $this
->createRevision($it_translation, FALSE);
$metadata = $this->contentTranslationManager
->getTranslationMetadata($it_revision);
$metadata
->setSource('en');
$it_revision
->get($this->fieldName)->alt = 'Alt 2 IT';
$violations = $it_revision
->validate();
$this
->assertEmpty($violations);
$this->storage
->save($it_revision);
$this
->assertLatestRevisionFieldValues($entity_id, [
24,
1,
1,
'Alt 1 EN',
'Alt 2 IT',
]);
/** @var \Drupal\Core\Entity\ContentEntityInterface $en_revision */
$en_revision = $this
->createRevision($entity);
$en_revision
->get($this->fieldName)->target_id = 3;
$en_revision
->get($this->fieldName)->alt = 'Alt 3 EN';
$violations = $en_revision
->validate();
$this
->assertEmpty($violations);
$this->storage
->save($en_revision);
$this
->assertLatestRevisionFieldValues($entity_id, [
25,
3,
3,
'Alt 3 EN',
'Alt 2 IT',
]);
$it_revision = $this
->createRevision($it_revision);
$it_revision
->get($this->fieldName)->alt = 'Alt 4 IT';
$violations = $it_revision
->validate();
$this
->assertEmpty($violations);
$this->storage
->save($it_revision);
$this
->assertLatestRevisionFieldValues($entity_id, [
26,
3,
3,
'Alt 3 EN',
'Alt 4 IT',
]);
}