You are here

public function FieldApiDataTest::testEntityFieldFilter in Drupal 9

Same name and namespace in other branches
  1. 8 core/modules/views/tests/src/Kernel/FieldApiDataTest.php \Drupal\Tests\views\Kernel\FieldApiDataTest::testEntityFieldFilter()

Tests filtering entries with different translatability.

File

core/modules/views/tests/src/Kernel/FieldApiDataTest.php, line 203

Class

FieldApiDataTest
Tests the Field Views data.

Namespace

Drupal\Tests\views\Kernel

Code

public function testEntityFieldFilter() {
  NodeType::create([
    'type' => 'bundle1',
  ])
    ->save();
  NodeType::create([
    'type' => 'bundle2',
  ])
    ->save();

  // Create some example content.
  ConfigurableLanguage::create([
    'id' => 'es',
  ])
    ->save();
  ConfigurableLanguage::create([
    'id' => 'fr',
  ])
    ->save();
  ContentLanguageSettings::loadByEntityTypeBundle('node', 'bundle1')
    ->setDefaultLangcode('es')
    ->setLanguageAlterable(TRUE)
    ->save();
  ContentLanguageSettings::loadByEntityTypeBundle('node', 'bundle2')
    ->setDefaultLangcode('es')
    ->setLanguageAlterable(TRUE)
    ->save();
  $field_translation_map = [
    1 => [
      'bundle1' => TRUE,
      'bundle2' => TRUE,
    ],
    2 => [
      'bundle1' => FALSE,
      'bundle2' => FALSE,
    ],
    3 => [
      'bundle1' => TRUE,
      'bundle2' => FALSE,
    ],
  ];
  for ($i = 1; $i < 4; $i++) {
    $field_name = "field_name_{$i}";
    FieldStorageConfig::create([
      'field_name' => $field_name,
      'entity_type' => 'node',
      'type' => 'string',
    ])
      ->save();
    foreach ([
      'bundle1',
      'bundle2',
    ] as $bundle) {
      FieldConfig::create([
        'field_name' => $field_name,
        'entity_type' => 'node',
        'bundle' => $bundle,
        'translatable' => $field_translation_map[$i][$bundle],
      ])
        ->save();
    }
  }
  $node1 = Node::create([
    'title' => 'Test title bundle1',
    'type' => 'bundle1',
    'langcode' => 'es',
    'field_name_1' => 'field name 1: es',
    'field_name_2' => 'field name 2: es',
    'field_name_3' => 'field name 3: es',
  ]);
  $node1
    ->save();

  /** @var \Drupal\node\NodeInterface $translation */
  $node1
    ->addTranslation('fr', [
    'title' => $node1->title->value,
    'field_name_1' => 'field name 1: fr',
    'field_name_3' => 'field name 3: fr',
  ])
    ->save();
  $node2 = Node::create([
    'title' => 'Test title bundle2',
    'type' => 'bundle2',
    'langcode' => 'es',
    'field_name_1' => 'field name 1: es',
    'field_name_2' => 'field name 2: es',
    'field_name_3' => 'field name 3: es',
  ]);
  $node2
    ->save();
  $node2
    ->addTranslation('fr', [
    'title' => $node2->title->value,
    'field_name_1' => 'field name 1: fr',
  ])
    ->save();
  $map = [
    'nid' => 'nid',
    'langcode' => 'langcode',
  ];
  $view = Views::getView('test_field_config_translation_filter');

  // Filter by 'field name 1: es'.
  $view
    ->setDisplay('embed_1');
  $this
    ->executeView($view);
  $expected = [
    [
      'nid' => $node1
        ->id(),
      'langcode' => 'es',
    ],
    [
      'nid' => $node2
        ->id(),
      'langcode' => 'es',
    ],
  ];
  $this
    ->assertIdenticalResultset($view, $expected, $map);
  $view
    ->destroy();

  // Filter by 'field name 1: fr'.
  $view
    ->setDisplay('embed_2');
  $this
    ->executeView($view);
  $expected = [
    [
      'nid' => $node1
        ->id(),
      'langcode' => 'fr',
    ],
    [
      'nid' => $node2
        ->id(),
      'langcode' => 'fr',
    ],
  ];
  $this
    ->assertIdenticalResultset($view, $expected, $map);
  $view
    ->destroy();

  // Filter by 'field name 2: es'.
  $view
    ->setDisplay('embed_3');
  $this
    ->executeView($view);
  $expected = [
    [
      'nid' => $node1
        ->id(),
      'langcode' => 'es',
    ],
    [
      'nid' => $node1
        ->id(),
      'langcode' => 'fr',
    ],
    [
      'nid' => $node2
        ->id(),
      'langcode' => 'es',
    ],
    [
      'nid' => $node2
        ->id(),
      'langcode' => 'fr',
    ],
  ];
  $this
    ->assertIdenticalResultset($view, $expected, $map);
  $view
    ->destroy();

  // Filter by 'field name 2: fr', which doesn't exist.
  $view
    ->setDisplay('embed_4');
  $this
    ->executeView($view);
  $expected = [];
  $this
    ->assertIdenticalResultset($view, $expected, $map);
  $view
    ->destroy();

  // Filter by 'field name 3: es'.
  $view
    ->setDisplay('embed_5');
  $this
    ->executeView($view);
  $expected = [
    [
      'nid' => $node1
        ->id(),
      'langcode' => 'es',
    ],
    [
      'nid' => $node2
        ->id(),
      'langcode' => 'es',
    ],
    // Why is this one returned?
    [
      'nid' => $node2
        ->id(),
      'langcode' => 'fr',
    ],
  ];
  $this
    ->assertIdenticalResultset($view, $expected, $map);
  $view
    ->destroy();

  // Filter by 'field name 3: fr'.
  $view
    ->setDisplay('embed_6');
  $this
    ->executeView($view);
  $expected = [
    [
      'nid' => $node1
        ->id(),
      'langcode' => 'fr',
    ],
  ];
  $this
    ->assertIdenticalResultset($view, $expected, $map);
  $view
    ->destroy();
}