annotate core/modules/views/tests/src/Unit/EntityViewsDataTest.php @ 0:4c8ae668cc8c

Initial import (non-working)
author Chris Cannam
date Wed, 29 Nov 2017 16:09:58 +0000
parents
children 1fec387a4317
rev   line source
Chris@0 1 <?php
Chris@0 2
Chris@0 3 /**
Chris@0 4 * @file
Chris@0 5 * Contains \Drupal\Tests\views\Unit\EntityViewsDataTest.
Chris@0 6 */
Chris@0 7
Chris@0 8 namespace Drupal\Tests\views\Unit;
Chris@0 9
Chris@0 10 use Drupal\Core\Config\Entity\ConfigEntityType;
Chris@0 11 use Drupal\Core\Entity\ContentEntityType;
Chris@0 12 use Drupal\Core\Entity\EntityTypeInterface;
Chris@0 13 use Drupal\Core\Entity\Sql\DefaultTableMapping;
Chris@0 14 use Drupal\Core\Field\BaseFieldDefinition;
Chris@0 15 use Drupal\Core\Field\Plugin\Field\FieldType\EntityReferenceItem;
Chris@0 16 use Drupal\Core\Field\Plugin\Field\FieldType\IntegerItem;
Chris@0 17 use Drupal\Core\Field\Plugin\Field\FieldType\LanguageItem;
Chris@0 18 use Drupal\Core\Field\Plugin\Field\FieldType\StringItem;
Chris@0 19 use Drupal\Core\Field\Plugin\Field\FieldType\UriItem;
Chris@0 20 use Drupal\Core\Field\Plugin\Field\FieldType\UuidItem;
Chris@0 21 use Drupal\Core\TypedData\TypedDataManagerInterface;
Chris@0 22 use Drupal\text\Plugin\Field\FieldType\TextLongItem;
Chris@0 23 use Drupal\entity_test\Entity\EntityTest;
Chris@0 24 use Drupal\entity_test\Entity\EntityTestMul;
Chris@0 25 use Drupal\entity_test\Entity\EntityTestMulRev;
Chris@0 26 use Drupal\Tests\UnitTestCase;
Chris@0 27 use Drupal\views\EntityViewsData;
Chris@0 28 use Symfony\Component\DependencyInjection\ContainerBuilder;
Chris@0 29
Chris@0 30 /**
Chris@0 31 * @coversDefaultClass \Drupal\views\EntityViewsData
Chris@0 32 * @group Views
Chris@0 33 */
Chris@0 34 class EntityViewsDataTest extends UnitTestCase {
Chris@0 35
Chris@0 36 /**
Chris@0 37 * Entity info to use in this test.
Chris@0 38 *
Chris@0 39 * @var \Drupal\Core\Entity\EntityTypeInterface|\Drupal\Tests\views\Unit\TestEntityType
Chris@0 40 */
Chris@0 41 protected $baseEntityType;
Chris@0 42
Chris@0 43 /**
Chris@0 44 * The mocked entity storage.
Chris@0 45 *
Chris@0 46 * @var \Drupal\Core\Entity\Sql\SqlContentEntityStorage|\PHPUnit_Framework_MockObject_MockObject
Chris@0 47 */
Chris@0 48 protected $entityStorage;
Chris@0 49
Chris@0 50 /**
Chris@0 51 * The mocked entity manager.
Chris@0 52 *
Chris@0 53 * @var \Drupal\Core\Entity\EntityManagerInterface|\PHPUnit_Framework_MockObject_MockObject
Chris@0 54 */
Chris@0 55 protected $entityManager;
Chris@0 56
Chris@0 57 /**
Chris@0 58 * The mocked module handler.
Chris@0 59 *
Chris@0 60 * @var \Drupal\Core\Extension\ModuleHandlerInterface|\PHPUnit_Framework_MockObject_MockObject
Chris@0 61 */
Chris@0 62 protected $moduleHandler;
Chris@0 63
Chris@0 64 /**
Chris@0 65 * The mocked translation manager.
Chris@0 66 *
Chris@0 67 * @var \Drupal\Core\StringTranslation\TranslationInterface|\PHPUnit_Framework_MockObject_MockObject
Chris@0 68 */
Chris@0 69 protected $translationManager;
Chris@0 70
Chris@0 71 /**
Chris@0 72 * The tested entity views controller.
Chris@0 73 *
Chris@0 74 * @var \Drupal\Tests\views\Unit\TestEntityViewsData
Chris@0 75 */
Chris@0 76 protected $viewsData;
Chris@0 77
Chris@0 78 /**
Chris@0 79 * {@inheritdoc}
Chris@0 80 */
Chris@0 81 protected function setUp() {
Chris@0 82 $this->entityStorage = $this->getMockBuilder('Drupal\Core\Entity\Sql\SqlContentEntityStorage')
Chris@0 83 ->disableOriginalConstructor()
Chris@0 84 ->getMock();
Chris@0 85 $this->entityManager = $this->getMock('Drupal\Core\Entity\EntityManagerInterface');
Chris@0 86
Chris@0 87 $typed_data_manager = $this->getMock(TypedDataManagerInterface::class);
Chris@0 88 $typed_data_manager->expects($this->any())
Chris@0 89 ->method('createDataDefinition')
Chris@0 90 ->willReturn($this->getMock('Drupal\Core\TypedData\DataDefinitionInterface'));
Chris@0 91
Chris@0 92 $typed_data_manager->expects($this->any())
Chris@0 93 ->method('getDefinition')
Chris@0 94 ->with($this->equalTo('field_item:string_long'))
Chris@0 95 ->willReturn(['class' => '\Drupal\Core\Field\Plugin\Field\FieldType\StringLongItem']);
Chris@0 96
Chris@0 97 $this->baseEntityType = new TestEntityType([
Chris@0 98 'base_table' => 'entity_test',
Chris@0 99 'id' => 'entity_test',
Chris@0 100 'label' => 'Entity test',
Chris@0 101 'entity_keys' => [
Chris@0 102 'uuid' => 'uuid',
Chris@0 103 'id' => 'id',
Chris@0 104 'langcode' => 'langcode',
Chris@0 105 'bundle' => 'type',
Chris@0 106 'revision' => 'revision_id',
Chris@0 107 ],
Chris@0 108 'provider' => 'entity_test',
Chris@0 109 'list_cache_contexts' => ['entity_test_list_cache_context'],
Chris@0 110 ]);
Chris@0 111
Chris@0 112 $this->translationManager = $this->getStringTranslationStub();
Chris@0 113 $this->moduleHandler = $this->getMock('Drupal\Core\Extension\ModuleHandlerInterface');
Chris@0 114
Chris@0 115 $this->viewsData = new TestEntityViewsData($this->baseEntityType, $this->entityStorage, $this->entityManager, $this->moduleHandler, $this->translationManager);
Chris@0 116
Chris@0 117 $field_type_manager = $this->getMockBuilder('Drupal\Core\Field\FieldTypePluginManager')
Chris@0 118 ->disableOriginalConstructor()
Chris@0 119 ->getMock();
Chris@0 120 $field_type_manager->expects($this->any())
Chris@0 121 ->method('getDefaultStorageSettings')
Chris@0 122 ->willReturn([]);
Chris@0 123 $field_type_manager->expects($this->any())
Chris@0 124 ->method('getDefaultFieldSettings')
Chris@0 125 ->willReturn([]);
Chris@0 126
Chris@0 127 $container = new ContainerBuilder();
Chris@0 128 $container->set('plugin.manager.field.field_type', $field_type_manager);
Chris@0 129 $container->set('entity.manager', $this->entityManager);
Chris@0 130 $container->set('typed_data_manager', $typed_data_manager);
Chris@0 131 \Drupal::setContainer($container);
Chris@0 132 }
Chris@0 133
Chris@0 134 /**
Chris@0 135 * Helper method to setup base fields.
Chris@0 136 *
Chris@0 137 * @param \Drupal\Core\Field\BaseFieldDefinition[] $base_fields
Chris@0 138 * The base fields which are adapted.
Chris@0 139 *
Chris@0 140 * @return \Drupal\Core\Field\BaseFieldDefinition[]
Chris@0 141 * The setup base fields.
Chris@0 142 */
Chris@0 143 protected function setupBaseFields(array $base_fields) {
Chris@0 144 // Add a description field to the fields supplied by the EntityTest
Chris@0 145 // classes. This example comes from the taxonomy Term entity.
Chris@0 146 $base_fields['description'] = BaseFieldDefinition::create('text_long')
Chris@0 147 ->setLabel('Description')
Chris@0 148 ->setDescription('A description of the term.')
Chris@0 149 ->setTranslatable(TRUE)
Chris@0 150 ->setDisplayOptions('view', [
Chris@0 151 'label' => 'hidden',
Chris@0 152 'type' => 'text_default',
Chris@0 153 'weight' => 0,
Chris@0 154 ])
Chris@0 155 ->setDisplayConfigurable('view', TRUE)
Chris@0 156 ->setDisplayOptions('form', [
Chris@0 157 'type' => 'text_textfield',
Chris@0 158 'weight' => 0,
Chris@0 159 ])
Chris@0 160 ->setDisplayConfigurable('form', TRUE);
Chris@0 161
Chris@0 162 // Add a URL field; this example is from the Comment entity.
Chris@0 163 $base_fields['homepage'] = BaseFieldDefinition::create('uri')
Chris@0 164 ->setLabel('Homepage')
Chris@0 165 ->setDescription("The comment author's home page address.")
Chris@0 166 ->setTranslatable(TRUE)
Chris@0 167 ->setSetting('max_length', 255);
Chris@0 168
Chris@0 169 // A base field with cardinality > 1
Chris@0 170 $base_fields['string'] = BaseFieldDefinition::create('string')
Chris@0 171 ->setLabel('Strong')
Chris@0 172 ->setTranslatable(TRUE)
Chris@0 173 ->setCardinality(2);
Chris@0 174
Chris@0 175 foreach ($base_fields as $name => $base_field) {
Chris@0 176 $base_field->setName($name);
Chris@0 177 }
Chris@0 178 return $base_fields;
Chris@0 179 }
Chris@0 180
Chris@0 181 /**
Chris@0 182 * Tests base tables.
Chris@0 183 */
Chris@0 184 public function testBaseTables() {
Chris@0 185 $data = $this->viewsData->getViewsData();
Chris@0 186
Chris@0 187 $this->assertEquals('entity_test', $data['entity_test']['table']['entity type']);
Chris@0 188 $this->assertEquals(FALSE, $data['entity_test']['table']['entity revision']);
Chris@0 189 $this->assertEquals('Entity test', $data['entity_test']['table']['group']);
Chris@0 190 $this->assertEquals('entity_test', $data['entity_test']['table']['provider']);
Chris@0 191
Chris@0 192 $this->assertEquals('id', $data['entity_test']['table']['base']['field']);
Chris@0 193 $this->assertEquals(['entity_test_list_cache_context'], $data['entity_test']['table']['base']['cache_contexts']);
Chris@0 194 $this->assertEquals('Entity test', $data['entity_test']['table']['base']['title']);
Chris@0 195
Chris@0 196 $this->assertFalse(isset($data['entity_test']['table']['defaults']));
Chris@0 197
Chris@0 198 $this->assertFalse(isset($data['entity_test_mul_property_data']));
Chris@0 199 $this->assertFalse(isset($data['revision_table']));
Chris@0 200 $this->assertFalse(isset($data['revision_data_table']));
Chris@0 201 }
Chris@0 202
Chris@0 203 /**
Chris@0 204 * Tests data_table support.
Chris@0 205 */
Chris@0 206 public function testDataTable() {
Chris@0 207 $entity_type = $this->baseEntityType
Chris@0 208 ->set('data_table', 'entity_test_mul_property_data')
Chris@0 209 ->set('id', 'entity_test_mul')
Chris@0 210 ->set('translatable', TRUE)
Chris@0 211 ->setKey('label', 'label');
Chris@0 212
Chris@0 213 $this->viewsData->setEntityType($entity_type);
Chris@0 214
Chris@0 215 // Tests the join definition between the base and the data table.
Chris@0 216 $data = $this->viewsData->getViewsData();
Chris@0 217 $base_views_data = $data['entity_test'];
Chris@0 218
Chris@0 219 // Ensure that the base table is set to the data table.
Chris@0 220 $this->assertEquals('id', $data['entity_test_mul_property_data']['table']['base']['field']);
Chris@0 221 $this->assertEquals('Entity test', $data['entity_test_mul_property_data']['table']['base']['title']);
Chris@0 222 $this->assertFalse(isset($data['entity_test']['table']['base']));
Chris@0 223
Chris@0 224 $this->assertEquals('entity_test_mul', $data['entity_test_mul_property_data']['table']['entity type']);
Chris@0 225 $this->assertEquals(FALSE, $data['entity_test_mul_property_data']['table']['entity revision']);
Chris@0 226 $this->assertEquals('Entity test', $data['entity_test_mul_property_data']['table']['group']);
Chris@0 227 $this->assertEquals('entity_test', $data['entity_test']['table']['provider']);
Chris@0 228 $this->assertEquals(['field' => 'label', 'table' => 'entity_test_mul_property_data'], $data['entity_test_mul_property_data']['table']['base']['defaults']);
Chris@0 229
Chris@0 230 // Ensure the join information is set up properly.
Chris@0 231 $this->assertCount(1, $base_views_data['table']['join']);
Chris@0 232 $this->assertEquals(['entity_test_mul_property_data' => ['left_field' => 'id', 'field' => 'id', 'type' => 'INNER']], $base_views_data['table']['join']);
Chris@0 233 $this->assertFalse(isset($data['revision_table']));
Chris@0 234 $this->assertFalse(isset($data['revision_data_table']));
Chris@0 235 }
Chris@0 236
Chris@0 237 /**
Chris@0 238 * Tests revision table without data table support.
Chris@0 239 */
Chris@0 240 public function testRevisionTableWithoutDataTable() {
Chris@0 241 $entity_type = $this->baseEntityType
Chris@0 242 ->set('revision_table', 'entity_test_mulrev_revision')
Chris@0 243 ->set('revision_data_table', NULL)
Chris@0 244 ->set('id', 'entity_test_mulrev')
Chris@0 245 ->setKey('revision', 'revision_id');
Chris@0 246 $this->viewsData->setEntityType($entity_type);
Chris@0 247
Chris@0 248 $data = $this->viewsData->getViewsData();
Chris@0 249
Chris@0 250 $this->assertEquals('Entity test revisions', $data['entity_test_mulrev_revision']['table']['base']['title']);
Chris@0 251 $this->assertEquals('revision_id', $data['entity_test_mulrev_revision']['table']['base']['field']);
Chris@0 252
Chris@0 253 $this->assertEquals(FALSE, $data['entity_test']['table']['entity revision']);
Chris@0 254 $this->assertEquals('entity_test_mulrev', $data['entity_test_mulrev_revision']['table']['entity type']);
Chris@0 255 $this->assertEquals(TRUE, $data['entity_test_mulrev_revision']['table']['entity revision']);
Chris@0 256 $this->assertEquals('entity_test_mulrev', $data['entity_test_mulrev_revision']['table']['entity type']);
Chris@0 257 $this->assertEquals(TRUE, $data['entity_test_mulrev_revision']['table']['entity revision']);
Chris@0 258
Chris@0 259 $this->assertEquals('Entity test revision', $data['entity_test_mulrev_revision']['table']['group']);
Chris@0 260 $this->assertEquals('entity_test', $data['entity_test']['table']['provider']);
Chris@0 261
Chris@0 262 // Ensure the join information is set up properly.
Chris@0 263 // Tests the join definition between the base and the revision table.
Chris@0 264 $revision_data = $data['entity_test_mulrev_revision'];
Chris@0 265 $this->assertCount(1, $revision_data['table']['join']);
Chris@0 266 $this->assertEquals(['entity_test' => ['left_field' => 'revision_id', 'field' => 'revision_id', 'type' => 'INNER']], $revision_data['table']['join']);
Chris@0 267 $this->assertFalse(isset($data['data_table']));
Chris@0 268 }
Chris@0 269
Chris@0 270 /**
Chris@0 271 * Tests revision table with data table support.
Chris@0 272 */
Chris@0 273 public function testRevisionTableWithRevisionDataTableAndDataTable() {
Chris@0 274 $entity_type = $this->baseEntityType
Chris@0 275 ->set('data_table', 'entity_test_mul_property_data')
Chris@0 276 ->set('revision_table', 'entity_test_mulrev_revision')
Chris@0 277 ->set('revision_data_table', 'entity_test_mulrev_property_revision')
Chris@0 278 ->set('id', 'entity_test_mulrev')
Chris@0 279 ->set('translatable', TRUE)
Chris@0 280 ->setKey('revision', 'revision_id');
Chris@0 281 $this->viewsData->setEntityType($entity_type);
Chris@0 282
Chris@0 283 $data = $this->viewsData->getViewsData();
Chris@0 284
Chris@0 285 $this->assertEquals('Entity test revisions', $data['entity_test_mulrev_property_revision']['table']['base']['title']);
Chris@0 286 $this->assertEquals('revision_id', $data['entity_test_mulrev_property_revision']['table']['base']['field']);
Chris@0 287 $this->assertFalse(isset($data['entity_test_mulrev_revision']['table']['base']));
Chris@0 288
Chris@0 289 $this->assertEquals('entity_test_mulrev', $data['entity_test_mulrev_property_revision']['table']['entity type']);
Chris@0 290 $this->assertEquals('Entity test revision', $data['entity_test_mulrev_revision']['table']['group']);
Chris@0 291 $this->assertEquals('entity_test', $data['entity_test']['table']['provider']);
Chris@0 292
Chris@0 293 // Ensure the join information is set up properly.
Chris@0 294 // Tests the join definition between the base and the revision table.
Chris@0 295 $revision_field_data = $data['entity_test_mulrev_property_revision'];
Chris@0 296 $this->assertCount(1, $revision_field_data['table']['join']);
Chris@0 297 $this->assertEquals([
Chris@0 298 'entity_test_mul_property_data' => [
Chris@0 299 'left_field' => 'revision_id',
Chris@0 300 'field' => 'revision_id',
Chris@0 301 'type' => 'INNER',
Chris@0 302 ],
Chris@0 303 ], $revision_field_data['table']['join']);
Chris@0 304
Chris@0 305 $revision_base_data = $data['entity_test_mulrev_revision'];
Chris@0 306 $this->assertCount(1, $revision_base_data['table']['join']);
Chris@0 307 $this->assertEquals([
Chris@0 308 'entity_test_mulrev_property_revision' => [
Chris@0 309 'left_field' => 'revision_id',
Chris@0 310 'field' => 'revision_id',
Chris@0 311 'type' => 'INNER',
Chris@0 312 ],
Chris@0 313 ], $revision_base_data['table']['join']);
Chris@0 314
Chris@0 315 $this->assertFalse(isset($data['data_table']));
Chris@0 316 }
Chris@0 317
Chris@0 318 /**
Chris@0 319 * Tests revision table with data table support.
Chris@0 320 */
Chris@0 321 public function testRevisionTableWithRevisionDataTable() {
Chris@0 322 $entity_type = $this->baseEntityType
Chris@0 323 ->set('revision_table', 'entity_test_mulrev_revision')
Chris@0 324 ->set('revision_data_table', 'entity_test_mulrev_property_revision')
Chris@0 325 ->set('id', 'entity_test_mulrev')
Chris@0 326 ->set('translatable', TRUE)
Chris@0 327 ->setKey('revision', 'revision_id');
Chris@0 328 $this->viewsData->setEntityType($entity_type);
Chris@0 329
Chris@0 330 $data = $this->viewsData->getViewsData();
Chris@0 331
Chris@0 332 $this->assertEquals('Entity test revisions', $data['entity_test_mulrev_property_revision']['table']['base']['title']);
Chris@0 333 $this->assertEquals('revision_id', $data['entity_test_mulrev_property_revision']['table']['base']['field']);
Chris@0 334 $this->assertFalse(isset($data['entity_test_mulrev_revision']['table']['base']));
Chris@0 335
Chris@0 336 $this->assertEquals('entity_test_mulrev', $data['entity_test_mulrev_property_revision']['table']['entity type']);
Chris@0 337 $this->assertEquals('Entity test revision', $data['entity_test_mulrev_revision']['table']['group']);
Chris@0 338 $this->assertEquals('entity_test', $data['entity_test']['table']['provider']);
Chris@0 339
Chris@0 340 // Ensure the join information is set up properly.
Chris@0 341 // Tests the join definition between the base and the revision table.
Chris@0 342 $revision_field_data = $data['entity_test_mulrev_property_revision'];
Chris@0 343 $this->assertCount(1, $revision_field_data['table']['join']);
Chris@0 344 $this->assertEquals([
Chris@0 345 'entity_test_mulrev_field_data' => [
Chris@0 346 'left_field' => 'revision_id',
Chris@0 347 'field' => 'revision_id',
Chris@0 348 'type' => 'INNER',
Chris@0 349 ],
Chris@0 350 ], $revision_field_data['table']['join']);
Chris@0 351
Chris@0 352 $revision_base_data = $data['entity_test_mulrev_revision'];
Chris@0 353 $this->assertCount(1, $revision_base_data['table']['join']);
Chris@0 354 $this->assertEquals([
Chris@0 355 'entity_test_mulrev_property_revision' => [
Chris@0 356 'left_field' => 'revision_id',
Chris@0 357 'field' => 'revision_id',
Chris@0 358 'type' => 'INNER',
Chris@0 359 ],
Chris@0 360 ], $revision_base_data['table']['join']);
Chris@0 361 $this->assertFalse(isset($data['data_table']));
Chris@0 362 }
Chris@0 363
Chris@0 364 /**
Chris@0 365 * Helper method to mock all store definitions.
Chris@0 366 */
Chris@0 367 protected function setupFieldStorageDefinition() {
Chris@0 368 $id_field_storage_definition = $this->getMock('Drupal\Core\Field\FieldStorageDefinitionInterface');
Chris@0 369 $id_field_storage_definition->expects($this->any())
Chris@0 370 ->method('getSchema')
Chris@0 371 ->willReturn(IntegerItem::schema($id_field_storage_definition));
Chris@0 372 $uuid_field_storage_definition = $this->getMock('Drupal\Core\Field\FieldStorageDefinitionInterface');
Chris@0 373 $uuid_field_storage_definition->expects($this->any())
Chris@0 374 ->method('getSchema')
Chris@0 375 ->willReturn(UuidItem::schema($uuid_field_storage_definition));
Chris@0 376 $type_field_storage_definition = $this->getMock('Drupal\Core\Field\FieldStorageDefinitionInterface');
Chris@0 377 $type_field_storage_definition->expects($this->any())
Chris@0 378 ->method('getSchema')
Chris@0 379 ->willReturn(StringItem::schema($type_field_storage_definition));
Chris@0 380 $langcode_field_storage_definition = $this->getMock('Drupal\Core\Field\FieldStorageDefinitionInterface');
Chris@0 381 $langcode_field_storage_definition->expects($this->any())
Chris@0 382 ->method('getSchema')
Chris@0 383 ->willReturn(LanguageItem::schema($langcode_field_storage_definition));
Chris@0 384 $name_field_storage_definition = $this->getMock('Drupal\Core\Field\FieldStorageDefinitionInterface');
Chris@0 385 $name_field_storage_definition->expects($this->any())
Chris@0 386 ->method('getSchema')
Chris@0 387 ->willReturn(StringItem::schema($name_field_storage_definition));
Chris@0 388 $description_field_storage_definition = $this->getMock('Drupal\Core\Field\FieldStorageDefinitionInterface');
Chris@0 389 $description_field_storage_definition->expects($this->any())
Chris@0 390 ->method('getSchema')
Chris@0 391 ->willReturn(TextLongItem::schema($description_field_storage_definition));
Chris@0 392 $homepage_field_storage_definition = $this->getMock('Drupal\Core\Field\FieldStorageDefinitionInterface');
Chris@0 393 $homepage_field_storage_definition->expects($this->any())
Chris@0 394 ->method('getSchema')
Chris@0 395 ->willReturn(UriItem::schema($homepage_field_storage_definition));
Chris@0 396 $string_field_storage_definition = $this->getMock('Drupal\Core\Field\FieldStorageDefinitionInterface');
Chris@0 397 $string_field_storage_definition->expects($this->any())
Chris@0 398 ->method('getSchema')
Chris@0 399 ->willReturn(StringItem::schema($string_field_storage_definition));
Chris@0 400
Chris@0 401 // Setup the user_id entity reference field.
Chris@0 402 $this->entityManager->expects($this->any())
Chris@0 403 ->method('getDefinition')
Chris@0 404 ->willReturnMap([
Chris@0 405 ['user', TRUE, static::userEntityInfo()],
Chris@0 406 ]
Chris@0 407 );
Chris@0 408 $user_id_field_storage_definition = $this->getMock('Drupal\Core\Field\FieldStorageDefinitionInterface');
Chris@0 409 $user_id_field_storage_definition->expects($this->any())
Chris@0 410 ->method('getSetting')
Chris@0 411 ->with('target_type')
Chris@0 412 ->willReturn('user');
Chris@0 413 $user_id_field_storage_definition->expects($this->any())
Chris@0 414 ->method('getSettings')
Chris@0 415 ->willReturn(['target_type' => 'user']);
Chris@0 416 $user_id_field_storage_definition->expects($this->any())
Chris@0 417 ->method('getSchema')
Chris@0 418 ->willReturn(EntityReferenceItem::schema($user_id_field_storage_definition));
Chris@0 419
Chris@0 420 $revision_id_field_storage_definition = $this->getMock('Drupal\Core\Field\FieldStorageDefinitionInterface');
Chris@0 421 $revision_id_field_storage_definition->expects($this->any())
Chris@0 422 ->method('getSchema')
Chris@0 423 ->willReturn(IntegerItem::schema($revision_id_field_storage_definition));
Chris@0 424
Chris@0 425 $this->entityManager->expects($this->any())
Chris@0 426 ->method('getFieldStorageDefinitions')
Chris@0 427 ->willReturn([
Chris@0 428 'id' => $id_field_storage_definition,
Chris@0 429 'uuid' => $uuid_field_storage_definition,
Chris@0 430 'type' => $type_field_storage_definition,
Chris@0 431 'langcode' => $langcode_field_storage_definition,
Chris@0 432 'name' => $name_field_storage_definition,
Chris@0 433 'description' => $description_field_storage_definition,
Chris@0 434 'homepage' => $homepage_field_storage_definition,
Chris@0 435 'string' => $string_field_storage_definition,
Chris@0 436 'user_id' => $user_id_field_storage_definition,
Chris@0 437 'revision_id' => $revision_id_field_storage_definition,
Chris@0 438 ]);
Chris@0 439 }
Chris@0 440
Chris@0 441 /**
Chris@0 442 * Tests fields on the base table.
Chris@0 443 */
Chris@0 444 public function testBaseTableFields() {
Chris@0 445 $base_field_definitions = $this->setupBaseFields(EntityTest::baseFieldDefinitions($this->baseEntityType));
Chris@0 446 $user_base_field_definitions = [
Chris@0 447 'uid' => BaseFieldDefinition::create('integer')
Chris@0 448 ->setLabel('ID')
Chris@0 449 ->setDescription('The ID of the user entity.')
Chris@0 450 ->setReadOnly(TRUE)
Chris@0 451 ->setSetting('unsigned', TRUE)
Chris@0 452 ];
Chris@0 453 $this->entityManager->expects($this->any())
Chris@0 454 ->method('getBaseFieldDefinitions')
Chris@0 455 ->will($this->returnValueMap([
Chris@0 456 ['user', $user_base_field_definitions],
Chris@0 457 ['entity_test', $base_field_definitions],
Chris@0 458 ]));
Chris@0 459 // Setup the table mapping.
Chris@0 460 $table_mapping = $this->getMockBuilder(DefaultTableMapping::class)
Chris@0 461 ->disableOriginalConstructor()
Chris@0 462 ->getMock();
Chris@0 463 $table_mapping->expects($this->any())
Chris@0 464 ->method('getTableNames')
Chris@0 465 ->willReturn(['entity_test', 'entity_test__string']);
Chris@0 466 $table_mapping->expects($this->any())
Chris@0 467 ->method('getColumnNames')
Chris@0 468 ->willReturnMap([
Chris@0 469 ['id', ['value' => 'id']],
Chris@0 470 ['uuid', ['value' => 'uuid']],
Chris@0 471 ['type', ['value' => 'type']],
Chris@0 472 ['langcode', ['value' => 'langcode']],
Chris@0 473 ['name', ['value' => 'name']],
Chris@0 474 ['description', ['value' => 'description__value', 'format' => 'description__format']],
Chris@0 475 ['homepage', ['value' => 'homepage']],
Chris@0 476 ['user_id', ['target_id' => 'user_id']],
Chris@0 477 ['string', ['value' => 'value']],
Chris@0 478 ]);
Chris@0 479 $table_mapping->expects($this->any())
Chris@0 480 ->method('getFieldNames')
Chris@0 481 ->willReturnMap([
Chris@0 482 ['entity_test', ['id', 'uuid', 'type', 'langcode', 'name', 'description', 'homepage', 'user_id']],
Chris@0 483 ['entity_test__string', ['string']],
Chris@0 484 ]);
Chris@0 485 $table_mapping->expects($this->any())
Chris@0 486 ->method('requiresDedicatedTableStorage')
Chris@0 487 ->willReturnCallback(function (BaseFieldDefinition $base_field) {
Chris@0 488 return $base_field->getName() === 'string';
Chris@0 489 });
Chris@0 490 $table_mapping->expects($this->any())
Chris@0 491 ->method('getDedicatedDataTableName')
Chris@0 492 ->willReturnCallback(function (BaseFieldDefinition $base_field) {
Chris@0 493 if ($base_field->getName() === 'string') {
Chris@0 494 return 'entity_test__string';
Chris@0 495 }
Chris@0 496 });
Chris@0 497
Chris@0 498 $this->entityStorage->expects($this->once())
Chris@0 499 ->method('getTableMapping')
Chris@0 500 ->willReturn($table_mapping);
Chris@0 501
Chris@0 502 $this->setupFieldStorageDefinition();
Chris@0 503
Chris@0 504 $data = $this->viewsData->getViewsData();
Chris@0 505
Chris@0 506 $this->assertNumericField($data['entity_test']['id']);
Chris@0 507 $this->assertField($data['entity_test']['id'], 'id');
Chris@0 508 $this->assertUuidField($data['entity_test']['uuid']);
Chris@0 509 $this->assertField($data['entity_test']['uuid'], 'uuid');
Chris@0 510 $this->assertStringField($data['entity_test']['type']);
Chris@0 511 $this->assertEquals('type', $data['entity_test']['type']['entity field']);
Chris@0 512
Chris@0 513 $this->assertLanguageField($data['entity_test']['langcode']);
Chris@0 514 $this->assertField($data['entity_test']['langcode'], 'langcode');
Chris@0 515 $this->assertEquals('Original language', $data['entity_test']['langcode']['title']);
Chris@0 516
Chris@0 517 $this->assertStringField($data['entity_test']['name']);
Chris@0 518 $this->assertField($data['entity_test']['name'], 'name');
Chris@0 519
Chris@0 520 $this->assertLongTextField($data['entity_test'], 'description');
Chris@0 521 $this->assertField($data['entity_test']['description__value'], 'description');
Chris@0 522 $this->assertField($data['entity_test']['description__format'], 'description');
Chris@0 523
Chris@0 524 $this->assertUriField($data['entity_test']['homepage']);
Chris@0 525 $this->assertField($data['entity_test']['homepage'], 'homepage');
Chris@0 526
Chris@0 527 $this->assertEntityReferenceField($data['entity_test']['user_id']);
Chris@0 528 $this->assertField($data['entity_test']['user_id'], 'user_id');
Chris@0 529
Chris@0 530 $relationship = $data['entity_test']['user_id']['relationship'];
Chris@0 531 $this->assertEquals('users_field_data', $relationship['base']);
Chris@0 532 $this->assertEquals('uid', $relationship['base field']);
Chris@0 533
Chris@0 534 $this->assertStringField($data['entity_test__string']['string']);
Chris@0 535 $this->assertField($data['entity_test__string']['string'], 'string');
Chris@0 536 $this->assertEquals([
Chris@0 537 'left_field' => 'id',
Chris@0 538 'field' => 'entity_id',
Chris@0 539 'extra' => [[
Chris@0 540 'field' => 'deleted',
Chris@0 541 'value' => 0,
Chris@0 542 'numeric' => TRUE,
Chris@0 543 ],
Chris@0 544 ],
Chris@0 545 ], $data['entity_test__string']['table']['join']['entity_test']);
Chris@0 546 }
Chris@0 547
Chris@0 548 /**
Chris@0 549 * Tests fields on the data table.
Chris@0 550 */
Chris@0 551 public function testDataTableFields() {
Chris@0 552 $entity_type = $this->baseEntityType
Chris@0 553 ->set('data_table', 'entity_test_mul_property_data')
Chris@0 554 ->set('base_table', 'entity_test_mul')
Chris@0 555 ->set('id', 'entity_test_mul')
Chris@0 556 ->setKey('bundle', 'type');
Chris@0 557 $base_field_definitions = $this->setupBaseFields(EntityTestMul::baseFieldDefinitions($this->baseEntityType));
Chris@0 558 $base_field_definitions['type'] = BaseFieldDefinition::create('entity_reference')
Chris@0 559 ->setLabel('entity test type')
Chris@0 560 ->setSetting('target_type', 'entity_test_bundle')
Chris@0 561 ->setTranslatable(TRUE);
Chris@0 562 $base_field_definitions = $this->setupBaseFields($base_field_definitions);
Chris@0 563 $user_base_field_definitions = [
Chris@0 564 'uid' => BaseFieldDefinition::create('integer')
Chris@0 565 ->setLabel('ID')
Chris@0 566 ->setDescription('The ID of the user entity.')
Chris@0 567 ->setReadOnly(TRUE)
Chris@0 568 ->setSetting('unsigned', TRUE)
Chris@0 569 ];
Chris@0 570 $entity_test_type = new ConfigEntityType(['id' => 'entity_test_bundle']);
Chris@0 571
Chris@0 572 $this->entityManager->expects($this->any())
Chris@0 573 ->method('getBaseFieldDefinitions')
Chris@0 574 ->will($this->returnValueMap([
Chris@0 575 ['user', $user_base_field_definitions],
Chris@0 576 ['entity_test_mul', $base_field_definitions],
Chris@0 577 ]));
Chris@0 578
Chris@0 579 $this->viewsData->setEntityType($entity_type);
Chris@0 580
Chris@0 581 // Setup the table mapping.
Chris@0 582 $table_mapping = $this->getMockBuilder(DefaultTableMapping::class)
Chris@0 583 ->disableOriginalConstructor()
Chris@0 584 ->getMock();
Chris@0 585 $table_mapping->expects($this->any())
Chris@0 586 ->method('getTableNames')
Chris@0 587 ->willReturn(['entity_test_mul', 'entity_test_mul_property_data', 'entity_test_mul__string']);
Chris@0 588 $table_mapping->expects($this->any())
Chris@0 589 ->method('getColumnNames')
Chris@0 590 ->willReturnMap([
Chris@0 591 ['id', ['value' => 'id']],
Chris@0 592 ['uuid', ['value' => 'uuid']],
Chris@0 593 ['type', ['value' => 'type']],
Chris@0 594 ['langcode', ['value' => 'langcode']],
Chris@0 595 ['name', ['value' => 'name']],
Chris@0 596 ['description', ['value' => 'description__value', 'format' => 'description__format']],
Chris@0 597 ['homepage', ['value' => 'homepage']],
Chris@0 598 ['user_id', ['target_id' => 'user_id']],
Chris@0 599 ['string', ['value' => 'value']],
Chris@0 600 ]);
Chris@0 601 $table_mapping->expects($this->any())
Chris@0 602 ->method('getFieldNames')
Chris@0 603 ->willReturnMap([
Chris@0 604 ['entity_test_mul', ['uuid']],
Chris@0 605 ['entity_test_mul_property_data', ['id', 'type', 'langcode', 'name', 'description', 'homepage', 'user_id']],
Chris@0 606 ['entity_test_mul__string', ['string']],
Chris@0 607 ]);
Chris@0 608
Chris@0 609 $table_mapping->expects($this->any())
Chris@0 610 ->method('getFieldTableName')
Chris@0 611 ->willReturnCallback(function ($field) {
Chris@0 612 if ($field == 'uuid') {
Chris@0 613 return 'entity_test_mul';
Chris@0 614 }
Chris@0 615 return 'entity_test_mul_property_data';
Chris@0 616 });
Chris@0 617 $table_mapping->expects($this->any())
Chris@0 618 ->method('requiresDedicatedTableStorage')
Chris@0 619 ->willReturnCallback(function (BaseFieldDefinition $base_field) {
Chris@0 620 return $base_field->getName() === 'string';
Chris@0 621 });
Chris@0 622 $table_mapping->expects($this->any())
Chris@0 623 ->method('getDedicatedDataTableName')
Chris@0 624 ->willReturnCallback(function (BaseFieldDefinition $base_field) {
Chris@0 625 if ($base_field->getName() === 'string') {
Chris@0 626 return 'entity_test_mul__string';
Chris@0 627 }
Chris@0 628 });
Chris@0 629
Chris@0 630 $this->entityStorage->expects($this->once())
Chris@0 631 ->method('getTableMapping')
Chris@0 632 ->willReturn($table_mapping);
Chris@0 633
Chris@0 634 $this->setupFieldStorageDefinition();
Chris@0 635
Chris@0 636 $user_entity_type = static::userEntityInfo();
Chris@0 637 $this->entityManager->expects($this->any())
Chris@0 638 ->method('getDefinition')
Chris@0 639 ->will($this->returnValueMap([
Chris@0 640 ['user', TRUE, $user_entity_type],
Chris@0 641 ['entity_test_bundle', TRUE, $entity_test_type],
Chris@0 642 ]));
Chris@0 643
Chris@0 644 $data = $this->viewsData->getViewsData();
Chris@0 645
Chris@0 646 // Check the base fields.
Chris@0 647 $this->assertFalse(isset($data['entity_test_mul']['id']));
Chris@0 648 $this->assertFalse(isset($data['entity_test_mul']['type']));
Chris@0 649 $this->assertUuidField($data['entity_test_mul']['uuid']);
Chris@0 650 $this->assertField($data['entity_test_mul']['uuid'], 'uuid');
Chris@0 651
Chris@0 652 $this->assertFalse(isset($data['entity_test_mul']['type']['relationship']));
Chris@0 653
Chris@0 654 // Also ensure that field_data only fields don't appear on the base table.
Chris@0 655 $this->assertFalse(isset($data['entity_test_mul']['name']));
Chris@0 656 $this->assertFalse(isset($data['entity_test_mul']['description']));
Chris@0 657 $this->assertFalse(isset($data['entity_test_mul']['description__value']));
Chris@0 658 $this->assertFalse(isset($data['entity_test_mul']['description__format']));
Chris@0 659 $this->assertFalse(isset($data['entity_test_mul']['user_id']));
Chris@0 660 $this->assertFalse(isset($data['entity_test_mul']['homepage']));
Chris@0 661
Chris@0 662 // Check the data fields.
Chris@0 663 $this->assertNumericField($data['entity_test_mul_property_data']['id']);
Chris@0 664 $this->assertField($data['entity_test_mul_property_data']['id'], 'id');
Chris@0 665
Chris@0 666 $this->assertBundleField($data['entity_test_mul_property_data']['type']);
Chris@0 667 $this->assertField($data['entity_test_mul_property_data']['type'], 'type');
Chris@0 668
Chris@0 669 $this->assertLanguageField($data['entity_test_mul_property_data']['langcode']);
Chris@0 670 $this->assertField($data['entity_test_mul_property_data']['langcode'], 'langcode');
Chris@0 671 $this->assertEquals('Translation language', $data['entity_test_mul_property_data']['langcode']['title']);
Chris@0 672
Chris@0 673 $this->assertStringField($data['entity_test_mul_property_data']['name']);
Chris@0 674 $this->assertField($data['entity_test_mul_property_data']['name'], 'name');
Chris@0 675
Chris@0 676 $this->assertLongTextField($data['entity_test_mul_property_data'], 'description');
Chris@0 677 $this->assertField($data['entity_test_mul_property_data']['description__value'], 'description');
Chris@0 678 $this->assertField($data['entity_test_mul_property_data']['description__format'], 'description');
Chris@0 679
Chris@0 680 $this->assertUriField($data['entity_test_mul_property_data']['homepage']);
Chris@0 681 $this->assertField($data['entity_test_mul_property_data']['homepage'], 'homepage');
Chris@0 682
Chris@0 683 $this->assertEntityReferenceField($data['entity_test_mul_property_data']['user_id']);
Chris@0 684 $this->assertField($data['entity_test_mul_property_data']['user_id'], 'user_id');
Chris@0 685 $relationship = $data['entity_test_mul_property_data']['user_id']['relationship'];
Chris@0 686 $this->assertEquals('users_field_data', $relationship['base']);
Chris@0 687 $this->assertEquals('uid', $relationship['base field']);
Chris@0 688
Chris@0 689 $this->assertStringField($data['entity_test_mul__string']['string']);
Chris@0 690 $this->assertField($data['entity_test_mul__string']['string'], 'string');
Chris@0 691 $this->assertEquals([
Chris@0 692 'left_field' => 'id',
Chris@0 693 'field' => 'entity_id',
Chris@0 694 'extra' => [[
Chris@0 695 'field' => 'deleted',
Chris@0 696 'value' => 0,
Chris@0 697 'numeric' => TRUE,
Chris@0 698 ],
Chris@0 699 ],
Chris@0 700 ], $data['entity_test_mul__string']['table']['join']['entity_test_mul']);
Chris@0 701 }
Chris@0 702
Chris@0 703 /**
Chris@0 704 * Tests fields on the revision table.
Chris@0 705 */
Chris@0 706 public function testRevisionTableFields() {
Chris@0 707 $entity_type = $this->baseEntityType
Chris@0 708 ->set('base_table', 'entity_test_mulrev')
Chris@0 709 ->set('revision_table', 'entity_test_mulrev_revision')
Chris@0 710 ->set('data_table', 'entity_test_mulrev_property_data')
Chris@0 711 ->set('revision_data_table', 'entity_test_mulrev_property_revision')
Chris@0 712 ->set('id', 'entity_test_mulrev')
Chris@0 713 ->set('translatable', TRUE);
Chris@0 714 $base_field_definitions = $this->setupBaseFields(EntityTestMulRev::baseFieldDefinitions($this->baseEntityType));
Chris@0 715 $user_base_field_definitions = [
Chris@0 716 'uid' => BaseFieldDefinition::create('integer')
Chris@0 717 ->setLabel('ID')
Chris@0 718 ->setDescription('The ID of the user entity.')
Chris@0 719 ->setReadOnly(TRUE)
Chris@0 720 ->setSetting('unsigned', TRUE)
Chris@0 721 ];
Chris@0 722 $this->entityManager->expects($this->any())
Chris@0 723 ->method('getBaseFieldDefinitions')
Chris@0 724 ->will($this->returnValueMap([
Chris@0 725 ['user', $user_base_field_definitions],
Chris@0 726 ['entity_test_mulrev', $base_field_definitions],
Chris@0 727 ]));
Chris@0 728
Chris@0 729 $this->viewsData->setEntityType($entity_type);
Chris@0 730
Chris@0 731 // Setup the table mapping.
Chris@0 732 $table_mapping = $this->getMockBuilder(DefaultTableMapping::class)
Chris@0 733 ->disableOriginalConstructor()
Chris@0 734 ->getMock();
Chris@0 735 $table_mapping->expects($this->any())
Chris@0 736 ->method('getTableNames')
Chris@0 737 ->willReturn(['entity_test_mulrev', 'entity_test_mulrev_revision', 'entity_test_mulrev_property_data', 'entity_test_mulrev_property_revision', 'entity_test_mulrev__string', 'entity_test_mulrev_revision__string']);
Chris@0 738 $table_mapping->expects($this->any())
Chris@0 739 ->method('getColumnNames')
Chris@0 740 ->willReturnMap([
Chris@0 741 ['id', ['value' => 'id']],
Chris@0 742 ['uuid', ['value' => 'uuid']],
Chris@0 743 ['type', ['value' => 'type']],
Chris@0 744 ['langcode', ['value' => 'langcode']],
Chris@0 745 ['name', ['value' => 'name']],
Chris@0 746 ['description', ['value' => 'description__value', 'format' => 'description__format']],
Chris@0 747 ['homepage', ['value' => 'homepage']],
Chris@0 748 ['user_id', ['target_id' => 'user_id']],
Chris@0 749 ['revision_id', ['value' => 'id']],
Chris@0 750 ['string', ['value' => 'value']],
Chris@0 751 ]);
Chris@0 752 $table_mapping->expects($this->any())
Chris@0 753 ->method('getFieldNames')
Chris@0 754 ->willReturnMap([
Chris@0 755 ['entity_test_mulrev', ['id', 'revision_id', 'uuid', 'type']],
Chris@0 756 ['entity_test_mulrev_revision', ['id', 'revision_id', 'langcode']],
Chris@0 757 ['entity_test_mulrev_property_data', ['id', 'revision_id', 'langcode', 'name', 'description', 'homepage', 'user_id']],
Chris@0 758 ['entity_test_mulrev_property_revision', ['id', 'revision_id', 'langcode', 'name', 'description', 'homepage', 'user_id']],
Chris@0 759 ['entity_test_mulrev__string', ['string']],
Chris@0 760 ['entity_test_mulrev_revision__string', ['string']],
Chris@0 761 ]);
Chris@0 762 $table_mapping->expects($this->any())
Chris@0 763 ->method('requiresDedicatedTableStorage')
Chris@0 764 ->willReturnCallback(function (BaseFieldDefinition $base_field) {
Chris@0 765 return $base_field->getName() === 'string';
Chris@0 766 });
Chris@0 767 $table_mapping->expects($this->any())
Chris@0 768 ->method('getDedicatedDataTableName')
Chris@0 769 ->willReturnCallback(function (BaseFieldDefinition $base_field) {
Chris@0 770 if ($base_field->getName() === 'string') {
Chris@0 771 return 'entity_test_mulrev__string';
Chris@0 772 }
Chris@0 773 });
Chris@0 774
Chris@0 775 $table_mapping->expects($this->any())
Chris@0 776 ->method('getDedicatedRevisionTableName')
Chris@0 777 ->willReturnCallback(function (BaseFieldDefinition $base_field) {
Chris@0 778 if ($base_field->getName() === 'string') {
Chris@0 779 return 'entity_test_mulrev_revision__string';
Chris@0 780 }
Chris@0 781 });
Chris@0 782
Chris@0 783 $table_mapping->expects($this->any())
Chris@0 784 ->method('getFieldTableName')
Chris@0 785 ->willReturnCallback(function ($field) {
Chris@0 786 if ($field == 'uuid') {
Chris@0 787 return 'entity_test_mulrev';
Chris@0 788 }
Chris@0 789 return 'entity_test_mulrev_property_data';
Chris@0 790 });
Chris@0 791
Chris@0 792 $this->entityStorage->expects($this->once())
Chris@0 793 ->method('getTableMapping')
Chris@0 794 ->willReturn($table_mapping);
Chris@0 795
Chris@0 796 $this->setupFieldStorageDefinition();
Chris@0 797
Chris@0 798 $data = $this->viewsData->getViewsData();
Chris@0 799
Chris@0 800 // Check the base fields.
Chris@0 801 $this->assertFalse(isset($data['entity_test_mulrev']['id']));
Chris@0 802 $this->assertFalse(isset($data['entity_test_mulrev']['type']));
Chris@0 803 $this->assertFalse(isset($data['entity_test_mulrev']['revision_id']));
Chris@0 804 $this->assertUuidField($data['entity_test_mulrev']['uuid']);
Chris@0 805 $this->assertField($data['entity_test_mulrev']['uuid'], 'uuid');
Chris@0 806
Chris@0 807 // Also ensure that field_data only fields don't appear on the base table.
Chris@0 808 $this->assertFalse(isset($data['entity_test_mulrev']['name']));
Chris@0 809 $this->assertFalse(isset($data['entity_test_mul']['description']));
Chris@0 810 $this->assertFalse(isset($data['entity_test_mul']['description__value']));
Chris@0 811 $this->assertFalse(isset($data['entity_test_mul']['description__format']));
Chris@0 812 $this->assertFalse(isset($data['entity_test_mul']['homepage']));
Chris@0 813 $this->assertFalse(isset($data['entity_test_mulrev']['langcode']));
Chris@0 814 $this->assertFalse(isset($data['entity_test_mulrev']['user_id']));
Chris@0 815
Chris@0 816 // Check the revision fields. The revision ID should only appear in the data
Chris@0 817 // table.
Chris@0 818 $this->assertFalse(isset($data['entity_test_mulrev_revision']['revision_id']));
Chris@0 819
Chris@0 820 // Also ensure that field_data only fields don't appear on the revision table.
Chris@0 821 $this->assertFalse(isset($data['entity_test_mulrev_revision']['id']));
Chris@0 822 $this->assertFalse(isset($data['entity_test_mulrev_revision']['name']));
Chris@0 823 $this->assertFalse(isset($data['entity_test_mulrev_revision']['description']));
Chris@0 824 $this->assertFalse(isset($data['entity_test_mulrev_revision']['description__value']));
Chris@0 825 $this->assertFalse(isset($data['entity_test_mulrev_revision']['description__format']));
Chris@0 826 $this->assertFalse(isset($data['entity_test_mulrev_revision']['homepage']));
Chris@0 827 $this->assertFalse(isset($data['entity_test_mulrev_revision']['user_id']));
Chris@0 828
Chris@0 829 // Check the data fields.
Chris@0 830 $this->assertNumericField($data['entity_test_mulrev_property_data']['id']);
Chris@0 831 $this->assertField($data['entity_test_mulrev_property_data']['id'], 'id');
Chris@0 832 $this->assertNumericField($data['entity_test_mulrev_property_data']['revision_id']);
Chris@0 833 $this->assertField($data['entity_test_mulrev_property_data']['revision_id'], 'revision_id');
Chris@0 834 $this->assertLanguageField($data['entity_test_mulrev_property_data']['langcode']);
Chris@0 835 $this->assertField($data['entity_test_mulrev_property_data']['langcode'], 'langcode');
Chris@0 836 $this->assertStringField($data['entity_test_mulrev_property_data']['name']);
Chris@0 837 $this->assertField($data['entity_test_mulrev_property_data']['name'], 'name');
Chris@0 838
Chris@0 839 $this->assertLongTextField($data['entity_test_mulrev_property_data'], 'description');
Chris@0 840 $this->assertField($data['entity_test_mulrev_property_data']['description__value'], 'description');
Chris@0 841 $this->assertField($data['entity_test_mulrev_property_data']['description__format'], 'description');
Chris@0 842 $this->assertUriField($data['entity_test_mulrev_property_data']['homepage']);
Chris@0 843 $this->assertField($data['entity_test_mulrev_property_data']['homepage'], 'homepage');
Chris@0 844
Chris@0 845 $this->assertEntityReferenceField($data['entity_test_mulrev_property_data']['user_id']);
Chris@0 846 $this->assertField($data['entity_test_mulrev_property_data']['user_id'], 'user_id');
Chris@0 847 $relationship = $data['entity_test_mulrev_property_data']['user_id']['relationship'];
Chris@0 848 $this->assertEquals('users_field_data', $relationship['base']);
Chris@0 849 $this->assertEquals('uid', $relationship['base field']);
Chris@0 850
Chris@0 851 // Check the property data fields.
Chris@0 852 $this->assertNumericField($data['entity_test_mulrev_property_revision']['id']);
Chris@0 853 $this->assertField($data['entity_test_mulrev_property_revision']['id'], 'id');
Chris@0 854
Chris@0 855 $this->assertLanguageField($data['entity_test_mulrev_property_revision']['langcode']);
Chris@0 856 $this->assertField($data['entity_test_mulrev_property_revision']['langcode'], 'langcode');
Chris@0 857 $this->assertEquals('Translation language', $data['entity_test_mulrev_property_revision']['langcode']['title']);
Chris@0 858
Chris@0 859 $this->assertStringField($data['entity_test_mulrev_property_revision']['name']);
Chris@0 860 $this->assertField($data['entity_test_mulrev_property_revision']['name'], 'name');
Chris@0 861
Chris@0 862 $this->assertLongTextField($data['entity_test_mulrev_property_revision'], 'description');
Chris@0 863 $this->assertField($data['entity_test_mulrev_property_revision']['description__value'], 'description');
Chris@0 864 $this->assertField($data['entity_test_mulrev_property_revision']['description__format'], 'description');
Chris@0 865
Chris@0 866 $this->assertUriField($data['entity_test_mulrev_property_revision']['homepage']);
Chris@0 867 $this->assertField($data['entity_test_mulrev_property_revision']['homepage'], 'homepage');
Chris@0 868
Chris@0 869 $this->assertEntityReferenceField($data['entity_test_mulrev_property_revision']['user_id']);
Chris@0 870 $this->assertField($data['entity_test_mulrev_property_revision']['user_id'], 'user_id');
Chris@0 871 $relationship = $data['entity_test_mulrev_property_revision']['user_id']['relationship'];
Chris@0 872 $this->assertEquals('users_field_data', $relationship['base']);
Chris@0 873 $this->assertEquals('uid', $relationship['base field']);
Chris@0 874
Chris@0 875 $this->assertStringField($data['entity_test_mulrev__string']['string']);
Chris@0 876 $this->assertField($data['entity_test_mulrev__string']['string'], 'string');
Chris@0 877 $this->assertEquals([
Chris@0 878 'left_field' => 'id',
Chris@0 879 'field' => 'entity_id',
Chris@0 880 'extra' => [[
Chris@0 881 'field' => 'deleted',
Chris@0 882 'value' => 0,
Chris@0 883 'numeric' => TRUE,
Chris@0 884 ],
Chris@0 885 ],
Chris@0 886 ], $data['entity_test_mulrev__string']['table']['join']['entity_test_mulrev_property_data']);
Chris@0 887
Chris@0 888 $this->assertStringField($data['entity_test_mulrev_revision__string']['string']);
Chris@0 889 $this->assertField($data['entity_test_mulrev_revision__string']['string'], 'string');
Chris@0 890 $this->assertEquals([
Chris@0 891 'left_field' => 'revision_id',
Chris@0 892 'field' => 'entity_id',
Chris@0 893 'extra' => [[
Chris@0 894 'field' => 'deleted',
Chris@0 895 'value' => 0,
Chris@0 896 'numeric' => TRUE,
Chris@0 897 ],
Chris@0 898 ],
Chris@0 899 ], $data['entity_test_mulrev_revision__string']['table']['join']['entity_test_mulrev_property_revision']);
Chris@0 900 }
Chris@0 901
Chris@0 902 /**
Chris@0 903 * Tests generic stuff per field.
Chris@0 904 *
Chris@0 905 * @param array $data
Chris@0 906 * The views data to check.
Chris@0 907 * @param string $field_name
Chris@0 908 * The entity field name.
Chris@0 909 */
Chris@0 910 protected function assertField($data, $field_name) {
Chris@0 911 $this->assertEquals($field_name, $data['entity field']);
Chris@0 912 }
Chris@0 913
Chris@0 914 /**
Chris@0 915 * Tests add link types.
Chris@0 916 */
Chris@0 917 public function testEntityLinks() {
Chris@0 918 $this->baseEntityType->setLinkTemplate('canonical', '/entity_test/{entity_test}');
Chris@0 919 $this->baseEntityType->setLinkTemplate('edit-form', '/entity_test/{entity_test}/edit');
Chris@0 920 $this->baseEntityType->setLinkTemplate('delete-form', '/entity_test/{entity_test}/delete');
Chris@0 921
Chris@0 922 $data = $this->viewsData->getViewsData();
Chris@0 923 $this->assertEquals('entity_link', $data['entity_test']['view_entity_test']['field']['id']);
Chris@0 924 $this->assertEquals('entity_link_edit', $data['entity_test']['edit_entity_test']['field']['id']);
Chris@0 925 $this->assertEquals('entity_link_delete', $data['entity_test']['delete_entity_test']['field']['id']);
Chris@0 926 }
Chris@0 927
Chris@0 928 /**
Chris@0 929 * Tests additional edit links.
Chris@0 930 */
Chris@0 931 public function testEntityLinksJustEditForm() {
Chris@0 932 $this->baseEntityType->setLinkTemplate('edit-form', '/entity_test/{entity_test}/edit');
Chris@0 933
Chris@0 934 $data = $this->viewsData->getViewsData();
Chris@0 935 $this->assertFalse(isset($data['entity_test']['view_entity_test']));
Chris@0 936 $this->assertFalse(isset($data['entity_test']['delete_entity_test']));
Chris@0 937
Chris@0 938 $this->assertEquals('entity_link_edit', $data['entity_test']['edit_entity_test']['field']['id']);
Chris@0 939 }
Chris@0 940
Chris@0 941 /**
Chris@0 942 * @covers ::getViewsData
Chris@0 943 */
Chris@0 944 public function testGetViewsDataWithoutEntityOperations() {
Chris@0 945 // Make sure there is no list builder. The API does not document is
Chris@0 946 // supports resetting entity handlers, so this might break in the future.
Chris@0 947 $this->baseEntityType->setListBuilderClass(NULL);
Chris@0 948 $data = $this->viewsData->getViewsData();
Chris@0 949 $this->assertArrayNotHasKey('operations', $data[$this->baseEntityType->getBaseTable()]);
Chris@0 950 }
Chris@0 951
Chris@0 952 /**
Chris@0 953 * @covers ::getViewsData
Chris@0 954 */
Chris@0 955 public function testGetViewsDataWithEntityOperations() {
Chris@0 956 $this->baseEntityType->setListBuilderClass('\Drupal\Core\Entity\EntityListBuilder');
Chris@0 957 $data = $this->viewsData->getViewsData();
Chris@0 958 $this->assertSame('entity_operations', $data[$this->baseEntityType->getBaseTable()]['operations']['field']['id']);
Chris@0 959 }
Chris@0 960
Chris@0 961 /**
Chris@0 962 * Tests views data for a string field.
Chris@0 963 *
Chris@0 964 * @param $data
Chris@0 965 * The views data to check.
Chris@0 966 */
Chris@0 967 protected function assertStringField($data) {
Chris@0 968 $this->assertEquals('field', $data['field']['id']);
Chris@0 969 $this->assertEquals('string', $data['filter']['id']);
Chris@0 970 $this->assertEquals('string', $data['argument']['id']);
Chris@0 971 $this->assertEquals('standard', $data['sort']['id']);
Chris@0 972 }
Chris@0 973
Chris@0 974 /**
Chris@0 975 * Tests views data for a URI field.
Chris@0 976 *
Chris@0 977 * @param $data
Chris@0 978 * The views data to check.
Chris@0 979 */
Chris@0 980 protected function assertUriField($data) {
Chris@0 981 $this->assertEquals('field', $data['field']['id']);
Chris@0 982 $this->assertEquals('string', $data['field']['default_formatter']);
Chris@0 983 $this->assertEquals('string', $data['filter']['id']);
Chris@0 984 $this->assertEquals('string', $data['argument']['id']);
Chris@0 985 $this->assertEquals('standard', $data['sort']['id']);
Chris@0 986 }
Chris@0 987
Chris@0 988 /**
Chris@0 989 * Tests views data for a long text field.
Chris@0 990 *
Chris@0 991 * @param $data
Chris@0 992 * The views data for the table this field is in.
Chris@0 993 * @param $field_name
Chris@0 994 * The name of the field being checked.
Chris@0 995 */
Chris@0 996 protected function assertLongTextField($data, $field_name) {
Chris@0 997 $value_field = $data[$field_name . '__value'];
Chris@0 998 $this->assertEquals('field', $value_field['field']['id']);
Chris@0 999 $this->assertEquals($field_name . '__format', $value_field['field']['format']);
Chris@0 1000 $this->assertEquals('string', $value_field['filter']['id']);
Chris@0 1001 $this->assertEquals('string', $value_field['argument']['id']);
Chris@0 1002 $this->assertEquals('standard', $value_field['sort']['id']);
Chris@0 1003
Chris@0 1004 $this->assertStringField($data[$field_name . '__format']);
Chris@0 1005 }
Chris@0 1006
Chris@0 1007 /**
Chris@0 1008 * Tests views data for a UUID field.
Chris@0 1009 *
Chris@0 1010 * @param array $data
Chris@0 1011 * The views data to check.
Chris@0 1012 */
Chris@0 1013 protected function assertUuidField($data) {
Chris@0 1014 // @todo Can we provide additional support for UUIDs in views?
Chris@0 1015 $this->assertEquals('field', $data['field']['id']);
Chris@0 1016 $this->assertFalse($data['field']['click sortable']);
Chris@0 1017 $this->assertEquals('string', $data['filter']['id']);
Chris@0 1018 $this->assertEquals('string', $data['argument']['id']);
Chris@0 1019 $this->assertEquals('standard', $data['sort']['id']);
Chris@0 1020 }
Chris@0 1021
Chris@0 1022 /**
Chris@0 1023 * Tests views data for a numeric field.
Chris@0 1024 *
Chris@0 1025 * @param array $data
Chris@0 1026 * The views data to check.
Chris@0 1027 */
Chris@0 1028 protected function assertNumericField($data) {
Chris@0 1029 $this->assertEquals('field', $data['field']['id']);
Chris@0 1030 $this->assertEquals('numeric', $data['filter']['id']);
Chris@0 1031 $this->assertEquals('numeric', $data['argument']['id']);
Chris@0 1032 $this->assertEquals('standard', $data['sort']['id']);
Chris@0 1033 }
Chris@0 1034
Chris@0 1035 /**
Chris@0 1036 * Tests views data for a language field.
Chris@0 1037 *
Chris@0 1038 * @param array $data
Chris@0 1039 * The views data to check.
Chris@0 1040 */
Chris@0 1041 protected function assertLanguageField($data) {
Chris@0 1042 $this->assertEquals('field', $data['field']['id']);
Chris@0 1043 $this->assertEquals('language', $data['filter']['id']);
Chris@0 1044 $this->assertEquals('language', $data['argument']['id']);
Chris@0 1045 $this->assertEquals('standard', $data['sort']['id']);
Chris@0 1046 }
Chris@0 1047
Chris@0 1048 /**
Chris@0 1049 * Tests views data for a entity reference field.
Chris@0 1050 */
Chris@0 1051 protected function assertEntityReferenceField($data) {
Chris@0 1052 $this->assertEquals('field', $data['field']['id']);
Chris@0 1053 $this->assertEquals('numeric', $data['filter']['id']);
Chris@0 1054 $this->assertEquals('numeric', $data['argument']['id']);
Chris@0 1055 $this->assertEquals('standard', $data['sort']['id']);
Chris@0 1056 }
Chris@0 1057
Chris@0 1058 /**
Chris@0 1059 * Tests views data for a bundle field.
Chris@0 1060 */
Chris@0 1061 protected function assertBundleField($data) {
Chris@0 1062 $this->assertEquals('field', $data['field']['id']);
Chris@0 1063 $this->assertEquals('bundle', $data['filter']['id']);
Chris@0 1064 $this->assertEquals('string', $data['argument']['id']);
Chris@0 1065 $this->assertEquals('standard', $data['sort']['id']);
Chris@0 1066 }
Chris@0 1067
Chris@0 1068 /**
Chris@0 1069 * Returns entity info for the user entity.
Chris@0 1070 *
Chris@0 1071 * @return array
Chris@0 1072 */
Chris@0 1073 protected static function userEntityInfo() {
Chris@0 1074 return new ContentEntityType([
Chris@0 1075 'id' => 'user',
Chris@0 1076 'class' => 'Drupal\user\Entity\User',
Chris@0 1077 'label' => 'User',
Chris@0 1078 'base_table' => 'users',
Chris@0 1079 'data_table' => 'users_field_data',
Chris@0 1080 'entity_keys' => [
Chris@0 1081 'id' => 'uid',
Chris@0 1082 'uuid' => 'uuid',
Chris@0 1083 ],
Chris@0 1084 ]);
Chris@0 1085 }
Chris@0 1086
Chris@0 1087 }
Chris@0 1088
Chris@0 1089 class TestEntityViewsData extends EntityViewsData {
Chris@0 1090
Chris@0 1091 public function setEntityType(EntityTypeInterface $entity_type) {
Chris@0 1092 $this->entityType = $entity_type;
Chris@0 1093 }
Chris@0 1094
Chris@0 1095 }
Chris@0 1096
Chris@0 1097 class TestEntityType extends ContentEntityType {
Chris@0 1098
Chris@0 1099 /**
Chris@0 1100 * Sets a specific entity key.
Chris@0 1101 *
Chris@0 1102 * @param string $key
Chris@0 1103 * The name of the entity key.
Chris@0 1104 * @param string $value
Chris@0 1105 * The new value of the key.
Chris@0 1106 *
Chris@0 1107 * @return $this
Chris@0 1108 */
Chris@0 1109 public function setKey($key, $value) {
Chris@0 1110 $this->entity_keys[$key] = $value;
Chris@0 1111 return $this;
Chris@0 1112 }
Chris@0 1113
Chris@0 1114 }
Chris@0 1115
Chris@0 1116 namespace Drupal\entity_test\Entity;
Chris@0 1117
Chris@0 1118 if (!function_exists('t')) {
Chris@0 1119 function t($string, array $args = []) {
Chris@0 1120 return strtr($string, $args);
Chris@0 1121 }
Chris@0 1122 }
Chris@0 1123
Chris@0 1124
Chris@0 1125 namespace Drupal\Core\Entity;
Chris@0 1126
Chris@0 1127 if (!function_exists('t')) {
Chris@0 1128 function t($string, array $args = []) {
Chris@0 1129 return strtr($string, $args);
Chris@0 1130 }
Chris@0 1131 }