You are here

public function MetatagImportTest::testEntityUpdate in Metatag Import Export CSV 8

Test entities are updated from the CSV data.

File

tests/src/Kernel/MetatagImportTest.php, line 89

Class

MetatagImportTest
Tests importing CSV data.

Namespace

Drupal\Tests\metatag_import_export_csv\Kernel

Code

public function testEntityUpdate() {
  $node_storage = $this->entityTypeManager
    ->getStorage('node');
  $nodes = [];

  // Simple node.
  $node = $node_storage
    ->create([
    'type' => 'page',
    'title' => 'Title 1',
  ]);
  $node
    ->save();
  $nodes[1] = $node;

  // Node with an existing value.
  $node = $node_storage
    ->create([
    'type' => 'page',
    'title' => 'Title 2',
    'field_metatags' => serialize([
      'abstract' => 'old value',
    ]),
  ]);
  $node
    ->save();
  $nodes[2] = $node;

  // Translated node, only changing the original language.
  $node = $node_storage
    ->create([
    'type' => 'page',
    'title' => 'Title 3',
    'field_metatags' => serialize([
      'abstract' => 'old value',
    ]),
  ]);
  $node
    ->save();
  $nodes[3] = $node;
  $translation = $node
    ->addTranslation('fr', $node
    ->toArray());
  $translation->field_metatags = serialize([
    'abstract' => 'ancienne valeur',
  ]);
  $translation
    ->save();

  // Translated node, changing only the translation.
  $node = $node_storage
    ->create([
    'type' => 'page',
    'title' => 'Title 4',
    'field_metatags' => serialize([
      'abstract' => 'old value',
    ]),
  ]);
  $node
    ->save();
  $nodes[4] = $node;
  $translation = $node
    ->addTranslation('fr', $node
    ->toArray());
  $translation->field_metatags = serialize([
    'abstract' => 'ancienne valeur',
  ]);
  $translation
    ->save();

  // Translated node, changing both languages.
  $node = $node_storage
    ->create([
    'type' => 'page',
    'title' => 'Title 5',
    'field_metatags' => serialize([
      'abstract' => 'old value',
    ]),
  ]);
  $node
    ->save();
  $nodes[5] = $node;
  $translation = $node
    ->addTranslation('fr', $node
    ->toArray());
  $translation->field_metatags = serialize([
    'abstract' => 'ancienne valeur',
  ]);
  $translation
    ->save();

  // Node with a path alias.
  $node = $node_storage
    ->create([
    'type' => 'page',
    'title' => 'Title 6',
    'path' => [
      'alias' => '/foo',
    ],
  ]);
  $node
    ->save();
  $nodes[6] = $node;

  // Node with translated path alias.
  $node = $node_storage
    ->create([
    'type' => 'page',
    'title' => 'Title 7',
    'path' => [
      'alias' => '/bar',
    ],
  ]);
  $node
    ->save();
  $nodes[7] = $node;
  $translation = $node
    ->addTranslation('fr', $node
    ->toArray());
  $translation->path->alias = '/toto';
  $translation
    ->save();

  // CSV data to import.
  $headers = [
    'entity_type',
    'entity_id',
    'path_alias',
    'language',
    'field_machine_name',
    'abstract',
  ];
  $data = [
    [
      'node',
      $nodes[1]
        ->id(),
      '',
      '',
      'field_metatags',
      'new value one',
    ],
    [
      'node',
      $nodes[2]
        ->id(),
      '',
      '',
      'field_metatags',
      'new value two',
    ],
    [
      'node',
      $nodes[3]
        ->id(),
      '',
      '',
      'field_metatags',
      'new value three',
    ],
    [
      'node',
      $nodes[4]
        ->id(),
      '',
      'fr',
      'field_metatags',
      'nouvelle valeur quatre',
    ],
    [
      'node',
      $nodes[5]
        ->id(),
      '',
      'en',
      'field_metatags',
      'new value five',
    ],
    [
      'node',
      $nodes[5]
        ->id(),
      '',
      'fr',
      'field_metatags',
      'nouvelle valeur cinq',
    ],
    [
      '',
      '',
      '/foo',
      '',
      'field_metatags',
      'new value six',
    ],
    [
      '',
      '',
      '/bar',
      'en',
      'field_metatags',
      'new value seven',
    ],
    [
      '',
      '',
      '/toto',
      'fr',
      'field_metatags',
      'nouvelle valeur sept',
    ],
  ];
  foreach ($data as $row) {
    MetatagImport::importCsvRow($headers, $row);
  }
  foreach ($nodes as $index => $node) {
    $nodes[$index] = $this
      ->reloadEntity($node);
  }
  $metatag_data = unserialize($nodes[1]->field_metatags->value);
  $this
    ->assertEquals('new value one', $metatag_data['abstract']);
  $metatag_data = unserialize($nodes[2]->field_metatags->value);
  $this
    ->assertEquals('new value two', $metatag_data['abstract']);

  // Original is affected.
  $metatag_data = unserialize($nodes[3]->field_metatags->value);
  $this
    ->assertEquals('new value three', $metatag_data['abstract']);

  // Translation is not affected.
  $metatag_data = unserialize($nodes[3]
    ->getTranslation('fr')->field_metatags->value);
  $this
    ->assertEquals('ancienne valeur', $metatag_data['abstract']);

  // Original is not affected.
  $metatag_data = unserialize($nodes[4]->field_metatags->value);
  $this
    ->assertEquals('old value', $metatag_data['abstract']);

  // Translation is updated.
  $metatag_data = unserialize($nodes[4]
    ->getTranslation('fr')->field_metatags->value);
  $this
    ->assertEquals('nouvelle valeur quatre', $metatag_data['abstract']);

  // Both translations are updated.
  $metatag_data = unserialize($nodes[5]->field_metatags->value);
  $this
    ->assertEquals('new value five', $metatag_data['abstract']);
  $metatag_data = unserialize($nodes[5]
    ->getTranslation('fr')->field_metatags->value);
  $this
    ->assertEquals('nouvelle valeur cinq', $metatag_data['abstract']);
  $metatag_data = unserialize($nodes[6]->field_metatags->value);
  $this
    ->assertEquals('new value six', $metatag_data['abstract']);

  // Both translations are updated.
  $metatag_data = unserialize($nodes[7]->field_metatags->value);
  $this
    ->assertEquals('new value seven', $metatag_data['abstract']);
  $metatag_data = unserialize($nodes[7]
    ->getTranslation('fr')->field_metatags->value);
  $this
    ->assertEquals('nouvelle valeur sept', $metatag_data['abstract']);

  // Check other field values are not changed.
  foreach ($nodes as $index => $node) {
    $this
      ->assertEquals("Title {$index}", $node->title->value);
  }
}