You are here

public function MigrateEntityContentBaseTest::testTranslated in Drupal 9

Same name and namespace in other branches
  1. 8 core/modules/migrate/tests/src/Kernel/MigrateEntityContentBaseTest.php \Drupal\Tests\migrate\Kernel\MigrateEntityContentBaseTest::testTranslated()

Tests importing and rolling back translated entities.

File

core/modules/migrate/tests/src/Kernel/MigrateEntityContentBaseTest.php, line 103

Class

MigrateEntityContentBaseTest
Tests the EntityContentBase destination.

Namespace

Drupal\Tests\migrate\Kernel

Code

public function testTranslated() {

  // Create a destination.
  $this
    ->createDestination([
    'translations' => TRUE,
  ]);

  // Create some pre-existing entities.
  $this->storage
    ->create([
    'id' => 1,
    'langcode' => 'en',
  ])
    ->save();
  $this->storage
    ->create([
    'id' => 2,
    'langcode' => 'fr',
  ])
    ->save();
  $translated = $this->storage
    ->create([
    'id' => 3,
    'langcode' => 'en',
  ]);
  $translated
    ->save();
  $translated
    ->addTranslation('fr')
    ->save();

  // Pre-assert that things are as expected.
  $this
    ->assertTranslations(1, 'en');
  $this
    ->assertTranslations(2, 'fr');
  $this
    ->assertTranslations(3, 'en', [
    'fr',
  ]);
  $this
    ->assertNull($this->storage
    ->load(4));
  $destination_rows = [
    // Existing default translation.
    [
      'id' => 1,
      'langcode' => 'en',
      'action' => MigrateIdMapInterface::ROLLBACK_PRESERVE,
    ],
    // New translation.
    [
      'id' => 2,
      'langcode' => 'en',
      'action' => MigrateIdMapInterface::ROLLBACK_DELETE,
    ],
    // Existing non-default translation.
    [
      'id' => 3,
      'langcode' => 'fr',
      'action' => MigrateIdMapInterface::ROLLBACK_PRESERVE,
    ],
    // Brand new row.
    [
      'id' => 4,
      'langcode' => 'fr',
      'action' => MigrateIdMapInterface::ROLLBACK_DELETE,
    ],
  ];
  $rollback_actions = [];

  // Import some rows.
  foreach ($destination_rows as $idx => $destination_row) {
    $row = new Row();
    foreach ($destination_row as $key => $value) {
      $row
        ->setDestinationProperty($key, $value);
    }
    $this->destination
      ->import($row);

    // Check that the rollback action is correct, and save it.
    $this
      ->assertEquals($destination_row['action'], $this->destination
      ->rollbackAction());
    $rollback_actions[$idx] = $this->destination
      ->rollbackAction();
  }
  $this
    ->assertTranslations(1, 'en');
  $this
    ->assertTranslations(2, 'fr', [
    'en',
  ]);
  $this
    ->assertTranslations(3, 'en', [
    'fr',
  ]);
  $this
    ->assertTranslations(4, 'fr');

  // Rollback the rows.
  foreach ($destination_rows as $idx => $destination_row) {
    if ($rollback_actions[$idx] == MigrateIdMapInterface::ROLLBACK_DELETE) {
      $this->destination
        ->rollback($destination_row);
    }
  }

  // No change, update of existing translation.
  $this
    ->assertTranslations(1, 'en');

  // Remove added translation.
  $this
    ->assertTranslations(2, 'fr');

  // No change, update of existing translation.
  $this
    ->assertTranslations(3, 'en', [
    'fr',
  ]);

  // No change, can't remove default translation.
  $this
    ->assertTranslations(4, 'fr');
}