function ContentTranslationFieldSyncRevisionTest::testFieldSynchronizationAndValidation

Same name in other branches
  1. 9 core/modules/content_translation/tests/src/Kernel/ContentTranslationFieldSyncRevisionTest.php \Drupal\Tests\content_translation\Kernel\ContentTranslationFieldSyncRevisionTest::testFieldSynchronizationAndValidation()
  2. 8.9.x core/modules/content_translation/tests/src/Kernel/ContentTranslationFieldSyncRevisionTest.php \Drupal\Tests\content_translation\Kernel\ContentTranslationFieldSyncRevisionTest::testFieldSynchronizationAndValidation()
  3. 10 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 130

Class

ContentTranslationFieldSyncRevisionTest
Tests the field synchronization logic when revisions are involved.

Namespace

Drupal\Tests\content_translation\Kernel

Code

public function testFieldSynchronizationAndValidation() : void {
    // 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',
    ]);
}

Buggy or inaccurate documentation? Please file an issue. Need support? Need help programming? Connect with the Drupal community.