function ContentTranslationSyncUnitTest::testFieldSync

Same name in other branches
  1. 8.9.x core/modules/content_translation/tests/src/Kernel/ContentTranslationSyncUnitTest.php \Drupal\Tests\content_translation\Kernel\ContentTranslationSyncUnitTest::testFieldSync()
  2. 10 core/modules/content_translation/tests/src/Kernel/ContentTranslationSyncUnitTest.php \Drupal\Tests\content_translation\Kernel\ContentTranslationSyncUnitTest::testFieldSync()
  3. 11.x core/modules/content_translation/tests/src/Kernel/ContentTranslationSyncUnitTest.php \Drupal\Tests\content_translation\Kernel\ContentTranslationSyncUnitTest::testFieldSync()

Tests the field synchronization algorithm.

File

core/modules/content_translation/tests/src/Kernel/ContentTranslationSyncUnitTest.php, line 88

Class

ContentTranslationSyncUnitTest
Tests the field synchronization logic.

Namespace

Drupal\Tests\content_translation\Kernel

Code

public function testFieldSync() {
    // Add a new item to the source items and check that its added to all the
    // translations.
    $sync_langcode = $this->langcodes[2];
    $unchanged_items = $this->unchangedFieldValues[$sync_langcode];
    $field_values = $this->unchangedFieldValues;
    $item = [];
    foreach ($this->columns as $column) {
        $item[$column] = $this->randomMachineName();
    }
    $field_values[$sync_langcode][] = $item;
    $this->synchronizer
        ->synchronizeItems($field_values, $unchanged_items, $sync_langcode, $this->langcodes, $this->synchronized);
    $result = TRUE;
    foreach ($this->unchangedFieldValues as $langcode => $items) {
        // Check that the old values are still in place.
        for ($delta = 0; $delta < $this->cardinality; $delta++) {
            foreach ($this->columns as $column) {
                $result = $result && $this->unchangedFieldValues[$langcode][$delta][$column] == $field_values[$langcode][$delta][$column];
            }
        }
        // Check that the new item is available in all languages.
        foreach ($this->columns as $column) {
            $result = $result && $field_values[$langcode][$delta][$column] == $field_values[$sync_langcode][$delta][$column];
        }
    }
    $this->assertTrue($result, 'A new item has been correctly synchronized.');
    // Remove an item from the source items and check that its removed from all
    // the translations.
    $sync_langcode = $this->langcodes[1];
    $unchanged_items = $this->unchangedFieldValues[$sync_langcode];
    $field_values = $this->unchangedFieldValues;
    $sync_delta = mt_rand(0, count($field_values[$sync_langcode]) - 1);
    unset($field_values[$sync_langcode][$sync_delta]);
    // Renumber deltas to start from 0.
    $field_values[$sync_langcode] = array_values($field_values[$sync_langcode]);
    $this->synchronizer
        ->synchronizeItems($field_values, $unchanged_items, $sync_langcode, $this->langcodes, $this->synchronized);
    $result = TRUE;
    foreach ($this->unchangedFieldValues as $langcode => $items) {
        $new_delta = 0;
        // Check that the old values are still in place.
        for ($delta = 0; $delta < $this->cardinality; $delta++) {
            // Skip the removed item.
            if ($delta != $sync_delta) {
                foreach ($this->columns as $column) {
                    $result = $result && $this->unchangedFieldValues[$langcode][$delta][$column] == $field_values[$langcode][$new_delta][$column];
                }
                $new_delta++;
            }
        }
    }
    $this->assertTrue($result, 'A removed item has been correctly synchronized.');
    // Move the items around in the source items and check that they are moved
    // in all the translations.
    $sync_langcode = $this->langcodes[3];
    $unchanged_items = $this->unchangedFieldValues[$sync_langcode];
    $field_values = $this->unchangedFieldValues;
    $field_values[$sync_langcode] = [];
    // Scramble the items.
    foreach ($unchanged_items as $delta => $item) {
        $new_delta = ($delta + 1) % $this->cardinality;
        $field_values[$sync_langcode][$new_delta] = $item;
    }
    // Renumber deltas to start from 0.
    ksort($field_values[$sync_langcode]);
    $this->synchronizer
        ->synchronizeItems($field_values, $unchanged_items, $sync_langcode, $this->langcodes, $this->synchronized);
    $result = TRUE;
    foreach ($field_values as $langcode => $items) {
        for ($delta = 0; $delta < $this->cardinality; $delta++) {
            foreach ($this->columns as $column) {
                $value = $field_values[$langcode][$delta][$column];
                if (in_array($column, $this->synchronized)) {
                    // If we are dealing with a synchronize column the current value is
                    // supposed to be the same of the source items.
                    $result = $result && $field_values[$sync_langcode][$delta][$column] == $value;
                }
                else {
                    // Otherwise the values should be unchanged.
                    $old_delta = ($delta > 0 ? $delta : $this->cardinality) - 1;
                    $result = $result && $this->unchangedFieldValues[$langcode][$old_delta][$column] == $value;
                }
            }
        }
    }
    $this->assertTrue($result, 'Scrambled items have been correctly synchronized.');
}

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