annotate core/modules/field/tests/src/Kernel/FieldKernelTestBase.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 namespace Drupal\Tests\field\Kernel;
Chris@0 4
Chris@0 5 use Drupal\Core\Entity\EntityInterface;
Chris@0 6 use Drupal\Core\Language\LanguageInterface;
Chris@0 7 use Drupal\field\Entity\FieldConfig;
Chris@0 8 use Drupal\field\Entity\FieldStorageConfig;
Chris@0 9 use Drupal\KernelTests\KernelTestBase;
Chris@0 10
Chris@0 11 /**
Chris@0 12 * Parent class for Field API unit tests.
Chris@0 13 */
Chris@0 14 abstract class FieldKernelTestBase extends KernelTestBase {
Chris@0 15
Chris@0 16 /**
Chris@0 17 * Modules to enable.
Chris@0 18 *
Chris@0 19 * @var array
Chris@0 20 */
Chris@0 21 public static $modules = ['user', 'system', 'field', 'text', 'entity_test', 'field_test'];
Chris@0 22
Chris@0 23 /**
Chris@0 24 * Bag of created field storages and fields.
Chris@0 25 *
Chris@0 26 * Allows easy access to test field storage/field names/IDs/objects via:
Chris@0 27 * - $this->fieldTestData->field_name[suffix]
Chris@0 28 * - $this->fieldTestData->field_storage[suffix]
Chris@0 29 * - $this->fieldTestData->field_storage_uuid[suffix]
Chris@0 30 * - $this->fieldTestData->field[suffix]
Chris@0 31 * - $this->fieldTestData->field_definition[suffix]
Chris@0 32 *
Chris@0 33 * @see \Drupal\field\Tests\FieldUnitTestBase::createFieldWithStorage()
Chris@0 34 *
Chris@0 35 * @var \ArrayObject
Chris@0 36 */
Chris@0 37 protected $fieldTestData;
Chris@0 38
Chris@0 39 /**
Chris@0 40 * Set the default field storage backend for fields created during tests.
Chris@0 41 */
Chris@0 42 protected function setUp() {
Chris@0 43 parent::setUp();
Chris@0 44
Chris@0 45 $this->fieldTestData = new \ArrayObject([], \ArrayObject::ARRAY_AS_PROPS);
Chris@0 46
Chris@0 47 $this->installEntitySchema('entity_test');
Chris@0 48 $this->installEntitySchema('user');
Chris@0 49 $this->installSchema('system', ['sequences', 'key_value']);
Chris@0 50
Chris@0 51 // Set default storage backend and configure the theme system.
Chris@0 52 $this->installConfig(['field', 'system']);
Chris@0 53
Chris@0 54 // Create user 1.
Chris@0 55 $storage = \Drupal::entityManager()->getStorage('user');
Chris@0 56 $storage
Chris@0 57 ->create([
Chris@0 58 'uid' => 1,
Chris@0 59 'name' => 'entity-test',
Chris@0 60 'mail' => 'entity@localhost',
Chris@0 61 'status' => TRUE,
Chris@0 62 ])
Chris@0 63 ->save();
Chris@0 64 }
Chris@0 65
Chris@0 66 /**
Chris@0 67 * Create a field and an associated field storage.
Chris@0 68 *
Chris@0 69 * @param string $suffix
Chris@0 70 * (optional) A string that should only contain characters that are valid in
Chris@0 71 * PHP variable names as well.
Chris@0 72 * @param string $entity_type
Chris@0 73 * (optional) The entity type on which the field should be created.
Chris@0 74 * Defaults to "entity_test".
Chris@0 75 * @param string $bundle
Chris@0 76 * (optional) The entity type on which the field should be created.
Chris@0 77 * Defaults to the default bundle of the entity type.
Chris@0 78 */
Chris@0 79 protected function createFieldWithStorage($suffix = '', $entity_type = 'entity_test', $bundle = NULL) {
Chris@0 80 if (empty($bundle)) {
Chris@0 81 $bundle = $entity_type;
Chris@0 82 }
Chris@0 83 $field_name = 'field_name' . $suffix;
Chris@0 84 $field_storage = 'field_storage' . $suffix;
Chris@0 85 $field_storage_uuid = 'field_storage_uuid' . $suffix;
Chris@0 86 $field = 'field' . $suffix;
Chris@0 87 $field_definition = 'field_definition' . $suffix;
Chris@0 88
Chris@17 89 $this->fieldTestData->$field_name = mb_strtolower($this->randomMachineName() . '_field_name' . $suffix);
Chris@0 90 $this->fieldTestData->$field_storage = FieldStorageConfig::create([
Chris@0 91 'field_name' => $this->fieldTestData->$field_name,
Chris@0 92 'entity_type' => $entity_type,
Chris@0 93 'type' => 'test_field',
Chris@0 94 'cardinality' => 4,
Chris@0 95 ]);
Chris@0 96 $this->fieldTestData->$field_storage->save();
Chris@0 97 $this->fieldTestData->$field_storage_uuid = $this->fieldTestData->$field_storage->uuid();
Chris@0 98 $this->fieldTestData->$field_definition = [
Chris@0 99 'field_storage' => $this->fieldTestData->$field_storage,
Chris@0 100 'bundle' => $bundle,
Chris@0 101 'label' => $this->randomMachineName() . '_label',
Chris@0 102 'description' => $this->randomMachineName() . '_description',
Chris@0 103 'settings' => [
Chris@0 104 'test_field_setting' => $this->randomMachineName(),
Chris@0 105 ],
Chris@0 106 ];
Chris@0 107 $this->fieldTestData->$field = FieldConfig::create($this->fieldTestData->$field_definition);
Chris@0 108 $this->fieldTestData->$field->save();
Chris@0 109
Chris@0 110 entity_get_form_display($entity_type, $bundle, 'default')
Chris@0 111 ->setComponent($this->fieldTestData->$field_name, [
Chris@0 112 'type' => 'test_field_widget',
Chris@0 113 'settings' => [
Chris@0 114 'test_widget_setting' => $this->randomMachineName(),
Chris@17 115 ],
Chris@0 116 ])
Chris@0 117 ->save();
Chris@0 118 }
Chris@0 119
Chris@0 120 /**
Chris@0 121 * Saves and reloads an entity.
Chris@0 122 *
Chris@0 123 * @param \Drupal\Core\Entity\EntityInterface $entity
Chris@0 124 * The entity to save.
Chris@0 125 *
Chris@0 126 * @return \Drupal\Core\Entity\EntityInterface
Chris@0 127 * The entity, freshly reloaded from storage.
Chris@0 128 */
Chris@0 129 protected function entitySaveReload(EntityInterface $entity) {
Chris@0 130 $entity->save();
Chris@0 131 $controller = $this->container->get('entity.manager')->getStorage($entity->getEntityTypeId());
Chris@0 132 $controller->resetCache();
Chris@0 133 return $controller->load($entity->id());
Chris@0 134 }
Chris@0 135
Chris@0 136 /**
Chris@0 137 * Validate and save entity. Fail if violations are found.
Chris@0 138 *
Chris@0 139 * @param \Drupal\Core\Entity\EntityInterface $entity
Chris@0 140 * The entity to save.
Chris@0 141 */
Chris@0 142 protected function entityValidateAndSave(EntityInterface $entity) {
Chris@0 143 $violations = $entity->validate();
Chris@0 144 if ($violations->count()) {
Chris@0 145 $this->fail($violations);
Chris@0 146 }
Chris@0 147 else {
Chris@0 148 $entity->save();
Chris@0 149 }
Chris@0 150 }
Chris@0 151
Chris@0 152 /**
Chris@0 153 * Generate random values for a field_test field.
Chris@0 154 *
Chris@0 155 * @param $cardinality
Chris@0 156 * Number of values to generate.
Chris@0 157 * @return
Chris@0 158 * An array of random values, in the format expected for field values.
Chris@0 159 */
Chris@0 160 protected function _generateTestFieldValues($cardinality) {
Chris@0 161 $values = [];
Chris@0 162 for ($i = 0; $i < $cardinality; $i++) {
Chris@0 163 // field_test fields treat 0 as 'empty value'.
Chris@0 164 $values[$i]['value'] = mt_rand(1, 127);
Chris@0 165 }
Chris@0 166 return $values;
Chris@0 167 }
Chris@0 168
Chris@0 169 /**
Chris@0 170 * Assert that a field has the expected values in an entity.
Chris@0 171 *
Chris@0 172 * This function only checks a single column in the field values.
Chris@0 173 *
Chris@12 174 * @param \Drupal\Core\Entity\EntityInterface $entity
Chris@0 175 * The entity to test.
Chris@0 176 * @param $field_name
Chris@0 177 * The name of the field to test
Chris@0 178 * @param $expected_values
Chris@0 179 * The array of expected values.
Chris@0 180 * @param $langcode
Chris@0 181 * (Optional) The language code for the values. Defaults to
Chris@0 182 * \Drupal\Core\Language\LanguageInterface::LANGCODE_NOT_SPECIFIED.
Chris@0 183 * @param $column
Chris@0 184 * (Optional) The name of the column to check. Defaults to 'value'.
Chris@0 185 */
Chris@0 186 protected function assertFieldValues(EntityInterface $entity, $field_name, $expected_values, $langcode = LanguageInterface::LANGCODE_NOT_SPECIFIED, $column = 'value') {
Chris@0 187 // Re-load the entity to make sure we have the latest changes.
Chris@0 188 $storage = $this->container->get('entity_type.manager')
Chris@0 189 ->getStorage($entity->getEntityTypeId());
Chris@0 190 $storage->resetCache([$entity->id()]);
Chris@0 191 $e = $storage->load($this->entityId);
Chris@0 192
Chris@0 193 $field = $values = $e->getTranslation($langcode)->$field_name;
Chris@0 194 // Filter out empty values so that they don't mess with the assertions.
Chris@0 195 $field->filterEmptyItems();
Chris@0 196 $values = $field->getValue();
Chris@0 197 $this->assertEqual(count($values), count($expected_values), 'Expected number of values were saved.');
Chris@0 198 foreach ($expected_values as $key => $value) {
Chris@0 199 $this->assertEqual($values[$key][$column], $value, format_string('Value @value was saved correctly.', ['@value' => $value]));
Chris@0 200 }
Chris@0 201 }
Chris@0 202
Chris@0 203 }