annotate core/modules/datetime/tests/src/Kernel/DateTimeItemTest.php @ 0:c75dbcec494b

Initial commit from drush-created site
author Chris Cannam
date Thu, 05 Jul 2018 14:24:15 +0000
parents
children 12f9dff5fda9
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@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 }