function FieldApiDataTest::testEntityFieldFilter

Same name and namespace in other branches
  1. 9 core/modules/views/tests/src/Kernel/FieldApiDataTest.php \Drupal\Tests\views\Kernel\FieldApiDataTest::testEntityFieldFilter()
  2. 10 core/modules/views/tests/src/Kernel/FieldApiDataTest.php \Drupal\Tests\views\Kernel\FieldApiDataTest::testEntityFieldFilter()
  3. 11.x 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();
}

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