You are here

public function ContentTranslationFieldSyncRevisionTest::testFieldSynchronizationAndValidation in Drupal 9

Same name and namespace in other branches
  1. 8 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\Kernel

Code

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',
  ]);
}