annotate core/modules/datetime/tests/src/Kernel/DateTimeItemTest.php @ 19:fa3358dc1485 tip

Add ndrum files
author Chris Cannam
date Wed, 28 Aug 2019 13:14:47 +0100
parents af1871eacc83
children
rev   line source
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 }