Chris@0
|
1 <?php
|
Chris@0
|
2
|
Chris@0
|
3 namespace Drupal\Tests\datetime\Functional;
|
Chris@0
|
4
|
Chris@0
|
5 use Drupal\Component\Utility\Unicode;
|
Chris@0
|
6 use Drupal\Core\Entity\Entity\EntityFormDisplay;
|
Chris@0
|
7 use Drupal\Core\Entity\Entity\EntityViewDisplay;
|
Chris@0
|
8 use Drupal\datetime\Plugin\Field\FieldType\DateTimeItem;
|
Chris@0
|
9 use Drupal\entity_test\Entity\EntityTest;
|
Chris@0
|
10 use Drupal\field\Entity\FieldConfig;
|
Chris@0
|
11 use Drupal\field\Entity\FieldStorageConfig;
|
Chris@0
|
12 use Drupal\Tests\BrowserTestBase;
|
Chris@0
|
13
|
Chris@0
|
14 /**
|
Chris@0
|
15 * Provides a base class for testing Datetime field functionality.
|
Chris@0
|
16 */
|
Chris@0
|
17 abstract class DateTestBase extends BrowserTestBase {
|
Chris@0
|
18
|
Chris@0
|
19 /**
|
Chris@0
|
20 * Modules to enable.
|
Chris@0
|
21 *
|
Chris@0
|
22 * @var array
|
Chris@0
|
23 */
|
Chris@0
|
24 public static $modules = ['node', 'entity_test', 'datetime', 'field_ui'];
|
Chris@0
|
25
|
Chris@0
|
26 /**
|
Chris@0
|
27 * An array of display options to pass to entity_get_display()
|
Chris@0
|
28 *
|
Chris@0
|
29 * @var array
|
Chris@0
|
30 */
|
Chris@0
|
31 protected $displayOptions;
|
Chris@0
|
32
|
Chris@0
|
33 /**
|
Chris@0
|
34 * A field storage to use in this test class.
|
Chris@0
|
35 *
|
Chris@0
|
36 * @var \Drupal\field\Entity\FieldStorageConfig
|
Chris@0
|
37 */
|
Chris@0
|
38 protected $fieldStorage;
|
Chris@0
|
39
|
Chris@0
|
40 /**
|
Chris@0
|
41 * The field used in this test class.
|
Chris@0
|
42 *
|
Chris@0
|
43 * @var \Drupal\field\Entity\FieldConfig
|
Chris@0
|
44 */
|
Chris@0
|
45 protected $field;
|
Chris@0
|
46
|
Chris@0
|
47 /**
|
Chris@0
|
48 * The date formatter service.
|
Chris@0
|
49 *
|
Chris@0
|
50 * @var \Drupal\Core\Datetime\DateFormatterInterface
|
Chris@0
|
51 */
|
Chris@0
|
52 protected $dateFormatter;
|
Chris@0
|
53
|
Chris@0
|
54 /**
|
Chris@0
|
55 * An array of timezone extremes to test.
|
Chris@0
|
56 *
|
Chris@0
|
57 * @var string[]
|
Chris@0
|
58 */
|
Chris@0
|
59 protected static $timezones = [
|
Chris@0
|
60 // UTC-12, no DST.
|
Chris@0
|
61 'Pacific/Kwajalein',
|
Chris@0
|
62 // UTC-11, no DST
|
Chris@0
|
63 'Pacific/Midway',
|
Chris@0
|
64 // UTC-7, no DST.
|
Chris@0
|
65 'America/Phoenix',
|
Chris@0
|
66 // UTC.
|
Chris@0
|
67 'UTC',
|
Chris@0
|
68 // UTC+5:30, no DST.
|
Chris@0
|
69 'Asia/Kolkata',
|
Chris@0
|
70 // UTC+12, no DST
|
Chris@0
|
71 'Pacific/Funafuti',
|
Chris@0
|
72 // UTC+13, no DST.
|
Chris@0
|
73 'Pacific/Tongatapu',
|
Chris@0
|
74 ];
|
Chris@0
|
75
|
Chris@0
|
76 /**
|
Chris@0
|
77 * Returns the type of field to be tested.
|
Chris@0
|
78 *
|
Chris@0
|
79 * @return string
|
Chris@0
|
80 */
|
Chris@0
|
81 abstract protected function getTestFieldType();
|
Chris@0
|
82
|
Chris@0
|
83 /**
|
Chris@0
|
84 * {@inheritdoc}
|
Chris@0
|
85 */
|
Chris@0
|
86 protected function setUp() {
|
Chris@0
|
87 parent::setUp();
|
Chris@0
|
88
|
Chris@0
|
89 $web_user = $this->drupalCreateUser([
|
Chris@0
|
90 'access content',
|
Chris@0
|
91 'view test entity',
|
Chris@0
|
92 'administer entity_test content',
|
Chris@0
|
93 'administer entity_test form display',
|
Chris@0
|
94 'administer content types',
|
Chris@0
|
95 'administer node fields',
|
Chris@0
|
96 ]);
|
Chris@0
|
97 $this->drupalLogin($web_user);
|
Chris@0
|
98
|
Chris@0
|
99 // Create a field with settings to validate.
|
Chris@0
|
100 $this->createField();
|
Chris@0
|
101
|
Chris@0
|
102 $this->dateFormatter = $this->container->get('date.formatter');
|
Chris@0
|
103 }
|
Chris@0
|
104
|
Chris@0
|
105 /**
|
Chris@0
|
106 * Creates a date test field.
|
Chris@0
|
107 */
|
Chris@0
|
108 protected function createField() {
|
Chris@17
|
109 $field_name = mb_strtolower($this->randomMachineName());
|
Chris@17
|
110 $field_label = Unicode::ucfirst(mb_strtolower($this->randomMachineName()));
|
Chris@0
|
111 $type = $this->getTestFieldType();
|
Chris@0
|
112 $widget_type = $formatter_type = $type . '_default';
|
Chris@0
|
113
|
Chris@0
|
114 $this->fieldStorage = FieldStorageConfig::create([
|
Chris@0
|
115 'field_name' => $field_name,
|
Chris@0
|
116 'entity_type' => 'entity_test',
|
Chris@0
|
117 'type' => $type,
|
Chris@0
|
118 'settings' => ['datetime_type' => DateTimeItem::DATETIME_TYPE_DATE],
|
Chris@0
|
119 ]);
|
Chris@0
|
120 $this->fieldStorage->save();
|
Chris@0
|
121 $this->field = FieldConfig::create([
|
Chris@0
|
122 'field_storage' => $this->fieldStorage,
|
Chris@0
|
123 'label' => $field_label,
|
Chris@0
|
124 'bundle' => 'entity_test',
|
Chris@0
|
125 'description' => 'Description for ' . $field_label,
|
Chris@0
|
126 'required' => TRUE,
|
Chris@0
|
127 ]);
|
Chris@0
|
128 $this->field->save();
|
Chris@0
|
129
|
Chris@0
|
130 EntityFormDisplay::load('entity_test.entity_test.default')
|
Chris@0
|
131 ->setComponent($field_name, ['type' => $widget_type])
|
Chris@0
|
132 ->save();
|
Chris@0
|
133
|
Chris@0
|
134 $this->displayOptions = [
|
Chris@0
|
135 'type' => $formatter_type,
|
Chris@0
|
136 'label' => 'hidden',
|
Chris@0
|
137 'settings' => ['format_type' => 'medium'] + $this->defaultSettings,
|
Chris@0
|
138 ];
|
Chris@0
|
139 EntityViewDisplay::create([
|
Chris@0
|
140 'targetEntityType' => $this->field->getTargetEntityTypeId(),
|
Chris@0
|
141 'bundle' => $this->field->getTargetBundle(),
|
Chris@0
|
142 'mode' => 'full',
|
Chris@0
|
143 'status' => TRUE,
|
Chris@0
|
144 ])->setComponent($field_name, $this->displayOptions)
|
Chris@0
|
145 ->save();
|
Chris@0
|
146 }
|
Chris@0
|
147
|
Chris@0
|
148 /**
|
Chris@0
|
149 * Renders a entity_test and sets the output in the internal browser.
|
Chris@0
|
150 *
|
Chris@0
|
151 * @param int $id
|
Chris@0
|
152 * The entity_test ID to render.
|
Chris@0
|
153 * @param string $view_mode
|
Chris@0
|
154 * (optional) The view mode to use for rendering. Defaults to 'full'.
|
Chris@0
|
155 * @param bool $reset
|
Chris@0
|
156 * (optional) Whether to reset the entity_test controller cache. Defaults to
|
Chris@0
|
157 * TRUE to simplify testing.
|
Chris@0
|
158 *
|
Chris@0
|
159 * @return string
|
Chris@0
|
160 * The rendered HTML output.
|
Chris@0
|
161 */
|
Chris@0
|
162 protected function renderTestEntity($id, $view_mode = 'full', $reset = TRUE) {
|
Chris@0
|
163 if ($reset) {
|
Chris@0
|
164 $this->container->get('entity_type.manager')->getStorage('entity_test')->resetCache([$id]);
|
Chris@0
|
165 }
|
Chris@0
|
166 $entity = EntityTest::load($id);
|
Chris@0
|
167 $display = EntityViewDisplay::collectRenderDisplay($entity, $view_mode);
|
Chris@0
|
168 $build = $display->build($entity);
|
Chris@0
|
169 return (string) $this->container->get('renderer')->renderRoot($build);
|
Chris@0
|
170 }
|
Chris@0
|
171
|
Chris@0
|
172 /**
|
Chris@0
|
173 * Sets the site timezone to a given timezone.
|
Chris@0
|
174 *
|
Chris@0
|
175 * @param string $timezone
|
Chris@0
|
176 * The timezone identifier to set.
|
Chris@0
|
177 */
|
Chris@0
|
178 protected function setSiteTimezone($timezone) {
|
Chris@0
|
179 // Set an explicit site timezone, and disallow per-user timezones.
|
Chris@0
|
180 $this->config('system.date')
|
Chris@0
|
181 ->set('timezone.user.configurable', 0)
|
Chris@0
|
182 ->set('timezone.default', $timezone)
|
Chris@0
|
183 ->save();
|
Chris@0
|
184 }
|
Chris@0
|
185
|
Chris@14
|
186 /**
|
Chris@14
|
187 * Massages test date values.
|
Chris@14
|
188 *
|
Chris@14
|
189 * If a date object is generated directly by a test, then it needs to be
|
Chris@14
|
190 * adjusted to behave like the computed date from the item.
|
Chris@14
|
191 *
|
Chris@14
|
192 * @param \Drupal\Core\Datetime\DrupalDateTime $date
|
Chris@14
|
193 * A date object directly generated by the test.
|
Chris@14
|
194 */
|
Chris@14
|
195 protected function massageTestDate($date) {
|
Chris@14
|
196 if ($this->field->getSetting('datetime_type') === DateTimeItem::DATETIME_TYPE_DATE) {
|
Chris@14
|
197 // Set the default time for date-only items.
|
Chris@14
|
198 $date->setDefaultDateTime();
|
Chris@14
|
199 }
|
Chris@14
|
200 }
|
Chris@14
|
201
|
Chris@0
|
202 }
|