Updated Drupal to 8.6. This goes with the following updates because it's possible...
[yaffs-website] / web / core / modules / field / tests / src / Functional / EntityReference / Views / SelectionTest.php
1 <?php
2
3 namespace Drupal\Tests\field\Functional\EntityReference\Views;
4
5 use Drupal\field\Entity\FieldConfig;
6 use Drupal\Tests\BrowserTestBase;
7 use Drupal\views\Views;
8 use Drupal\field\Entity\FieldStorageConfig;
9
10 /**
11  * Tests entity reference selection handler.
12  *
13  * @group entity_reference
14  */
15 class SelectionTest extends BrowserTestBase {
16
17   public static $modules = ['node', 'views', 'entity_reference_test', 'entity_test'];
18
19   /**
20    * Nodes for testing.
21    *
22    * @var array
23    */
24   protected $nodes = [];
25
26   /**
27    * The entity reference field to test.
28    *
29    * @var \Drupal\Core\Field\FieldDefinitionInterface
30    */
31   protected $field;
32
33   /**
34    * {@inheritdoc}
35    */
36   protected function setUp() {
37     parent::setUp();
38
39     // Create nodes.
40     $type = $this->drupalCreateContentType()->id();
41     $node1 = $this->drupalCreateNode(['type' => $type]);
42     $node2 = $this->drupalCreateNode(['type' => $type]);
43     $node3 = $this->drupalCreateNode();
44
45     foreach ([$node1, $node2, $node3] as $node) {
46       $this->nodes[$node->getType()][$node->id()] = $node->label();
47     }
48
49     // Create a field.
50     $field_storage = FieldStorageConfig::create([
51       'field_name' => 'test_field',
52       'entity_type' => 'entity_test',
53       'translatable' => FALSE,
54       'settings' => [
55         'target_type' => 'node',
56       ],
57       'type' => 'entity_reference',
58       'cardinality' => '1',
59     ]);
60     $field_storage->save();
61     $field = FieldConfig::create([
62       'field_storage' => $field_storage,
63       'bundle' => 'test_bundle',
64       'settings' => [
65         'handler' => 'views',
66         'handler_settings' => [
67           'view' => [
68             'view_name' => 'test_entity_reference',
69             'display_name' => 'entity_reference_1',
70             'arguments' => [],
71           ],
72         ],
73       ],
74     ]);
75     $field->save();
76     $this->field = $field;
77   }
78
79   /**
80    * Confirm the expected results are returned.
81    *
82    * @param array $result
83    *   Query results keyed by node type and nid.
84    */
85   protected function assertResults(array $result) {
86     $success = FALSE;
87     foreach ($result as $node_type => $values) {
88       foreach ($values as $nid => $label) {
89         if (!$success = $this->nodes[$node_type][$nid] == trim(strip_tags($label))) {
90           // There was some error, so break.
91           break;
92         }
93       }
94     }
95     $this->assertTrue($success, 'Views selection handler returned expected values.');
96   }
97
98   /**
99    * Tests the selection handler.
100    */
101   public function testSelectionHandler() {
102     // Get values from selection handler.
103     $handler = $this->container->get('plugin.manager.entity_reference_selection')->getSelectionHandler($this->field);
104     $result = $handler->getReferenceableEntities();
105     $this->assertResults($result);
106   }
107
108   /**
109    * Tests the selection handler with a relationship.
110    */
111   public function testSelectionHandlerRelationship() {
112     // Add a relationship to the view.
113     $view = Views::getView('test_entity_reference');
114     $view->setDisplay();
115     $view->displayHandlers->get('default')->setOption('relationships', [
116       'test_relationship' => [
117         'id' => 'uid',
118         'table' => 'node_field_data',
119         'field' => 'uid',
120       ],
121     ]);
122
123     // Add a filter depending on the relationship to the test view.
124     $view->displayHandlers->get('default')->setOption('filters', [
125       'uid' => [
126         'id' => 'uid',
127         'table' => 'users_field_data',
128         'field' => 'uid',
129         'relationship' => 'test_relationship',
130       ],
131     ]);
132
133     // Set view to distinct so only one row per node is returned.
134     $query_options = $view->display_handler->getOption('query');
135     $query_options['options']['distinct'] = TRUE;
136     $view->display_handler->setOption('query', $query_options);
137     $view->save();
138
139     // Get values from the selection handler.
140     $handler = $this->container->get('plugin.manager.entity_reference_selection')->getSelectionHandler($this->field);
141     $result = $handler->getReferenceableEntities();
142     $this->assertResults($result);
143   }
144
145 }