diff core/modules/field/tests/src/Kernel/FieldDataCountTest.php @ 0:4c8ae668cc8c

Initial import (non-working)
author Chris Cannam
date Wed, 29 Nov 2017 16:09:58 +0000
parents
children af1871eacc83
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/core/modules/field/tests/src/Kernel/FieldDataCountTest.php	Wed Nov 29 16:09:58 2017 +0000
@@ -0,0 +1,181 @@
+<?php
+
+namespace Drupal\Tests\field\Kernel;
+
+use Drupal\Core\Entity\Sql\SqlContentEntityStorage;
+use Drupal\entity_test\Entity\EntityTest;
+use Drupal\field\Entity\FieldConfig;
+use Drupal\field\Entity\FieldStorageConfig;
+
+/**
+ * Tests counting field data records and the hasData() method on
+ * FieldStorageConfig entity.
+ *
+ * @group field
+ * @see \Drupal\Core\Entity\FieldableEntityStorageInterface::countFieldData()
+ * @see \Drupal\field\Entity\FieldStorageConfig::hasData()
+ */
+class FieldDataCountTest extends FieldKernelTestBase {
+
+  /**
+   * @var \Drupal\Core\Entity\DynamicallyFieldableEntityStorageInterface
+   */
+  protected $storage;
+
+  /**
+   * @var \Drupal\Core\Entity\DynamicallyFieldableEntityStorageInterface
+   */
+  protected $storageRev;
+
+  /**
+   * @var \Drupal\Core\Entity\DynamicallyFieldableEntityStorageInterface
+   */
+  protected $storageUser;
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function setUp() {
+    parent::setUp();
+    $this->installEntitySchema('entity_test_rev');
+    $this->storage = \Drupal::entityManager()->getStorage('entity_test');
+    $this->storageRev = \Drupal::entityManager()->getStorage('entity_test_rev');
+    $this->storageUser = \Drupal::entityManager()->getStorage('user');
+  }
+
+  /**
+   * Tests entityCount() and hadData() methods.
+   */
+  public function testEntityCountAndHasData() {
+    // Create a field with a cardinality of 2 to show that we are counting
+    // entities and not rows in a table.
+    /** @var \Drupal\field\Entity\FieldStorageConfig $field_storage */
+    $field_storage = FieldStorageConfig::create([
+      'field_name' => 'field_int',
+      'entity_type' => 'entity_test',
+      'type' => 'integer',
+      'cardinality' => 2,
+    ]);
+    $field_storage->save();
+    FieldConfig::create([
+      'field_storage' => $field_storage,
+      'bundle' => 'entity_test',
+    ])->save();
+
+    $this->assertIdentical($field_storage->hasdata(), FALSE, 'There are no entities with field data.');
+    $this->assertIdentical($this->storage->countFieldData($field_storage), 0, 'There are 0 entities with field data.');
+
+    // Create 1 entity without the field.
+    $entity = EntityTest::create();
+    $entity->name->value = $this->randomMachineName();
+    $entity->save();
+
+    $this->assertIdentical($field_storage->hasdata(), FALSE, 'There are no entities with field data.');
+    $this->assertIdentical($this->storage->countFieldData($field_storage), 0, 'There are 0 entities with field data.');
+
+    // Create 12 entities to ensure that the purging works as expected.
+    for ($i = 0; $i < 12; $i++) {
+      $entity = EntityTest::create();
+      $entity->field_int[] = mt_rand(1, 99);
+      $entity->field_int[] = mt_rand(1, 99);
+      $entity->name[] = $this->randomMachineName();
+      $entity->save();
+    }
+
+    $storage = \Drupal::entityManager()->getStorage('entity_test');
+    if ($storage instanceof SqlContentEntityStorage) {
+      // Count the actual number of rows in the field table.
+      $table_mapping = $storage->getTableMapping();
+      $field_table_name = $table_mapping->getDedicatedDataTableName($field_storage);
+      $result = db_select($field_table_name, 't')
+        ->fields('t')
+        ->countQuery()
+        ->execute()
+        ->fetchField();
+      $this->assertEqual($result, 24, 'The field table has 24 rows.');
+    }
+
+    $this->assertIdentical($field_storage->hasdata(), TRUE, 'There are entities with field data.');
+    $this->assertEqual($this->storage->countFieldData($field_storage), 12, 'There are 12 entities with field data.');
+
+    // Ensure the methods work on deleted fields.
+    $field_storage->delete();
+    $this->assertIdentical($field_storage->hasdata(), TRUE, 'There are entities with deleted field data.');
+    $this->assertEqual($this->storage->countFieldData($field_storage), 12, 'There are 12 entities with deleted field data.');
+
+    field_purge_batch(6);
+    $this->assertIdentical($field_storage->hasdata(), TRUE, 'There are entities with deleted field data.');
+    $this->assertEqual($this->storage->countFieldData($field_storage), 6, 'There are 6 entities with deleted field data.');
+
+    $entity_type = 'entity_test_rev';
+    $this->createFieldWithStorage('_2', $entity_type);
+
+    $entity_init = $this->container->get('entity_type.manager')
+      ->getStorage($entity_type)
+      ->create(['type' => $entity_type]);
+    $cardinality = $this->fieldTestData->field_storage_2->getCardinality();
+
+    $this->assertIdentical($this->fieldTestData->field_storage_2->hasData(), FALSE, 'There are no entities with field data.');
+    $this->assertIdentical($this->storageRev->countFieldData($this->fieldTestData->field_storage_2), 0, 'There are 0 entities with field data.');
+
+    // Create 1 entity with the field.
+    $entity = clone($entity_init);
+    $values = $this->_generateTestFieldValues($this->fieldTestData->field_storage_2->getCardinality());
+    $entity->{$this->fieldTestData->field_name_2} = $values;
+    $entity->setNewRevision();
+    $entity->save();
+    $first_revision = $entity->getRevisionId();
+
+    $this->assertIdentical($this->fieldTestData->field_storage_2->hasData(), TRUE, 'There are entities with field data.');
+    $this->assertIdentical($this->storageRev->countFieldData($this->fieldTestData->field_storage_2), 1, 'There is 1 entity with field data.');
+
+    $entity->{$this->fieldTestData->field_name_2} = [];
+    $entity->setNewRevision();
+    $entity->save();
+
+    $this->assertIdentical($this->fieldTestData->field_storage_2->hasData(), TRUE, 'There are entities with field data.');
+
+    $storage = $this->container->get('entity.manager')->getStorage($entity_type);
+    $entity = $storage->loadRevision($first_revision);
+    $this->assertEqual(count($entity->{$this->fieldTestData->field_name_2}), $cardinality, format_string('Revision %revision_id: expected number of values.', ['%revision_id' => $first_revision]));
+  }
+
+  /**
+   * Verify that we can count a table that contains an entry with index 0.
+   */
+  public function testCountWithIndex0() {
+    // Create a field that will require dedicated storage.
+    /** @var \Drupal\field\Entity\FieldStorageConfig $field_storage */
+    $field_storage = FieldStorageConfig::create([
+      'field_name' => 'field_int',
+      'entity_type' => 'user',
+      'type' => 'integer',
+      'cardinality' => 2,
+    ]);
+    $field_storage->save();
+    FieldConfig::create([
+      'field_storage' => $field_storage,
+      'bundle' => 'user',
+    ])->save();
+
+    // Create an entry for the anonymous user, who has user ID 0.
+    $user = $this->storageUser
+      ->create([
+        'uid' => 0,
+        'name' => 'anonymous',
+        'mail' => NULL,
+        'status' => FALSE,
+        'field_int' => 42,
+      ]);
+    $user->save();
+
+    // Test shared table storage.
+    $storage = $user->getFieldDefinition('name')->getFieldStorageDefinition();
+    $this->assertIdentical(TRUE, $this->storageUser->countFieldData($storage, TRUE));
+
+    // Test dedicated table storage.
+    $storage = $user->getFieldDefinition('field_int')->getFieldStorageDefinition();
+    $this->assertIdentical(TRUE, $this->storageUser->countFieldData($storage, TRUE));
+  }
+
+}