Updated Drupal to 8.6. This goes with the following updates because it's possible...
[yaffs-website] / web / core / modules / field / tests / src / Kernel / FieldDataCountTest.php
1 <?php
2
3 namespace Drupal\Tests\field\Kernel;
4
5 use Drupal\Core\Entity\Sql\SqlContentEntityStorage;
6 use Drupal\entity_test\Entity\EntityTest;
7 use Drupal\field\Entity\FieldConfig;
8 use Drupal\field\Entity\FieldStorageConfig;
9
10 /**
11  * Tests counting field data records and the hasData() method on
12  * FieldStorageConfig entity.
13  *
14  * @group field
15  * @see \Drupal\Core\Entity\FieldableEntityStorageInterface::countFieldData()
16  * @see \Drupal\field\Entity\FieldStorageConfig::hasData()
17  */
18 class FieldDataCountTest extends FieldKernelTestBase {
19
20   /**
21    * @var \Drupal\Core\Entity\DynamicallyFieldableEntityStorageInterface
22    */
23   protected $storage;
24
25   /**
26    * @var \Drupal\Core\Entity\DynamicallyFieldableEntityStorageInterface
27    */
28   protected $storageRev;
29
30   /**
31    * @var \Drupal\Core\Entity\DynamicallyFieldableEntityStorageInterface
32    */
33   protected $storageUser;
34
35   /**
36    * {@inheritdoc}
37    */
38   protected function setUp() {
39     parent::setUp();
40     $this->installEntitySchema('entity_test_rev');
41     $this->storage = \Drupal::entityManager()->getStorage('entity_test');
42     $this->storageRev = \Drupal::entityManager()->getStorage('entity_test_rev');
43     $this->storageUser = \Drupal::entityManager()->getStorage('user');
44   }
45
46   /**
47    * Tests entityCount() and hadData() methods.
48    */
49   public function testEntityCountAndHasData() {
50     // Create a field with a cardinality of 2 to show that we are counting
51     // entities and not rows in a table.
52     /** @var \Drupal\field\Entity\FieldStorageConfig $field_storage */
53     $field_storage = FieldStorageConfig::create([
54       'field_name' => 'field_int',
55       'entity_type' => 'entity_test',
56       'type' => 'integer',
57       'cardinality' => 2,
58     ]);
59     $field_storage->save();
60     FieldConfig::create([
61       'field_storage' => $field_storage,
62       'bundle' => 'entity_test',
63     ])->save();
64
65     $this->assertIdentical($field_storage->hasdata(), FALSE, 'There are no entities with field data.');
66     $this->assertIdentical($this->storage->countFieldData($field_storage), 0, 'There are 0 entities with field data.');
67
68     // Create 1 entity without the field.
69     $entity = EntityTest::create();
70     $entity->name->value = $this->randomMachineName();
71     $entity->save();
72
73     $this->assertIdentical($field_storage->hasdata(), FALSE, 'There are no entities with field data.');
74     $this->assertIdentical($this->storage->countFieldData($field_storage), 0, 'There are 0 entities with field data.');
75
76     // Create 12 entities to ensure that the purging works as expected.
77     for ($i = 0; $i < 12; $i++) {
78       $entity = EntityTest::create();
79       $entity->field_int[] = mt_rand(1, 99);
80       $entity->field_int[] = mt_rand(1, 99);
81       $entity->name[] = $this->randomMachineName();
82       $entity->save();
83     }
84
85     $storage = \Drupal::entityManager()->getStorage('entity_test');
86     if ($storage instanceof SqlContentEntityStorage) {
87       // Count the actual number of rows in the field table.
88       $table_mapping = $storage->getTableMapping();
89       $field_table_name = $table_mapping->getDedicatedDataTableName($field_storage);
90       $result = db_select($field_table_name, 't')
91         ->fields('t')
92         ->countQuery()
93         ->execute()
94         ->fetchField();
95       $this->assertEqual($result, 24, 'The field table has 24 rows.');
96     }
97
98     $this->assertIdentical($field_storage->hasdata(), TRUE, 'There are entities with field data.');
99     $this->assertEqual($this->storage->countFieldData($field_storage), 12, 'There are 12 entities with field data.');
100
101     // Ensure the methods work on deleted fields.
102     $field_storage->delete();
103     $this->assertIdentical($field_storage->hasdata(), TRUE, 'There are entities with deleted field data.');
104     $this->assertEqual($this->storage->countFieldData($field_storage), 12, 'There are 12 entities with deleted field data.');
105
106     field_purge_batch(6);
107     $this->assertIdentical($field_storage->hasdata(), TRUE, 'There are entities with deleted field data.');
108     $this->assertEqual($this->storage->countFieldData($field_storage), 6, 'There are 6 entities with deleted field data.');
109
110     $entity_type = 'entity_test_rev';
111     $this->createFieldWithStorage('_2', $entity_type);
112
113     $entity_init = $this->container->get('entity_type.manager')
114       ->getStorage($entity_type)
115       ->create(['type' => $entity_type]);
116     $cardinality = $this->fieldTestData->field_storage_2->getCardinality();
117
118     $this->assertIdentical($this->fieldTestData->field_storage_2->hasData(), FALSE, 'There are no entities with field data.');
119     $this->assertIdentical($this->storageRev->countFieldData($this->fieldTestData->field_storage_2), 0, 'There are 0 entities with field data.');
120
121     // Create 1 entity with the field.
122     $entity = clone($entity_init);
123     $values = $this->_generateTestFieldValues($this->fieldTestData->field_storage_2->getCardinality());
124     $entity->{$this->fieldTestData->field_name_2} = $values;
125     $entity->setNewRevision();
126     $entity->save();
127     $first_revision = $entity->getRevisionId();
128
129     $this->assertIdentical($this->fieldTestData->field_storage_2->hasData(), TRUE, 'There are entities with field data.');
130     $this->assertIdentical($this->storageRev->countFieldData($this->fieldTestData->field_storage_2), 1, 'There is 1 entity with field data.');
131
132     $entity->{$this->fieldTestData->field_name_2} = [];
133     $entity->setNewRevision();
134     $entity->save();
135
136     $this->assertIdentical($this->fieldTestData->field_storage_2->hasData(), TRUE, 'There are entities with field data.');
137
138     $storage = $this->container->get('entity.manager')->getStorage($entity_type);
139     $entity = $storage->loadRevision($first_revision);
140     $this->assertEqual(count($entity->{$this->fieldTestData->field_name_2}), $cardinality, format_string('Revision %revision_id: expected number of values.', ['%revision_id' => $first_revision]));
141   }
142
143   /**
144    * Verify that we can count a table that contains an entry with index 0.
145    */
146   public function testCountWithIndex0() {
147     // Create a field that will require dedicated storage.
148     /** @var \Drupal\field\Entity\FieldStorageConfig $field_storage */
149     $field_storage = FieldStorageConfig::create([
150       'field_name' => 'field_int',
151       'entity_type' => 'user',
152       'type' => 'integer',
153       'cardinality' => 2,
154     ]);
155     $field_storage->save();
156     FieldConfig::create([
157       'field_storage' => $field_storage,
158       'bundle' => 'user',
159     ])->save();
160
161     // Create an entry for the anonymous user, who has user ID 0.
162     $user = $this->storageUser
163       ->create([
164         'uid' => 0,
165         'name' => 'anonymous',
166         'mail' => NULL,
167         'status' => FALSE,
168         'field_int' => 42,
169       ]);
170     $user->save();
171
172     // Test shared table storage.
173     $storage = $user->getFieldDefinition('name')->getFieldStorageDefinition();
174     $this->assertIdentical(TRUE, $this->storageUser->countFieldData($storage, TRUE));
175
176     // Test dedicated table storage.
177     $storage = $user->getFieldDefinition('field_int')->getFieldStorageDefinition();
178     $this->assertIdentical(TRUE, $this->storageUser->countFieldData($storage, TRUE));
179   }
180
181 }