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\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@0
|
84 $this->assertEquals(DateTimeItemInterface::STORAGE_TIMEZONE, $entity->field_datetime->date->getTimeZone()->getName());
|
Chris@0
|
85
|
Chris@0
|
86 // Verify changing the date value.
|
Chris@0
|
87 $new_value = '2016-11-04T00:21:00';
|
Chris@0
|
88 $entity->field_datetime->value = $new_value;
|
Chris@0
|
89 $this->assertEqual($entity->field_datetime->value, $new_value);
|
Chris@0
|
90 $this->assertEquals(DateTimeItemInterface::STORAGE_TIMEZONE, $entity->field_datetime->date->getTimeZone()->getName());
|
Chris@0
|
91
|
Chris@0
|
92 // Read changed entity and assert changed values.
|
Chris@0
|
93 $this->entityValidateAndSave($entity);
|
Chris@0
|
94 $entity = EntityTest::load($id);
|
Chris@0
|
95 $this->assertEqual($entity->field_datetime->value, $new_value);
|
Chris@0
|
96 $this->assertEquals(DateTimeItemInterface::STORAGE_TIMEZONE, $entity->field_datetime->date->getTimeZone()->getName());
|
Chris@0
|
97
|
Chris@0
|
98 // Test the generateSampleValue() method.
|
Chris@0
|
99 $entity = EntityTest::create();
|
Chris@0
|
100 $entity->field_datetime->generateSampleItems();
|
Chris@0
|
101 $this->entityValidateAndSave($entity);
|
Chris@0
|
102 }
|
Chris@0
|
103
|
Chris@0
|
104 /**
|
Chris@0
|
105 * Tests using entity fields of the date field type.
|
Chris@0
|
106 */
|
Chris@0
|
107 public function testDateOnly() {
|
Chris@0
|
108 $this->fieldStorage->setSetting('datetime_type', DateTimeItem::DATETIME_TYPE_DATE);
|
Chris@0
|
109 $this->fieldStorage->save();
|
Chris@0
|
110
|
Chris@0
|
111 // Verify entity creation.
|
Chris@0
|
112 $entity = EntityTest::create();
|
Chris@0
|
113 $value = '2014-01-01';
|
Chris@0
|
114 $entity->field_datetime = $value;
|
Chris@0
|
115 $entity->name->value = $this->randomMachineName();
|
Chris@0
|
116 $this->entityValidateAndSave($entity);
|
Chris@0
|
117
|
Chris@0
|
118 // Verify entity has been created properly.
|
Chris@0
|
119 $id = $entity->id();
|
Chris@0
|
120 $entity = EntityTest::load($id);
|
Chris@0
|
121 $this->assertTrue($entity->field_datetime instanceof FieldItemListInterface, 'Field implements interface.');
|
Chris@0
|
122 $this->assertTrue($entity->field_datetime[0] instanceof FieldItemInterface, 'Field item implements interface.');
|
Chris@0
|
123 $this->assertEqual($entity->field_datetime->value, $value);
|
Chris@0
|
124 $this->assertEqual($entity->field_datetime[0]->value, $value);
|
Chris@0
|
125 $this->assertEquals(DateTimeItemInterface::STORAGE_TIMEZONE, $entity->field_datetime->date->getTimeZone()->getName());
|
Chris@0
|
126 $this->assertEquals('12:00:00', $entity->field_datetime->date->format('H:i:s'));
|
Chris@0
|
127 $entity->field_datetime->date->setDefaultDateTime();
|
Chris@0
|
128 $this->assertEquals('12:00:00', $entity->field_datetime->date->format('H:i:s'));
|
Chris@0
|
129
|
Chris@0
|
130 // Verify changing the date value.
|
Chris@0
|
131 $new_value = '2016-11-04';
|
Chris@0
|
132 $entity->field_datetime->value = $new_value;
|
Chris@0
|
133 $this->assertEqual($entity->field_datetime->value, $new_value);
|
Chris@0
|
134 $this->assertEquals(DateTimeItemInterface::STORAGE_TIMEZONE, $entity->field_datetime->date->getTimeZone()->getName());
|
Chris@0
|
135 $this->assertEquals('12:00:00', $entity->field_datetime->date->format('H:i:s'));
|
Chris@0
|
136 $entity->field_datetime->date->setDefaultDateTime();
|
Chris@0
|
137 $this->assertEquals('12:00:00', $entity->field_datetime->date->format('H:i:s'));
|
Chris@0
|
138
|
Chris@0
|
139 // Read changed entity and assert changed values.
|
Chris@0
|
140 $this->entityValidateAndSave($entity);
|
Chris@0
|
141 $entity = EntityTest::load($id);
|
Chris@0
|
142 $this->assertEqual($entity->field_datetime->value, $new_value);
|
Chris@0
|
143 $this->assertEquals(DateTimeItemInterface::STORAGE_TIMEZONE, $entity->field_datetime->date->getTimeZone()->getName());
|
Chris@0
|
144 $this->assertEquals('12:00:00', $entity->field_datetime->date->format('H:i:s'));
|
Chris@0
|
145 $entity->field_datetime->date->setDefaultDateTime();
|
Chris@0
|
146 $this->assertEquals('12:00:00', $entity->field_datetime->date->format('H:i:s'));
|
Chris@0
|
147
|
Chris@0
|
148 // Test the generateSampleValue() method.
|
Chris@0
|
149 $entity = EntityTest::create();
|
Chris@0
|
150 $entity->field_datetime->generateSampleItems();
|
Chris@0
|
151 $this->assertEquals('12:00:00', $entity->field_datetime->date->format('H:i:s'));
|
Chris@0
|
152 $entity->field_datetime->date->setDefaultDateTime();
|
Chris@0
|
153 $this->assertEquals('12:00:00', $entity->field_datetime->date->format('H:i:s'));
|
Chris@0
|
154 $this->entityValidateAndSave($entity);
|
Chris@0
|
155 }
|
Chris@0
|
156
|
Chris@0
|
157 /**
|
Chris@0
|
158 * Tests DateTimeItem::setValue().
|
Chris@0
|
159 */
|
Chris@0
|
160 public function testSetValue() {
|
Chris@0
|
161 // Test a date+time field.
|
Chris@0
|
162 $this->fieldStorage->setSetting('datetime_type', DateTimeItem::DATETIME_TYPE_DATETIME);
|
Chris@0
|
163 $this->fieldStorage->save();
|
Chris@0
|
164
|
Chris@0
|
165 // Test DateTimeItem::setValue() using string.
|
Chris@0
|
166 $entity = EntityTest::create();
|
Chris@0
|
167 $value = '2014-01-01T20:00:00';
|
Chris@0
|
168 $entity->get('field_datetime')->set(0, $value);
|
Chris@0
|
169 $this->entityValidateAndSave($entity);
|
Chris@0
|
170 // Load the entity and ensure the field was saved correctly.
|
Chris@0
|
171 $id = $entity->id();
|
Chris@0
|
172 $entity = EntityTest::load($id);
|
Chris@0
|
173 $this->assertEqual($entity->field_datetime[0]->value, $value, 'DateTimeItem::setValue() works with string value.');
|
Chris@0
|
174 $this->assertEquals(DateTimeItemInterface::STORAGE_TIMEZONE, $entity->field_datetime->date->getTimeZone()->getName());
|
Chris@0
|
175
|
Chris@0
|
176 // Test DateTimeItem::setValue() using property array.
|
Chris@0
|
177 $entity = EntityTest::create();
|
Chris@0
|
178 $value = '2014-01-01T20:00:00';
|
Chris@0
|
179 $entity->set('field_datetime', $value);
|
Chris@0
|
180 $this->entityValidateAndSave($entity);
|
Chris@0
|
181 // Load the entity and ensure the field was saved correctly.
|
Chris@0
|
182 $id = $entity->id();
|
Chris@0
|
183 $entity = EntityTest::load($id);
|
Chris@0
|
184 $this->assertEqual($entity->field_datetime[0]->value, $value, 'DateTimeItem::setValue() works with array value.');
|
Chris@0
|
185 $this->assertEquals(DateTimeItemInterface::STORAGE_TIMEZONE, $entity->field_datetime->date->getTimeZone()->getName());
|
Chris@0
|
186
|
Chris@0
|
187 // Test a date-only field.
|
Chris@0
|
188 $this->fieldStorage->setSetting('datetime_type', DateTimeItem::DATETIME_TYPE_DATE);
|
Chris@0
|
189 $this->fieldStorage->save();
|
Chris@0
|
190
|
Chris@0
|
191 // Test DateTimeItem::setValue() using string.
|
Chris@0
|
192 $entity = EntityTest::create();
|
Chris@0
|
193 $value = '2014-01-01';
|
Chris@0
|
194 $entity->get('field_datetime')->set(0, $value);
|
Chris@0
|
195 $this->entityValidateAndSave($entity);
|
Chris@0
|
196 // Load the entity and ensure the field was saved correctly.
|
Chris@0
|
197 $id = $entity->id();
|
Chris@0
|
198 $entity = EntityTest::load($id);
|
Chris@0
|
199 $this->assertEqual($entity->field_datetime[0]->value, $value, 'DateTimeItem::setValue() works with string value.');
|
Chris@0
|
200 $this->assertEquals(DateTimeItemInterface::STORAGE_TIMEZONE, $entity->field_datetime->date->getTimeZone()->getName());
|
Chris@0
|
201
|
Chris@0
|
202 // Test DateTimeItem::setValue() using property array.
|
Chris@0
|
203 $entity = EntityTest::create();
|
Chris@0
|
204 $value = '2014-01-01';
|
Chris@0
|
205 $entity->set('field_datetime', $value);
|
Chris@0
|
206 $this->entityValidateAndSave($entity);
|
Chris@0
|
207 // Load the entity and ensure the field was saved correctly.
|
Chris@0
|
208 $id = $entity->id();
|
Chris@0
|
209 $entity = EntityTest::load($id);
|
Chris@0
|
210 $this->assertEqual($entity->field_datetime[0]->value, $value, 'DateTimeItem::setValue() works with array value.');
|
Chris@0
|
211 $this->assertEquals(DateTimeItemInterface::STORAGE_TIMEZONE, $entity->field_datetime->date->getTimeZone()->getName());
|
Chris@0
|
212 }
|
Chris@0
|
213
|
Chris@0
|
214 /**
|
Chris@0
|
215 * Tests setting the value of the DateTimeItem directly.
|
Chris@0
|
216 */
|
Chris@0
|
217 public function testSetValueProperty() {
|
Chris@0
|
218 // Test Date::setValue() with a date+time field.
|
Chris@0
|
219 // Test a date+time field.
|
Chris@0
|
220 $this->fieldStorage->setSetting('datetime_type', DateTimeItem::DATETIME_TYPE_DATETIME);
|
Chris@0
|
221 $this->fieldStorage->save();
|
Chris@0
|
222 $entity = EntityTest::create();
|
Chris@0
|
223 $value = '2014-01-01T20:00:00';
|
Chris@0
|
224
|
Chris@0
|
225 $entity->set('field_datetime', $value);
|
Chris@0
|
226 $this->entityValidateAndSave($entity);
|
Chris@0
|
227 // Load the entity and ensure the field was saved correctly.
|
Chris@0
|
228 $id = $entity->id();
|
Chris@0
|
229 $entity = EntityTest::load($id);
|
Chris@0
|
230 $this->assertEqual($entity->field_datetime[0]->value, $value, '"Value" property can be set directly.');
|
Chris@0
|
231 $this->assertEquals(DateTimeItemInterface::STORAGE_TIMEZONE, $entity->field_datetime->date->getTimeZone()->getName());
|
Chris@0
|
232
|
Chris@0
|
233 // Test Date::setValue() with a date-only field.
|
Chris@0
|
234 // Test a date+time field.
|
Chris@0
|
235 $this->fieldStorage->setSetting('datetime_type', DateTimeItem::DATETIME_TYPE_DATE);
|
Chris@0
|
236 $this->fieldStorage->save();
|
Chris@0
|
237 $entity = EntityTest::create();
|
Chris@0
|
238 $value = '2014-01-01';
|
Chris@0
|
239
|
Chris@0
|
240 $entity->set('field_datetime', $value);
|
Chris@0
|
241 $this->entityValidateAndSave($entity);
|
Chris@0
|
242 // Load the entity and ensure the field was saved correctly.
|
Chris@0
|
243 $id = $entity->id();
|
Chris@0
|
244 $entity = EntityTest::load($id);
|
Chris@0
|
245 $this->assertEqual($entity->field_datetime[0]->value, $value, '"Value" property can be set directly.');
|
Chris@0
|
246 $this->assertEquals(DateTimeItemInterface::STORAGE_TIMEZONE, $entity->field_datetime->date->getTimeZone()->getName());
|
Chris@0
|
247 }
|
Chris@0
|
248
|
Chris@0
|
249 /**
|
Chris@0
|
250 * Tests the constraint validations for fields with date and time.
|
Chris@0
|
251 *
|
Chris@0
|
252 * @dataProvider datetimeValidationProvider
|
Chris@0
|
253 */
|
Chris@0
|
254 public function testDatetimeValidation($value) {
|
Chris@0
|
255 $this->setExpectedException(\PHPUnit_Framework_AssertionFailedError::class);
|
Chris@0
|
256
|
Chris@0
|
257 $this->fieldStorage->setSetting('datetime_type', DateTimeItem::DATETIME_TYPE_DATETIME);
|
Chris@0
|
258 $this->fieldStorage->save();
|
Chris@0
|
259 $entity = EntityTest::create();
|
Chris@0
|
260
|
Chris@0
|
261 $entity->set('field_datetime', $value);
|
Chris@0
|
262 $this->entityValidateAndSave($entity);
|
Chris@0
|
263 }
|
Chris@0
|
264
|
Chris@0
|
265 /**
|
Chris@0
|
266 * Provider for testDatetimeValidation().
|
Chris@0
|
267 */
|
Chris@0
|
268 public function datetimeValidationProvider() {
|
Chris@0
|
269 return [
|
Chris@0
|
270 // Valid ISO 8601 dates, but unsupported by DateTimeItem.
|
Chris@0
|
271 ['2014-01-01T20:00:00Z'],
|
Chris@0
|
272 ['2014-01-01T20:00:00+04:00'],
|
Chris@0
|
273 ['2014-01-01T20:00:00+0400'],
|
Chris@0
|
274 ['2014-01-01T20:00:00+04'],
|
Chris@0
|
275 ['2014-01-01T20:00:00.123'],
|
Chris@0
|
276 ['2014-01-01T200000'],
|
Chris@0
|
277 ['2014-01-01T2000'],
|
Chris@0
|
278 ['2014-01-01T20'],
|
Chris@0
|
279 ['20140101T20:00:00'],
|
Chris@0
|
280 ['2014-01T20:00:00'],
|
Chris@0
|
281 ['2014-001T20:00:00'],
|
Chris@0
|
282 ['2014001T20:00:00'],
|
Chris@0
|
283 // Valid date strings, but unsupported by DateTimeItem.
|
Chris@0
|
284 ['2016-11-03 20:52:00'],
|
Chris@0
|
285 ['Thu, 03 Nov 2014 20:52:00 -0400'],
|
Chris@0
|
286 ['Thursday, November 3, 2016 - 20:52'],
|
Chris@0
|
287 ['Thu, 11/03/2016 - 20:52'],
|
Chris@0
|
288 ['11/03/2016 - 20:52'],
|
Chris@0
|
289 // Invalid date strings.
|
Chris@0
|
290 ['YYYY-01-01T20:00:00'],
|
Chris@0
|
291 ['2014-MM-01T20:00:00'],
|
Chris@0
|
292 ['2014-01-DDT20:00:00'],
|
Chris@0
|
293 ['2014-01-01Thh:00:00'],
|
Chris@0
|
294 ['2014-01-01T20:mm:00'],
|
Chris@0
|
295 ['2014-01-01T20:00:ss'],
|
Chris@0
|
296 // Invalid dates.
|
Chris@0
|
297 ['2014-13-13T20:00:00'],
|
Chris@0
|
298 ['2014-01-55T20:00:00'],
|
Chris@0
|
299 ['2014-01-01T25:00:00'],
|
Chris@0
|
300 ['2014-01-01T00:70:00'],
|
Chris@0
|
301 ['2014-01-01T00:00:70'],
|
Chris@0
|
302 // Proper format for different field setting.
|
Chris@0
|
303 ['2014-01-01'],
|
Chris@0
|
304 // Wrong input type.
|
Chris@0
|
305 [['2014', '01', '01', '00', '00', '00']],
|
Chris@0
|
306 ];
|
Chris@0
|
307 }
|
Chris@0
|
308
|
Chris@0
|
309 /**
|
Chris@0
|
310 * Tests the constraint validations for fields with date only.
|
Chris@0
|
311 *
|
Chris@0
|
312 * @dataProvider dateonlyValidationProvider
|
Chris@0
|
313 */
|
Chris@0
|
314 public function testDateonlyValidation($value) {
|
Chris@0
|
315 $this->setExpectedException(\PHPUnit_Framework_AssertionFailedError::class);
|
Chris@0
|
316
|
Chris@0
|
317 $this->fieldStorage->setSetting('datetime_type', DateTimeItem::DATETIME_TYPE_DATE);
|
Chris@0
|
318 $this->fieldStorage->save();
|
Chris@0
|
319 $entity = EntityTest::create();
|
Chris@0
|
320
|
Chris@0
|
321 $entity->set('field_datetime', $value);
|
Chris@0
|
322 $this->entityValidateAndSave($entity);
|
Chris@0
|
323 }
|
Chris@0
|
324
|
Chris@0
|
325 /**
|
Chris@0
|
326 * Provider for testDatetimeValidation().
|
Chris@0
|
327 */
|
Chris@0
|
328 public function dateonlyValidationProvider() {
|
Chris@0
|
329 return [
|
Chris@0
|
330 // Valid date strings, but unsupported by DateTimeItem.
|
Chris@0
|
331 ['Thu, 03 Nov 2014'],
|
Chris@0
|
332 ['Thursday, November 3, 2016'],
|
Chris@0
|
333 ['Thu, 11/03/2016'],
|
Chris@0
|
334 ['11/03/2016'],
|
Chris@0
|
335 // Invalid date strings.
|
Chris@0
|
336 ['YYYY-01-01'],
|
Chris@0
|
337 ['2014-MM-01'],
|
Chris@0
|
338 ['2014-01-DD'],
|
Chris@0
|
339 // Invalid dates.
|
Chris@0
|
340 ['2014-13-01'],
|
Chris@0
|
341 ['2014-01-55'],
|
Chris@0
|
342 // Proper format for different field setting.
|
Chris@0
|
343 ['2014-01-01T20:00:00'],
|
Chris@0
|
344 // Wrong input type.
|
Chris@0
|
345 [['2014', '01', '01']],
|
Chris@0
|
346 ];
|
Chris@0
|
347 }
|
Chris@0
|
348
|
Chris@0
|
349 }
|