annotate core/modules/field/tests/src/Kernel/FieldKernelTestBase.php @ 12:7a779792577d

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