annotate core/modules/datetime/tests/src/Kernel/DateTimeItemTest.php @ 13:5fb285c0d0e3

Update Drupal core to 8.4.7 via Composer. Security update; I *think* we've been lucky to get away with this so far, as we don't support self-registration which seems to be used by the so-called "drupalgeddon 2" attack that 8.4.5 was vulnerable to.
author Chris Cannam
date Mon, 23 Apr 2018 09:33:26 +0100
parents 4c8ae668cc8c
children 1fec387a4317
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\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 }