Chris@0
|
1 <?php
|
Chris@0
|
2
|
Chris@0
|
3 namespace Drupal\Tests\datetime\Kernel;
|
Chris@0
|
4
|
Chris@0
|
5 use Drupal\Core\Field\FieldItemListInterface;
|
Chris@0
|
6 use Drupal\Core\Field\FieldItemInterface;
|
Chris@0
|
7 use Drupal\datetime\Plugin\Field\FieldType\DateTimeItem;
|
Chris@0
|
8 use Drupal\entity_test\Entity\EntityTest;
|
Chris@0
|
9 use Drupal\field\Entity\FieldConfig;
|
Chris@0
|
10 use Drupal\Tests\field\Kernel\FieldKernelTestBase;
|
Chris@0
|
11 use Drupal\field\Entity\FieldStorageConfig;
|
Chris@0
|
12
|
Chris@0
|
13 /**
|
Chris@0
|
14 * Tests the new entity API for the date field type.
|
Chris@0
|
15 *
|
Chris@0
|
16 * @group datetime
|
Chris@0
|
17 */
|
Chris@0
|
18 class DateTimeItemTest extends FieldKernelTestBase {
|
Chris@0
|
19
|
Chris@0
|
20 /**
|
Chris@0
|
21 * A field storage to use in this test class.
|
Chris@0
|
22 *
|
Chris@0
|
23 * @var \Drupal\field\Entity\FieldStorageConfig
|
Chris@0
|
24 */
|
Chris@0
|
25 protected $fieldStorage;
|
Chris@0
|
26
|
Chris@0
|
27 /**
|
Chris@0
|
28 * The field used in this test class.
|
Chris@0
|
29 *
|
Chris@0
|
30 * @var \Drupal\field\Entity\FieldConfig
|
Chris@0
|
31 */
|
Chris@0
|
32 protected $field;
|
Chris@0
|
33
|
Chris@0
|
34 /**
|
Chris@0
|
35 * Modules to enable.
|
Chris@0
|
36 *
|
Chris@0
|
37 * @var array
|
Chris@0
|
38 */
|
Chris@0
|
39 public static $modules = ['datetime'];
|
Chris@0
|
40
|
Chris@0
|
41 protected function setUp() {
|
Chris@0
|
42 parent::setUp();
|
Chris@0
|
43
|
Chris@0
|
44 // Create a field with settings to validate.
|
Chris@0
|
45 $this->fieldStorage = FieldStorageConfig::create([
|
Chris@0
|
46 'field_name' => 'field_datetime',
|
Chris@0
|
47 'type' => 'datetime',
|
Chris@0
|
48 'entity_type' => 'entity_test',
|
Chris@0
|
49 'settings' => ['datetime_type' => DateTimeItem::DATETIME_TYPE_DATETIME],
|
Chris@0
|
50 ]);
|
Chris@0
|
51 $this->fieldStorage->save();
|
Chris@0
|
52 $this->field = FieldConfig::create([
|
Chris@0
|
53 'field_storage' => $this->fieldStorage,
|
Chris@0
|
54 'bundle' => 'entity_test',
|
Chris@0
|
55 'settings' => [
|
Chris@0
|
56 'default_value' => 'blank',
|
Chris@0
|
57 ],
|
Chris@0
|
58 ]);
|
Chris@0
|
59 $this->field->save();
|
Chris@0
|
60 }
|
Chris@0
|
61
|
Chris@0
|
62 /**
|
Chris@0
|
63 * Tests using entity fields of the datetime field type.
|
Chris@0
|
64 */
|
Chris@0
|
65 public function testDateTime() {
|
Chris@0
|
66 $this->fieldStorage->setSetting('datetime_type', DateTimeItem::DATETIME_TYPE_DATETIME);
|
Chris@0
|
67 $this->fieldStorage->save();
|
Chris@0
|
68
|
Chris@0
|
69 // Verify entity creation.
|
Chris@0
|
70 $entity = EntityTest::create();
|
Chris@0
|
71 $value = '2014-01-01T20:00:00';
|
Chris@0
|
72 $entity->field_datetime = $value;
|
Chris@0
|
73 $entity->name->value = $this->randomMachineName();
|
Chris@0
|
74 $this->entityValidateAndSave($entity);
|
Chris@0
|
75
|
Chris@0
|
76 // Verify entity has been created properly.
|
Chris@0
|
77 $id = $entity->id();
|
Chris@0
|
78 $entity = EntityTest::load($id);
|
Chris@0
|
79 $this->assertTrue($entity->field_datetime instanceof FieldItemListInterface, 'Field implements interface.');
|
Chris@0
|
80 $this->assertTrue($entity->field_datetime[0] instanceof FieldItemInterface, 'Field item implements interface.');
|
Chris@0
|
81 $this->assertEqual($entity->field_datetime->value, $value);
|
Chris@0
|
82 $this->assertEqual($entity->field_datetime[0]->value, $value);
|
Chris@0
|
83 $this->assertEquals(DATETIME_STORAGE_TIMEZONE, $entity->field_datetime->date->getTimeZone()->getName());
|
Chris@0
|
84
|
Chris@0
|
85 // Verify changing the date value.
|
Chris@0
|
86 $new_value = '2016-11-04T00:21:00';
|
Chris@0
|
87 $entity->field_datetime->value = $new_value;
|
Chris@0
|
88 $this->assertEqual($entity->field_datetime->value, $new_value);
|
Chris@0
|
89 $this->assertEquals(DATETIME_STORAGE_TIMEZONE, $entity->field_datetime->date->getTimeZone()->getName());
|
Chris@0
|
90
|
Chris@0
|
91 // Read changed entity and assert changed values.
|
Chris@0
|
92 $this->entityValidateAndSave($entity);
|
Chris@0
|
93 $entity = EntityTest::load($id);
|
Chris@0
|
94 $this->assertEqual($entity->field_datetime->value, $new_value);
|
Chris@0
|
95 $this->assertEquals(DATETIME_STORAGE_TIMEZONE, $entity->field_datetime->date->getTimeZone()->getName());
|
Chris@0
|
96
|
Chris@0
|
97 // Test the generateSampleValue() method.
|
Chris@0
|
98 $entity = EntityTest::create();
|
Chris@0
|
99 $entity->field_datetime->generateSampleItems();
|
Chris@0
|
100 $this->entityValidateAndSave($entity);
|
Chris@0
|
101 }
|
Chris@0
|
102
|
Chris@0
|
103 /**
|
Chris@0
|
104 * Tests using entity fields of the date field type.
|
Chris@0
|
105 */
|
Chris@0
|
106 public function testDateOnly() {
|
Chris@0
|
107 $this->fieldStorage->setSetting('datetime_type', DateTimeItem::DATETIME_TYPE_DATE);
|
Chris@0
|
108 $this->fieldStorage->save();
|
Chris@0
|
109
|
Chris@0
|
110 // Verify entity creation.
|
Chris@0
|
111 $entity = EntityTest::create();
|
Chris@0
|
112 $value = '2014-01-01';
|
Chris@0
|
113 $entity->field_datetime = $value;
|
Chris@0
|
114 $entity->name->value = $this->randomMachineName();
|
Chris@0
|
115 $this->entityValidateAndSave($entity);
|
Chris@0
|
116
|
Chris@0
|
117 // Verify entity has been created properly.
|
Chris@0
|
118 $id = $entity->id();
|
Chris@0
|
119 $entity = EntityTest::load($id);
|
Chris@0
|
120 $this->assertTrue($entity->field_datetime instanceof FieldItemListInterface, 'Field implements interface.');
|
Chris@0
|
121 $this->assertTrue($entity->field_datetime[0] instanceof FieldItemInterface, 'Field item implements interface.');
|
Chris@0
|
122 $this->assertEqual($entity->field_datetime->value, $value);
|
Chris@0
|
123 $this->assertEqual($entity->field_datetime[0]->value, $value);
|
Chris@0
|
124 $this->assertEquals(DATETIME_STORAGE_TIMEZONE, $entity->field_datetime->date->getTimeZone()->getName());
|
Chris@0
|
125
|
Chris@0
|
126 // Verify changing the date value.
|
Chris@0
|
127 $new_value = '2016-11-04';
|
Chris@0
|
128 $entity->field_datetime->value = $new_value;
|
Chris@0
|
129 $this->assertEqual($entity->field_datetime->value, $new_value);
|
Chris@0
|
130 $this->assertEquals(DATETIME_STORAGE_TIMEZONE, $entity->field_datetime->date->getTimeZone()->getName());
|
Chris@0
|
131
|
Chris@0
|
132 // Read changed entity and assert changed values.
|
Chris@0
|
133 $this->entityValidateAndSave($entity);
|
Chris@0
|
134 $entity = EntityTest::load($id);
|
Chris@0
|
135 $this->assertEqual($entity->field_datetime->value, $new_value);
|
Chris@0
|
136 $this->assertEquals(DATETIME_STORAGE_TIMEZONE, $entity->field_datetime->date->getTimeZone()->getName());
|
Chris@0
|
137
|
Chris@0
|
138 // Test the generateSampleValue() method.
|
Chris@0
|
139 $entity = EntityTest::create();
|
Chris@0
|
140 $entity->field_datetime->generateSampleItems();
|
Chris@0
|
141 $this->entityValidateAndSave($entity);
|
Chris@0
|
142 }
|
Chris@0
|
143
|
Chris@0
|
144 /**
|
Chris@0
|
145 * Tests DateTimeItem::setValue().
|
Chris@0
|
146 */
|
Chris@0
|
147 public function testSetValue() {
|
Chris@0
|
148 // Test a date+time field.
|
Chris@0
|
149 $this->fieldStorage->setSetting('datetime_type', DateTimeItem::DATETIME_TYPE_DATETIME);
|
Chris@0
|
150 $this->fieldStorage->save();
|
Chris@0
|
151
|
Chris@0
|
152 // Test DateTimeItem::setValue() using string.
|
Chris@0
|
153 $entity = EntityTest::create();
|
Chris@0
|
154 $value = '2014-01-01T20:00:00';
|
Chris@0
|
155 $entity->get('field_datetime')->set(0, $value);
|
Chris@0
|
156 $this->entityValidateAndSave($entity);
|
Chris@0
|
157 // Load the entity and ensure the field was saved correctly.
|
Chris@0
|
158 $id = $entity->id();
|
Chris@0
|
159 $entity = EntityTest::load($id);
|
Chris@0
|
160 $this->assertEqual($entity->field_datetime[0]->value, $value, 'DateTimeItem::setValue() works with string value.');
|
Chris@0
|
161 $this->assertEquals(DATETIME_STORAGE_TIMEZONE, $entity->field_datetime->date->getTimeZone()->getName());
|
Chris@0
|
162
|
Chris@0
|
163 // Test DateTimeItem::setValue() using property array.
|
Chris@0
|
164 $entity = EntityTest::create();
|
Chris@0
|
165 $value = '2014-01-01T20:00:00';
|
Chris@0
|
166 $entity->set('field_datetime', $value);
|
Chris@0
|
167 $this->entityValidateAndSave($entity);
|
Chris@0
|
168 // Load the entity and ensure the field was saved correctly.
|
Chris@0
|
169 $id = $entity->id();
|
Chris@0
|
170 $entity = EntityTest::load($id);
|
Chris@0
|
171 $this->assertEqual($entity->field_datetime[0]->value, $value, 'DateTimeItem::setValue() works with array value.');
|
Chris@0
|
172 $this->assertEquals(DATETIME_STORAGE_TIMEZONE, $entity->field_datetime->date->getTimeZone()->getName());
|
Chris@0
|
173
|
Chris@0
|
174 // Test a date-only field.
|
Chris@0
|
175 $this->fieldStorage->setSetting('datetime_type', DateTimeItem::DATETIME_TYPE_DATE);
|
Chris@0
|
176 $this->fieldStorage->save();
|
Chris@0
|
177
|
Chris@0
|
178 // Test DateTimeItem::setValue() using string.
|
Chris@0
|
179 $entity = EntityTest::create();
|
Chris@0
|
180 $value = '2014-01-01';
|
Chris@0
|
181 $entity->get('field_datetime')->set(0, $value);
|
Chris@0
|
182 $this->entityValidateAndSave($entity);
|
Chris@0
|
183 // Load the entity and ensure the field was saved correctly.
|
Chris@0
|
184 $id = $entity->id();
|
Chris@0
|
185 $entity = EntityTest::load($id);
|
Chris@0
|
186 $this->assertEqual($entity->field_datetime[0]->value, $value, 'DateTimeItem::setValue() works with string value.');
|
Chris@0
|
187 $this->assertEquals(DATETIME_STORAGE_TIMEZONE, $entity->field_datetime->date->getTimeZone()->getName());
|
Chris@0
|
188
|
Chris@0
|
189 // Test DateTimeItem::setValue() using property array.
|
Chris@0
|
190 $entity = EntityTest::create();
|
Chris@0
|
191 $value = '2014-01-01';
|
Chris@0
|
192 $entity->set('field_datetime', $value);
|
Chris@0
|
193 $this->entityValidateAndSave($entity);
|
Chris@0
|
194 // Load the entity and ensure the field was saved correctly.
|
Chris@0
|
195 $id = $entity->id();
|
Chris@0
|
196 $entity = EntityTest::load($id);
|
Chris@0
|
197 $this->assertEqual($entity->field_datetime[0]->value, $value, 'DateTimeItem::setValue() works with array value.');
|
Chris@0
|
198 $this->assertEquals(DATETIME_STORAGE_TIMEZONE, $entity->field_datetime->date->getTimeZone()->getName());
|
Chris@0
|
199 }
|
Chris@0
|
200
|
Chris@0
|
201 /**
|
Chris@0
|
202 * Tests setting the value of the DateTimeItem directly.
|
Chris@0
|
203 */
|
Chris@0
|
204 public function testSetValueProperty() {
|
Chris@0
|
205 // Test Date::setValue() with a date+time field.
|
Chris@0
|
206 // Test a date+time field.
|
Chris@0
|
207 $this->fieldStorage->setSetting('datetime_type', DateTimeItem::DATETIME_TYPE_DATETIME);
|
Chris@0
|
208 $this->fieldStorage->save();
|
Chris@0
|
209 $entity = EntityTest::create();
|
Chris@0
|
210 $value = '2014-01-01T20:00:00';
|
Chris@0
|
211
|
Chris@0
|
212 $entity->set('field_datetime', $value);
|
Chris@0
|
213 $this->entityValidateAndSave($entity);
|
Chris@0
|
214 // Load the entity and ensure the field was saved correctly.
|
Chris@0
|
215 $id = $entity->id();
|
Chris@0
|
216 $entity = EntityTest::load($id);
|
Chris@0
|
217 $this->assertEqual($entity->field_datetime[0]->value, $value, '"Value" property can be set directly.');
|
Chris@0
|
218 $this->assertEquals(DATETIME_STORAGE_TIMEZONE, $entity->field_datetime->date->getTimeZone()->getName());
|
Chris@0
|
219
|
Chris@0
|
220 // Test Date::setValue() with a date-only field.
|
Chris@0
|
221 // Test a date+time field.
|
Chris@0
|
222 $this->fieldStorage->setSetting('datetime_type', DateTimeItem::DATETIME_TYPE_DATE);
|
Chris@0
|
223 $this->fieldStorage->save();
|
Chris@0
|
224 $entity = EntityTest::create();
|
Chris@0
|
225 $value = '2014-01-01';
|
Chris@0
|
226
|
Chris@0
|
227 $entity->set('field_datetime', $value);
|
Chris@0
|
228 $this->entityValidateAndSave($entity);
|
Chris@0
|
229 // Load the entity and ensure the field was saved correctly.
|
Chris@0
|
230 $id = $entity->id();
|
Chris@0
|
231 $entity = EntityTest::load($id);
|
Chris@0
|
232 $this->assertEqual($entity->field_datetime[0]->value, $value, '"Value" property can be set directly.');
|
Chris@0
|
233 $this->assertEquals(DATETIME_STORAGE_TIMEZONE, $entity->field_datetime->date->getTimeZone()->getName());
|
Chris@0
|
234 }
|
Chris@0
|
235
|
Chris@0
|
236 /**
|
Chris@0
|
237 * Tests the constraint validations for fields with date and time.
|
Chris@0
|
238 *
|
Chris@0
|
239 * @dataProvider datetimeValidationProvider
|
Chris@0
|
240 */
|
Chris@0
|
241 public function testDatetimeValidation($value) {
|
Chris@0
|
242 $this->setExpectedException(\PHPUnit_Framework_AssertionFailedError::class);
|
Chris@0
|
243
|
Chris@0
|
244 $this->fieldStorage->setSetting('datetime_type', DateTimeItem::DATETIME_TYPE_DATETIME);
|
Chris@0
|
245 $this->fieldStorage->save();
|
Chris@0
|
246 $entity = EntityTest::create();
|
Chris@0
|
247
|
Chris@0
|
248 $entity->set('field_datetime', $value);
|
Chris@0
|
249 $this->entityValidateAndSave($entity);
|
Chris@0
|
250 }
|
Chris@0
|
251
|
Chris@0
|
252 /**
|
Chris@0
|
253 * Provider for testDatetimeValidation().
|
Chris@0
|
254 */
|
Chris@0
|
255 public function datetimeValidationProvider() {
|
Chris@0
|
256 return [
|
Chris@0
|
257 // Valid ISO 8601 dates, but unsupported by DateTimeItem.
|
Chris@0
|
258 ['2014-01-01T20:00:00Z'],
|
Chris@0
|
259 ['2014-01-01T20:00:00+04:00'],
|
Chris@0
|
260 ['2014-01-01T20:00:00+0400'],
|
Chris@0
|
261 ['2014-01-01T20:00:00+04'],
|
Chris@0
|
262 ['2014-01-01T20:00:00.123'],
|
Chris@0
|
263 ['2014-01-01T200000'],
|
Chris@0
|
264 ['2014-01-01T2000'],
|
Chris@0
|
265 ['2014-01-01T20'],
|
Chris@0
|
266 ['20140101T20:00:00'],
|
Chris@0
|
267 ['2014-01T20:00:00'],
|
Chris@0
|
268 ['2014-001T20:00:00'],
|
Chris@0
|
269 ['2014001T20:00:00'],
|
Chris@0
|
270 // Valid date strings, but unsupported by DateTimeItem.
|
Chris@0
|
271 ['2016-11-03 20:52:00'],
|
Chris@0
|
272 ['Thu, 03 Nov 2014 20:52:00 -0400'],
|
Chris@0
|
273 ['Thursday, November 3, 2016 - 20:52'],
|
Chris@0
|
274 ['Thu, 11/03/2016 - 20:52'],
|
Chris@0
|
275 ['11/03/2016 - 20:52'],
|
Chris@0
|
276 // Invalid date strings.
|
Chris@0
|
277 ['YYYY-01-01T20:00:00'],
|
Chris@0
|
278 ['2014-MM-01T20:00:00'],
|
Chris@0
|
279 ['2014-01-DDT20:00:00'],
|
Chris@0
|
280 ['2014-01-01Thh:00:00'],
|
Chris@0
|
281 ['2014-01-01T20:mm:00'],
|
Chris@0
|
282 ['2014-01-01T20:00:ss'],
|
Chris@0
|
283 // Invalid dates.
|
Chris@0
|
284 ['2014-13-13T20:00:00'],
|
Chris@0
|
285 ['2014-01-55T20:00:00'],
|
Chris@0
|
286 ['2014-01-01T25:00:00'],
|
Chris@0
|
287 ['2014-01-01T00:70:00'],
|
Chris@0
|
288 ['2014-01-01T00:00:70'],
|
Chris@0
|
289 // Proper format for different field setting.
|
Chris@0
|
290 ['2014-01-01'],
|
Chris@0
|
291 // Wrong input type.
|
Chris@0
|
292 [['2014', '01', '01', '00', '00', '00']],
|
Chris@0
|
293 ];
|
Chris@0
|
294 }
|
Chris@0
|
295
|
Chris@0
|
296 /**
|
Chris@0
|
297 * Tests the constraint validations for fields with date only.
|
Chris@0
|
298 *
|
Chris@0
|
299 * @dataProvider dateonlyValidationProvider
|
Chris@0
|
300 */
|
Chris@0
|
301 public function testDateonlyValidation($value) {
|
Chris@0
|
302 $this->setExpectedException(\PHPUnit_Framework_AssertionFailedError::class);
|
Chris@0
|
303
|
Chris@0
|
304 $this->fieldStorage->setSetting('datetime_type', DateTimeItem::DATETIME_TYPE_DATE);
|
Chris@0
|
305 $this->fieldStorage->save();
|
Chris@0
|
306 $entity = EntityTest::create();
|
Chris@0
|
307
|
Chris@0
|
308 $entity->set('field_datetime', $value);
|
Chris@0
|
309 $this->entityValidateAndSave($entity);
|
Chris@0
|
310 }
|
Chris@0
|
311
|
Chris@0
|
312 /**
|
Chris@0
|
313 * Provider for testDatetimeValidation().
|
Chris@0
|
314 */
|
Chris@0
|
315 public function dateonlyValidationProvider() {
|
Chris@0
|
316 return [
|
Chris@0
|
317 // Valid date strings, but unsupported by DateTimeItem.
|
Chris@0
|
318 ['Thu, 03 Nov 2014'],
|
Chris@0
|
319 ['Thursday, November 3, 2016'],
|
Chris@0
|
320 ['Thu, 11/03/2016'],
|
Chris@0
|
321 ['11/03/2016'],
|
Chris@0
|
322 // Invalid date strings.
|
Chris@0
|
323 ['YYYY-01-01'],
|
Chris@0
|
324 ['2014-MM-01'],
|
Chris@0
|
325 ['2014-01-DD'],
|
Chris@0
|
326 // Invalid dates.
|
Chris@0
|
327 ['2014-13-01'],
|
Chris@0
|
328 ['2014-01-55'],
|
Chris@0
|
329 // Proper format for different field setting.
|
Chris@0
|
330 ['2014-01-01T20:00:00'],
|
Chris@0
|
331 // Wrong input type.
|
Chris@0
|
332 [['2014', '01', '01']],
|
Chris@0
|
333 ];
|
Chris@0
|
334 }
|
Chris@0
|
335
|
Chris@0
|
336 }
|