annotate core/modules/views/tests/src/Unit/EntityViewsDataTest.php @ 19:fa3358dc1485 tip

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