Updated Drupal to 8.6. This goes with the following updates because it's possible...
[yaffs-website] / web / core / modules / field / tests / src / Kernel / EntityReference / Views / EntityReferenceRelationshipTest.php
1 <?php
2
3 namespace Drupal\Tests\field\Kernel\EntityReference\Views;
4
5 use Drupal\entity_test\Entity\EntityTestMulChanged;
6 use Drupal\field\Entity\FieldStorageConfig;
7 use Drupal\entity_test\Entity\EntityTest;
8 use Drupal\entity_test\Entity\EntityTestMul;
9 use Drupal\Tests\field\Traits\EntityReferenceTestTrait;
10 use Drupal\Tests\views\Kernel\ViewsKernelTestBase;
11 use Drupal\views\Tests\ViewTestData;
12 use Drupal\views\Views;
13
14 /**
15  * Tests entity reference relationship data.
16  *
17  * @group entity_reference
18  *
19  * @see core_field_views_data()
20  */
21 class EntityReferenceRelationshipTest extends ViewsKernelTestBase {
22
23   use EntityReferenceTestTrait;
24
25   /**
26    * Views used by this test.
27    *
28    * @var array
29    */
30   public static $testViews = [
31     'test_entity_reference_entity_test_view',
32     'test_entity_reference_entity_test_view_long',
33     'test_entity_reference_reverse_entity_test_view',
34     'test_entity_reference_entity_test_mul_view',
35     'test_entity_reference_reverse_entity_test_mul_view',
36     'test_entity_reference_group_by_empty_relationships',
37     ];
38
39   /**
40    * Modules to install.
41    *
42    * @var array
43    */
44   public static $modules = ['user', 'field', 'entity_test', 'views', 'entity_reference_test_views'];
45
46   /**
47    * The entity_test entities used by the test.
48    *
49    * @var array
50    */
51   protected $entities = [];
52
53   /**
54    * {@inheritdoc}
55    */
56   protected function setUp($import_test_views = TRUE) {
57     parent::setUp();
58
59     $this->installEntitySchema('user');
60     $this->installEntitySchema('entity_test');
61     $this->installEntitySchema('entity_test_mul');
62     $this->installEntitySchema('entity_test_mul_changed');
63
64     // Create reference from entity_test to entity_test_mul.
65     $this->createEntityReferenceField('entity_test', 'entity_test', 'field_test_data', 'field_test_data', 'entity_test_mul');
66
67     // Create reference from entity_test_mul to entity_test.
68     $this->createEntityReferenceField('entity_test_mul', 'entity_test_mul', 'field_data_test', 'field_data_test', 'entity_test');
69
70     // Create another field for testing with a long name. So its storage name
71     // will become hashed. Use entity_test_mul_changed, so the resulting field
72     // tables created will be greater than 48 chars long.
73     // @see \Drupal\Core\Entity\Sql\DefaultTableMapping::generateFieldTableName()
74     $this->createEntityReferenceField('entity_test_mul_changed', 'entity_test_mul_changed', 'field_test_data_with_a_long_name', 'field_test_data_with_a_long_name', 'entity_test');
75
76     // Create reference from entity_test_mul to entity_test cardinality: infinite.
77     $this->createEntityReferenceField('entity_test_mul', 'entity_test_mul', 'field_data_test_unlimited', 'field_data_test_unlimited', 'entity_test', 'default', [], FieldStorageConfig::CARDINALITY_UNLIMITED);
78
79     ViewTestData::createTestViews(get_class($this), ['entity_reference_test_views']);
80   }
81
82   /**
83    * Tests using the views relationship.
84    */
85   public function testNoDataTableRelationship() {
86
87     // Create some test entities which link each other.
88     $referenced_entity = EntityTestMul::create();
89     $referenced_entity->save();
90
91     $entity = EntityTest::create();
92     $entity->field_test_data->target_id = $referenced_entity->id();
93     $entity->save();
94     $this->assertEqual($entity->field_test_data[0]->entity->id(), $referenced_entity->id());
95     $this->entities[] = $entity;
96
97     $entity = EntityTest::create();
98     $entity->field_test_data->target_id = $referenced_entity->id();
99     $entity->save();
100     $this->assertEqual($entity->field_test_data[0]->entity->id(), $referenced_entity->id());
101     $this->entities[] = $entity;
102
103     Views::viewsData()->clear();
104
105     // Check the generated views data.
106     $views_data = Views::viewsData()->get('entity_test__field_test_data');
107     $this->assertEqual($views_data['field_test_data']['relationship']['id'], 'standard');
108     $this->assertEqual($views_data['field_test_data']['relationship']['base'], 'entity_test_mul_property_data');
109     $this->assertEqual($views_data['field_test_data']['relationship']['base field'], 'id');
110     $this->assertEqual($views_data['field_test_data']['relationship']['relationship field'], 'field_test_data_target_id');
111     $this->assertEqual($views_data['field_test_data']['relationship']['entity type'], 'entity_test_mul');
112
113     // Check the backwards reference.
114     $views_data = Views::viewsData()->get('entity_test_mul_property_data');
115     $this->assertEqual($views_data['reverse__entity_test__field_test_data']['relationship']['id'], 'entity_reverse');
116     $this->assertEqual($views_data['reverse__entity_test__field_test_data']['relationship']['base'], 'entity_test');
117     $this->assertEqual($views_data['reverse__entity_test__field_test_data']['relationship']['base field'], 'id');
118     $this->assertEqual($views_data['reverse__entity_test__field_test_data']['relationship']['field table'], 'entity_test__field_test_data');
119     $this->assertEqual($views_data['reverse__entity_test__field_test_data']['relationship']['field field'], 'field_test_data_target_id');
120     $this->assertEqual($views_data['reverse__entity_test__field_test_data']['relationship']['field_name'], 'field_test_data');
121     $this->assertEqual($views_data['reverse__entity_test__field_test_data']['relationship']['entity_type'], 'entity_test');
122     $this->assertEqual($views_data['reverse__entity_test__field_test_data']['relationship']['join_extra'][0], ['field' => 'deleted', 'value' => 0, 'numeric' => TRUE]);
123
124     // Check an actual test view.
125     $view = Views::getView('test_entity_reference_entity_test_view');
126     $this->executeView($view);
127     /** @var \Drupal\views\ResultRow $row */
128     foreach ($view->result as $index => $row) {
129       // Check that the actual ID of the entity is the expected one.
130       $this->assertEqual($row->id, $this->entities[$index]->id());
131
132       // Also check that we have the correct result entity.
133       $this->assertEqual($row->_entity->id(), $this->entities[$index]->id());
134
135       // Test the forward relationship.
136       $this->assertEqual($row->entity_test_mul_property_data_entity_test__field_test_data_i, 1);
137
138       // Test that the correct relationship entity is on the row.
139       $this->assertEqual($row->_relationship_entities['field_test_data']->id(), 1);
140       $this->assertEqual($row->_relationship_entities['field_test_data']->bundle(), 'entity_test_mul');
141     }
142
143     // Check the backwards reference view.
144     $view = Views::getView('test_entity_reference_reverse_entity_test_view');
145     $this->executeView($view);
146     /** @var \Drupal\views\ResultRow $row */
147     foreach ($view->result as $index => $row) {
148       $this->assertEqual($row->id, 1);
149       $this->assertEqual($row->_entity->id(), 1);
150
151       // Test the backwards relationship.
152       $this->assertEqual($row->field_test_data_entity_test_mul_property_data_id, $this->entities[$index]->id());
153
154       // Test that the correct relationship entity is on the row.
155       $this->assertEqual($row->_relationship_entities['reverse__entity_test__field_test_data']->id(), $this->entities[$index]->id());
156       $this->assertEqual($row->_relationship_entities['reverse__entity_test__field_test_data']->bundle(), 'entity_test');
157     }
158   }
159
160   /**
161    * Tests views data generated for relationship.
162    *
163    * @see entity_reference_field_views_data()
164    */
165   public function testDataTableRelationship() {
166
167     // Create some test entities which link each other.
168     $referenced_entity = EntityTest::create();
169     $referenced_entity->save();
170
171     $entity = EntityTestMul::create();
172     $entity->field_data_test->target_id = $referenced_entity->id();
173     $entity->save();
174     $this->assertEqual($entity->field_data_test[0]->entity->id(), $referenced_entity->id());
175     $this->entities[] = $entity;
176
177     $entity = EntityTestMul::create();
178     $entity->field_data_test->target_id = $referenced_entity->id();
179     $entity->save();
180     $this->assertEqual($entity->field_data_test[0]->entity->id(), $referenced_entity->id());
181     $this->entities[] = $entity;
182
183     Views::viewsData()->clear();
184
185     // Check the generated views data.
186     $views_data = Views::viewsData()->get('entity_test_mul__field_data_test');
187     $this->assertEqual($views_data['field_data_test']['relationship']['id'], 'standard');
188     $this->assertEqual($views_data['field_data_test']['relationship']['base'], 'entity_test');
189     $this->assertEqual($views_data['field_data_test']['relationship']['base field'], 'id');
190     $this->assertEqual($views_data['field_data_test']['relationship']['relationship field'], 'field_data_test_target_id');
191     $this->assertEqual($views_data['field_data_test']['relationship']['entity type'], 'entity_test');
192
193     // Check the backwards reference.
194     $views_data = Views::viewsData()->get('entity_test');
195     $this->assertEqual($views_data['reverse__entity_test_mul__field_data_test']['relationship']['id'], 'entity_reverse');
196     $this->assertEqual($views_data['reverse__entity_test_mul__field_data_test']['relationship']['base'], 'entity_test_mul_property_data');
197     $this->assertEqual($views_data['reverse__entity_test_mul__field_data_test']['relationship']['base field'], 'id');
198     $this->assertEqual($views_data['reverse__entity_test_mul__field_data_test']['relationship']['field table'], 'entity_test_mul__field_data_test');
199     $this->assertEqual($views_data['reverse__entity_test_mul__field_data_test']['relationship']['field field'], 'field_data_test_target_id');
200     $this->assertEqual($views_data['reverse__entity_test_mul__field_data_test']['relationship']['field_name'], 'field_data_test');
201     $this->assertEqual($views_data['reverse__entity_test_mul__field_data_test']['relationship']['entity_type'], 'entity_test_mul');
202     $this->assertEqual($views_data['reverse__entity_test_mul__field_data_test']['relationship']['join_extra'][0], ['field' => 'deleted', 'value' => 0, 'numeric' => TRUE]);
203
204     // Check an actual test view.
205     $view = Views::getView('test_entity_reference_entity_test_mul_view');
206     $this->executeView($view);
207     /** @var \Drupal\views\ResultRow $row */
208     foreach ($view->result as $index => $row) {
209       // Check that the actual ID of the entity is the expected one.
210       $this->assertEqual($row->id, $this->entities[$index]->id());
211
212       // Also check that we have the correct result entity.
213       $this->assertEqual($row->_entity->id(), $this->entities[$index]->id());
214
215       // Test the forward relationship.
216       $this->assertEqual($row->entity_test_entity_test_mul__field_data_test_id, 1);
217
218       // Test that the correct relationship entity is on the row.
219       $this->assertEqual($row->_relationship_entities['field_data_test']->id(), 1);
220       $this->assertEqual($row->_relationship_entities['field_data_test']->bundle(), 'entity_test');
221
222     }
223
224     // Check the backwards reference view.
225     $view = Views::getView('test_entity_reference_reverse_entity_test_mul_view');
226     $this->executeView($view);
227     /** @var \Drupal\views\ResultRow $row */
228     foreach ($view->result as $index => $row) {
229       $this->assertEqual($row->id, 1);
230       $this->assertEqual($row->_entity->id(), 1);
231
232       // Test the backwards relationship.
233       $this->assertEqual($row->field_data_test_entity_test_id, $this->entities[$index]->id());
234
235       // Test that the correct relationship entity is on the row.
236       $this->assertEqual($row->_relationship_entities['reverse__entity_test_mul__field_data_test']->id(), $this->entities[$index]->id());
237       $this->assertEqual($row->_relationship_entities['reverse__entity_test_mul__field_data_test']->bundle(), 'entity_test_mul');
238     }
239   }
240
241   /**
242    * Tests views data generated for relationship.
243    *
244    * @see entity_reference_field_views_data()
245    */
246   public function testDataTableRelationshipWithLongFieldName() {
247     // Create some test entities which link each other.
248     $referenced_entity = EntityTest::create();
249     $referenced_entity->save();
250
251     $entity = EntityTestMulChanged::create();
252     $entity->field_test_data_with_a_long_name->target_id = $referenced_entity->id();
253     $entity->save();
254     $this->entities[] = $entity;
255
256     $entity = EntityTestMulChanged::create();
257     $entity->field_test_data_with_a_long_name->target_id = $referenced_entity->id();
258     $entity->save();
259     $this->entities[] = $entity;
260
261     Views::viewsData()->clear();
262
263     // Check an actual test view.
264     $view = Views::getView('test_entity_reference_entity_test_view_long');
265     $this->executeView($view);
266     /** @var \Drupal\views\ResultRow $row */
267     foreach ($view->result as $index => $row) {
268       // Check that the actual ID of the entity is the expected one.
269       $this->assertEqual($row->id, $this->entities[$index]->id());
270
271       // Also check that we have the correct result entity.
272       $this->assertEqual($row->_entity->id(), $this->entities[$index]->id());
273
274       // Test the forward relationship.
275       // $this->assertEqual($row->entity_test_entity_test_mul__field_data_test_id, 1);
276
277       // Test that the correct relationship entity is on the row.
278       $this->assertEqual($row->_relationship_entities['field_test_data_with_a_long_name']->id(), 1);
279       $this->assertEqual($row->_relationship_entities['field_test_data_with_a_long_name']->bundle(), 'entity_test');
280
281     }
282   }
283
284   /**
285    * Tests group by with optional and empty relationship.
286    */
287   public function testGroupByWithEmptyRelationships() {
288     $entities = [];
289     // Create 4 entities with name1 and 3 entities with name2.
290     for ($i = 1; $i <= 4; $i++) {
291       $entity = [
292         'name' => 'name' . $i,
293       ];
294       $entity = EntityTest::create($entity);
295       $entities[] = $entity;
296       $entity->save();
297     }
298
299     $entity = EntityTestMul::create([
300       'name' => 'name1',
301     ]);
302     $entity->field_data_test_unlimited = [
303       ['target_id' => $entities[0]->id()],
304       ['target_id' => $entities[1]->id()],
305       ['target_id' => $entities[2]->id()],
306     ];
307     $entity->save();
308
309     $entity = EntityTestMul::create([
310       'name' => 'name2',
311     ]);
312     $entity->field_data_test_unlimited = [
313       ['target_id' => $entities[0]->id()],
314       ['target_id' => $entities[1]->id()],
315     ];
316     $entity->save();
317
318     $entity = EntityTestMul::create([
319       'name' => 'name3',
320     ]);
321     $entity->field_data_test_unlimited->target_id = $entities[0]->id();
322     $entity->save();
323
324     $view = Views::getView('test_entity_reference_group_by_empty_relationships');
325     $this->executeView($view);
326     $this->assertCount(4, $view->result);
327     // First three results should contain a reference from EntityTestMul.
328     $this->assertNotEmpty($view->getStyle()->getField(0, 'name_2'));
329     $this->assertNotEmpty($view->getStyle()->getField(1, 'name_2'));
330     $this->assertNotEmpty($view->getStyle()->getField(2, 'name_2'));
331     // Fourth result has no reference from EntityTestMul hence the output for
332     // should be empty.
333     $this->assertEqual('', $view->getStyle()->getField(3, 'name_2'));
334
335     $fields = $view->field;
336     // Check getValue for reference with a value. The first 3 rows reference
337     // EntityTestMul, so have value 'name1'.
338     $this->assertEquals('name1', $fields['name_2']->getValue($view->result[0]));
339     $this->assertEquals('name1', $fields['name_2']->getValue($view->result[1]));
340     $this->assertEquals('name1', $fields['name_2']->getValue($view->result[2]));
341     // Ensure getValue works on empty references.
342     $this->assertNull($fields['name_2']->getValue($view->result[3]));
343   }
344
345 }