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