1<?php
2
3namespace Drupal\Tests\quickedit\Kernel;
4
5use Drupal\field\Entity\FieldConfig;
6use Drupal\KernelTests\KernelTestBase;
7use Drupal\field\Entity\FieldStorageConfig;
8
9/**
10 * Base class for testing Quick Edit functionality.
11 */
12abstract class QuickEditTestBase extends KernelTestBase {
13
14  /**
15   * Modules to enable.
16   *
17   * @var array
18   */
19  public static $modules = [
20    'system',
21    'entity_test',
22    'field',
23    'field_test',
24    'filter',
25    'user',
26    'text',
27    'quickedit',
28  ];
29
30  /**
31   * Bag of created fields.
32   *
33   * Allows easy access to test field names/IDs/objects via:
34   * - $this->fields->{$field_name}_field_storage
35   * - $this->fields->{$field_name}_instance
36   *
37   * @see \Drupal\quickedit\Tests\QuickEditTestBase::createFieldWithStorage()
38   *
39   * @var \ArrayObject
40   */
41  protected $fields;
42
43  /**
44   * Sets the default field storage backend for fields created during tests.
45   */
46  protected function setUp() {
47    parent::setUp();
48
49    $this->fields = new \ArrayObject([], \ArrayObject::ARRAY_AS_PROPS);
50
51    $this->installEntitySchema('user');
52    $this->installEntitySchema('entity_test');
53    $this->installConfig(['field', 'filter']);
54  }
55
56  /**
57   * Creates a field.
58   *
59   * @param string $field_name
60   *   The field name.
61   * @param string $type
62   *   The field type.
63   * @param int $cardinality
64   *   The field's cardinality.
65   * @param string $label
66   *   The field's label (used everywhere: widget label, formatter label).
67   * @param array $field_settings
68   * @param string $widget_type
69   *   The widget type.
70   * @param array $widget_settings
71   *   The widget settings.
72   * @param string $formatter_type
73   *   The formatter type.
74   * @param array $formatter_settings
75   *   The formatter settings.
76   */
77  protected function createFieldWithStorage($field_name, $type, $cardinality, $label, $field_settings, $widget_type, $widget_settings, $formatter_type, $formatter_settings) {
78    $field_storage = $field_name . '_field_storage';
79    $this->fields->$field_storage = FieldStorageConfig::create([
80      'field_name' => $field_name,
81      'entity_type' => 'entity_test',
82      'type' => $type,
83      'cardinality' => $cardinality,
84    ]);
85    $this->fields->$field_storage->save();
86
87    $field = $field_name . '_field';
88    $this->fields->$field = FieldConfig::create([
89      'field_storage' => $this->fields->$field_storage,
90      'bundle' => 'entity_test',
91      'label' => $label,
92      'description' => $label,
93      'weight' => mt_rand(0, 127),
94      'settings' => $field_settings,
95    ]);
96    $this->fields->$field->save();
97
98    /** @var \Drupal\Core\Entity\EntityDisplayRepositoryInterface $display_repository */
99    $display_repository = \Drupal::service('entity_display.repository');
100
101    $display_repository->getFormDisplay('entity_test', 'entity_test')
102      ->setComponent($field_name, [
103        'type' => $widget_type,
104        'settings' => $widget_settings,
105      ])
106      ->save();
107
108    $display_repository->getViewDisplay('entity_test', 'entity_test')
109      ->setComponent($field_name, [
110        'label' => 'above',
111        'type' => $formatter_type,
112        'settings' => $formatter_settings,
113      ])
114      ->save();
115  }
116
117}
118