annotate core/modules/field/tests/src/Kernel/DisplayApiTest.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\Entity\EntityViewMode;
Chris@0 6 use Drupal\entity_test\Entity\EntityTest;
Chris@0 7 use Drupal\field\Entity\FieldConfig;
Chris@0 8 use Drupal\field\Entity\FieldStorageConfig;
Chris@0 9
Chris@0 10 /**
Chris@0 11 * Tests the field display API.
Chris@0 12 *
Chris@0 13 * @group field
Chris@0 14 */
Chris@0 15 class DisplayApiTest extends FieldKernelTestBase {
Chris@0 16
Chris@0 17 /**
Chris@0 18 * The field name to use in this test.
Chris@0 19 *
Chris@0 20 * @var string
Chris@0 21 */
Chris@0 22 protected $fieldName;
Chris@0 23
Chris@0 24 /**
Chris@0 25 * The field label to use in this test.
Chris@0 26 *
Chris@0 27 * @var string
Chris@0 28 */
Chris@0 29 protected $label;
Chris@0 30
Chris@0 31 /**
Chris@0 32 * The field cardinality to use in this test.
Chris@0 33 *
Chris@17 34 * @var int
Chris@0 35 */
Chris@0 36 protected $cardinality;
Chris@0 37
Chris@0 38 /**
Chris@0 39 * The field display options to use in this test.
Chris@0 40 *
Chris@0 41 * @var array
Chris@0 42 */
Chris@0 43 protected $displayOptions;
Chris@0 44
Chris@0 45 /**
Chris@0 46 * The test entity.
Chris@0 47 *
Chris@0 48 * @var \Drupal\Core\Entity\EntityInterface
Chris@0 49 */
Chris@0 50 protected $entity;
Chris@0 51
Chris@0 52 /**
Chris@0 53 * An array of random values, in the format expected for field values.
Chris@0 54 *
Chris@0 55 * @var array
Chris@0 56 */
Chris@0 57 protected $values;
Chris@0 58
Chris@0 59 /**
Chris@0 60 * {@inheritdoc}
Chris@0 61 */
Chris@0 62 public static $modules = ['system'];
Chris@0 63
Chris@0 64 protected function setUp() {
Chris@0 65 parent::setUp();
Chris@0 66
Chris@0 67 // Create a field and its storage.
Chris@0 68 $this->fieldName = 'test_field';
Chris@0 69 $this->label = $this->randomMachineName();
Chris@0 70 $this->cardinality = 4;
Chris@0 71
Chris@0 72 $field_storage = [
Chris@0 73 'field_name' => $this->fieldName,
Chris@0 74 'entity_type' => 'entity_test',
Chris@0 75 'type' => 'test_field',
Chris@0 76 'cardinality' => $this->cardinality,
Chris@0 77 ];
Chris@0 78 $field = [
Chris@0 79 'field_name' => $this->fieldName,
Chris@0 80 'entity_type' => 'entity_test',
Chris@0 81 'bundle' => 'entity_test',
Chris@0 82 'label' => $this->label,
Chris@0 83 ];
Chris@0 84
Chris@0 85 $this->displayOptions = [
Chris@0 86 'default' => [
Chris@0 87 'type' => 'field_test_default',
Chris@0 88 'settings' => [
Chris@0 89 'test_formatter_setting' => $this->randomMachineName(),
Chris@0 90 ],
Chris@0 91 ],
Chris@0 92 'teaser' => [
Chris@0 93 'type' => 'field_test_default',
Chris@0 94 'settings' => [
Chris@0 95 'test_formatter_setting' => $this->randomMachineName(),
Chris@0 96 ],
Chris@0 97 ],
Chris@0 98 ];
Chris@0 99
Chris@0 100 FieldStorageConfig::create($field_storage)->save();
Chris@0 101 FieldConfig::create($field)->save();
Chris@0 102 // Create a display for the default view mode.
Chris@0 103 entity_get_display($field['entity_type'], $field['bundle'], 'default')
Chris@0 104 ->setComponent($this->fieldName, $this->displayOptions['default'])
Chris@0 105 ->save();
Chris@0 106 // Create a display for the teaser view mode.
Chris@0 107 EntityViewMode::create(['id' => 'entity_test.teaser', 'targetEntityType' => 'entity_test'])->save();
Chris@0 108 entity_get_display($field['entity_type'], $field['bundle'], 'teaser')
Chris@0 109 ->setComponent($this->fieldName, $this->displayOptions['teaser'])
Chris@0 110 ->save();
Chris@0 111
Chris@0 112 // Create an entity with values.
Chris@0 113 $this->values = $this->_generateTestFieldValues($this->cardinality);
Chris@0 114 $this->entity = EntityTest::create();
Chris@0 115 $this->entity->{$this->fieldName}->setValue($this->values);
Chris@0 116 $this->entity->save();
Chris@0 117 }
Chris@0 118
Chris@0 119 /**
Chris@0 120 * Tests the FieldItemListInterface::view() method.
Chris@0 121 */
Chris@0 122 public function testFieldItemListView() {
Chris@0 123 $items = $this->entity->get($this->fieldName);
Chris@0 124
Chris@0 125 \Drupal::service('theme_handler')->install(['classy']);
Chris@0 126 $this->config('system.theme')->set('default', 'classy')->save();
Chris@0 127
Chris@0 128 // No display settings: check that default display settings are used.
Chris@0 129 $build = $items->view();
Chris@0 130 $this->render($build);
Chris@0 131 $settings = \Drupal::service('plugin.manager.field.formatter')->getDefaultSettings('field_test_default');
Chris@0 132 $setting = $settings['test_formatter_setting'];
Chris@0 133 $this->assertText($this->label, 'Label was displayed.');
Chris@0 134 foreach ($this->values as $delta => $value) {
Chris@0 135 $this->assertText($setting . '|' . $value['value'], format_string('Value @delta was displayed with expected setting.', ['@delta' => $delta]));
Chris@0 136 }
Chris@0 137
Chris@0 138 // Display settings: Check hidden field.
Chris@0 139 $display = [
Chris@0 140 'label' => 'hidden',
Chris@0 141 'type' => 'field_test_multiple',
Chris@0 142 'settings' => [
Chris@0 143 'test_formatter_setting_multiple' => $this->randomMachineName(),
Chris@0 144 'alter' => TRUE,
Chris@0 145 ],
Chris@0 146 ];
Chris@0 147 $build = $items->view($display);
Chris@0 148 $this->render($build);
Chris@0 149 $setting = $display['settings']['test_formatter_setting_multiple'];
Chris@0 150 $this->assertNoText($this->label, 'Label was not displayed.');
Chris@0 151 $this->assertText('field_test_entity_display_build_alter', 'Alter fired, display passed.');
Chris@0 152 $this->assertText('entity language is en', 'Language is placed onto the context.');
Chris@0 153 $array = [];
Chris@0 154 foreach ($this->values as $delta => $value) {
Chris@0 155 $array[] = $delta . ':' . $value['value'];
Chris@0 156 }
Chris@0 157 $this->assertText($setting . '|' . implode('|', $array), 'Values were displayed with expected setting.');
Chris@0 158
Chris@0 159 // Display settings: Check visually_hidden field.
Chris@0 160 $display = [
Chris@0 161 'label' => 'visually_hidden',
Chris@0 162 'type' => 'field_test_multiple',
Chris@0 163 'settings' => [
Chris@0 164 'test_formatter_setting_multiple' => $this->randomMachineName(),
Chris@0 165 'alter' => TRUE,
Chris@0 166 ],
Chris@0 167 ];
Chris@0 168 $build = $items->view($display);
Chris@0 169 $this->render($build);
Chris@0 170 $setting = $display['settings']['test_formatter_setting_multiple'];
Chris@0 171 $this->assertRaw('visually-hidden', 'Label was visually hidden.');
Chris@0 172 $this->assertText('field_test_entity_display_build_alter', 'Alter fired, display passed.');
Chris@0 173 $this->assertText('entity language is en', 'Language is placed onto the context.');
Chris@0 174 $array = [];
Chris@0 175 foreach ($this->values as $delta => $value) {
Chris@0 176 $array[] = $delta . ':' . $value['value'];
Chris@0 177 }
Chris@0 178 $this->assertText($setting . '|' . implode('|', $array), 'Values were displayed with expected setting.');
Chris@0 179
Chris@0 180 // Check the prepare_view steps are invoked.
Chris@0 181 $display = [
Chris@0 182 'label' => 'hidden',
Chris@0 183 'type' => 'field_test_with_prepare_view',
Chris@0 184 'settings' => [
Chris@0 185 'test_formatter_setting_additional' => $this->randomMachineName(),
Chris@0 186 ],
Chris@0 187 ];
Chris@0 188 $build = $items->view($display);
Chris@0 189 $this->render($build);
Chris@0 190 $setting = $display['settings']['test_formatter_setting_additional'];
Chris@0 191 $this->assertNoText($this->label, 'Label was not displayed.');
Chris@0 192 $this->assertNoText('field_test_entity_display_build_alter', 'Alter not fired.');
Chris@0 193 foreach ($this->values as $delta => $value) {
Chris@0 194 $this->assertText($setting . '|' . $value['value'] . '|' . ($value['value'] + 1), format_string('Value @delta was displayed with expected setting.', ['@delta' => $delta]));
Chris@0 195 }
Chris@0 196
Chris@0 197 // View mode: check that display settings specified in the display object
Chris@0 198 // are used.
Chris@0 199 $build = $items->view('teaser');
Chris@0 200 $this->render($build);
Chris@0 201 $setting = $this->displayOptions['teaser']['settings']['test_formatter_setting'];
Chris@0 202 $this->assertText($this->label, 'Label was displayed.');
Chris@0 203 foreach ($this->values as $delta => $value) {
Chris@0 204 $this->assertText($setting . '|' . $value['value'], format_string('Value @delta was displayed with expected setting.', ['@delta' => $delta]));
Chris@0 205 }
Chris@0 206
Chris@0 207 // Unknown view mode: check that display settings for 'default' view mode
Chris@0 208 // are used.
Chris@0 209 $build = $items->view('unknown_view_mode');
Chris@0 210 $this->render($build);
Chris@0 211 $setting = $this->displayOptions['default']['settings']['test_formatter_setting'];
Chris@0 212 $this->assertText($this->label, 'Label was displayed.');
Chris@0 213 foreach ($this->values as $delta => $value) {
Chris@0 214 $this->assertText($setting . '|' . $value['value'], format_string('Value @delta was displayed with expected setting.', ['@delta' => $delta]));
Chris@0 215 }
Chris@0 216 }
Chris@0 217
Chris@0 218 /**
Chris@0 219 * Tests the FieldItemInterface::view() method.
Chris@0 220 */
Chris@0 221 public function testFieldItemView() {
Chris@0 222 // No display settings: check that default display settings are used.
Chris@0 223 $settings = \Drupal::service('plugin.manager.field.formatter')->getDefaultSettings('field_test_default');
Chris@0 224 $setting = $settings['test_formatter_setting'];
Chris@0 225 foreach ($this->values as $delta => $value) {
Chris@0 226 $item = $this->entity->{$this->fieldName}[$delta];
Chris@0 227 $build = $item->view();
Chris@0 228 $this->render($build);
Chris@0 229 $this->assertText($setting . '|' . $value['value'], format_string('Value @delta was displayed with expected setting.', ['@delta' => $delta]));
Chris@0 230 }
Chris@0 231
Chris@0 232 // Check that explicit display settings are used.
Chris@0 233 $display = [
Chris@0 234 'type' => 'field_test_multiple',
Chris@0 235 'settings' => [
Chris@0 236 'test_formatter_setting_multiple' => $this->randomMachineName(),
Chris@0 237 ],
Chris@0 238 ];
Chris@0 239 $setting = $display['settings']['test_formatter_setting_multiple'];
Chris@0 240 foreach ($this->values as $delta => $value) {
Chris@0 241 $item = $this->entity->{$this->fieldName}[$delta];
Chris@0 242 $build = $item->view($display);
Chris@0 243 $this->render($build);
Chris@0 244 $this->assertText($setting . '|0:' . $value['value'], format_string('Value @delta was displayed with expected setting.', ['@delta' => $delta]));
Chris@0 245 }
Chris@0 246
Chris@0 247 // Check that prepare_view steps are invoked.
Chris@0 248 $display = [
Chris@0 249 'type' => 'field_test_with_prepare_view',
Chris@0 250 'settings' => [
Chris@0 251 'test_formatter_setting_additional' => $this->randomMachineName(),
Chris@0 252 ],
Chris@0 253 ];
Chris@0 254 $setting = $display['settings']['test_formatter_setting_additional'];
Chris@0 255 foreach ($this->values as $delta => $value) {
Chris@0 256 $item = $this->entity->{$this->fieldName}[$delta];
Chris@0 257 $build = $item->view($display);
Chris@0 258 $this->render($build);
Chris@0 259 $this->assertText($setting . '|' . $value['value'] . '|' . ($value['value'] + 1), format_string('Value @delta was displayed with expected setting.', ['@delta' => $delta]));
Chris@0 260 }
Chris@0 261
Chris@0 262 // View mode: check that display settings specified in the field are used.
Chris@0 263 $setting = $this->displayOptions['teaser']['settings']['test_formatter_setting'];
Chris@0 264 foreach ($this->values as $delta => $value) {
Chris@0 265 $item = $this->entity->{$this->fieldName}[$delta];
Chris@0 266 $build = $item->view('teaser');
Chris@0 267 $this->render($build);
Chris@0 268 $this->assertText($setting . '|' . $value['value'], format_string('Value @delta was displayed with expected setting.', ['@delta' => $delta]));
Chris@0 269 }
Chris@0 270
Chris@0 271 // Unknown view mode: check that display settings for 'default' view mode
Chris@0 272 // are used.
Chris@0 273 $setting = $this->displayOptions['default']['settings']['test_formatter_setting'];
Chris@0 274 foreach ($this->values as $delta => $value) {
Chris@0 275 $item = $this->entity->{$this->fieldName}[$delta];
Chris@0 276 $build = $item->view('unknown_view_mode');
Chris@0 277 $this->render($build);
Chris@0 278 $this->assertText($setting . '|' . $value['value'], format_string('Value @delta was displayed with expected setting.', ['@delta' => $delta]));
Chris@0 279 }
Chris@0 280 }
Chris@0 281
Chris@0 282 /**
Chris@0 283 * Tests that the prepareView() formatter method still fires for empty values.
Chris@0 284 */
Chris@0 285 public function testFieldEmpty() {
Chris@0 286 // Uses \Drupal\field_test\Plugin\Field\FieldFormatter\TestFieldEmptyFormatter.
Chris@0 287 $display = [
Chris@0 288 'label' => 'hidden',
Chris@0 289 'type' => 'field_empty_test',
Chris@0 290 'settings' => [
Chris@0 291 'test_empty_string' => '**EMPTY FIELD**' . $this->randomMachineName(),
Chris@0 292 ],
Chris@0 293 ];
Chris@0 294 // $this->entity is set by the setUp() method and by default contains 4
Chris@0 295 // numeric values. We only want to test the display of this one field.
Chris@0 296 $build = $this->entity->get($this->fieldName)->view($display);
Chris@0 297 $this->render($build);
Chris@0 298 // The test field by default contains values, so should not display the
Chris@0 299 // default "empty" text.
Chris@0 300 $this->assertNoText($display['settings']['test_empty_string']);
Chris@0 301
Chris@0 302 // Now remove the values from the test field and retest.
Chris@0 303 $this->entity->{$this->fieldName} = [];
Chris@0 304 $this->entity->save();
Chris@0 305 $build = $this->entity->get($this->fieldName)->view($display);
Chris@0 306 $this->render($build);
Chris@0 307 // This time, as the field values have been removed, we *should* show the
Chris@0 308 // default "empty" text.
Chris@0 309 $this->assertText($display['settings']['test_empty_string']);
Chris@0 310 }
Chris@0 311
Chris@0 312 }