Version 1
[yaffs-website] / web / core / modules / field / tests / src / Functional / EntityReference / Views / SelectionTest.php
diff --git a/web/core/modules/field/tests/src/Functional/EntityReference/Views/SelectionTest.php b/web/core/modules/field/tests/src/Functional/EntityReference/Views/SelectionTest.php
new file mode 100644 (file)
index 0000000..cfb5ecf
--- /dev/null
@@ -0,0 +1,145 @@
+<?php
+
+namespace Drupal\Tests\field\Functional\EntityReference\Views;
+
+use Drupal\field\Entity\FieldConfig;
+use Drupal\Tests\BrowserTestBase;
+use Drupal\views\Views;
+use Drupal\field\Entity\FieldStorageConfig;
+
+/**
+ * Tests entity reference selection handler.
+ *
+ * @group entity_reference
+ */
+class SelectionTest extends BrowserTestBase {
+
+  public static $modules = ['node', 'views', 'entity_reference_test', 'entity_test'];
+
+  /**
+   * Nodes for testing.
+   *
+   * @var array
+   */
+  protected $nodes = [];
+
+  /**
+   * The entity reference field to test.
+   *
+   * @var \Drupal\Core\Field\FieldDefinitionInterface
+   */
+  protected $field;
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function setUp() {
+    parent::setUp();
+
+    // Create nodes.
+    $type = $this->drupalCreateContentType()->id();
+    $node1 = $this->drupalCreateNode(['type' => $type]);
+    $node2 = $this->drupalCreateNode(['type' => $type]);
+    $node3 = $this->drupalCreateNode();
+
+    foreach ([$node1, $node2, $node3] as $node) {
+      $this->nodes[$node->getType()][$node->id()] = $node->label();
+    }
+
+    // Create a field.
+    $field_storage = FieldStorageConfig::create([
+      'field_name' => 'test_field',
+      'entity_type' => 'entity_test',
+      'translatable' => FALSE,
+      'settings' => [
+        'target_type' => 'node',
+      ],
+      'type' => 'entity_reference',
+      'cardinality' => '1',
+    ]);
+    $field_storage->save();
+    $field = FieldConfig::create([
+      'field_storage' => $field_storage,
+      'bundle' => 'test_bundle',
+      'settings' => [
+        'handler' => 'views',
+        'handler_settings' => [
+          'view' => [
+            'view_name' => 'test_entity_reference',
+            'display_name' => 'entity_reference_1',
+            'arguments' => [],
+          ],
+        ],
+      ],
+    ]);
+    $field->save();
+    $this->field = $field;
+  }
+
+  /**
+   * Confirm the expected results are returned.
+   *
+   * @param array $result
+   *   Query results keyed by node type and nid.
+   */
+  protected function assertResults(array $result) {
+    $success = FALSE;
+    foreach ($result as $node_type => $values) {
+      foreach ($values as $nid => $label) {
+        if (!$success = $this->nodes[$node_type][$nid] == trim(strip_tags($label))) {
+          // There was some error, so break.
+          break;
+        }
+      }
+    }
+    $this->assertTrue($success, 'Views selection handler returned expected values.');
+  }
+
+  /**
+   * Tests the selection handler.
+   */
+  public function testSelectionHandler() {
+    // Get values from selection handler.
+    $handler = $this->container->get('plugin.manager.entity_reference_selection')->getSelectionHandler($this->field);
+    $result = $handler->getReferenceableEntities();
+    $this->assertResults($result);
+  }
+
+  /**
+   * Tests the selection handler with a relationship.
+   */
+  public function testSelectionHandlerRelationship() {
+    // Add a relationship to the view.
+    $view = Views::getView('test_entity_reference');
+    $view->setDisplay();
+    $view->displayHandlers->get('default')->setOption('relationships', [
+      'test_relationship' => [
+        'id' => 'uid',
+        'table' => 'node_field_data',
+        'field' => 'uid',
+      ],
+    ]);
+
+    // Add a filter depending on the relationship to the test view.
+    $view->displayHandlers->get('default')->setOption('filters', [
+      'uid' => [
+        'id' => 'uid',
+        'table' => 'users_field_data',
+        'field' => 'uid',
+        'relationship' => 'test_relationship',
+      ]
+    ]);
+
+    // Set view to distinct so only one row per node is returned.
+    $query_options = $view->display_handler->getOption('query');
+    $query_options['options']['distinct'] = TRUE;
+    $view->display_handler->setOption('query', $query_options);
+    $view->save();
+
+    // Get values from the selection handler.
+    $handler = $this->container->get('plugin.manager.entity_reference_selection')->getSelectionHandler($this->field);
+    $result = $handler->getReferenceableEntities();
+    $this->assertResults($result);
+  }
+
+}