Mercurial > hg > isophonics-drupal-site
diff core/modules/datetime/tests/src/Kernel/DateTimeItemTest.php @ 0:4c8ae668cc8c
Initial import (non-working)
author | Chris Cannam |
---|---|
date | Wed, 29 Nov 2017 16:09:58 +0000 |
parents | |
children | 1fec387a4317 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/core/modules/datetime/tests/src/Kernel/DateTimeItemTest.php Wed Nov 29 16:09:58 2017 +0000 @@ -0,0 +1,336 @@ +<?php + +namespace Drupal\Tests\datetime\Kernel; + +use Drupal\Core\Field\FieldItemListInterface; +use Drupal\Core\Field\FieldItemInterface; +use Drupal\datetime\Plugin\Field\FieldType\DateTimeItem; +use Drupal\entity_test\Entity\EntityTest; +use Drupal\field\Entity\FieldConfig; +use Drupal\Tests\field\Kernel\FieldKernelTestBase; +use Drupal\field\Entity\FieldStorageConfig; + +/** + * Tests the new entity API for the date field type. + * + * @group datetime + */ +class DateTimeItemTest extends FieldKernelTestBase { + + /** + * A field storage to use in this test class. + * + * @var \Drupal\field\Entity\FieldStorageConfig + */ + protected $fieldStorage; + + /** + * The field used in this test class. + * + * @var \Drupal\field\Entity\FieldConfig + */ + protected $field; + + /** + * Modules to enable. + * + * @var array + */ + public static $modules = ['datetime']; + + protected function setUp() { + parent::setUp(); + + // Create a field with settings to validate. + $this->fieldStorage = FieldStorageConfig::create([ + 'field_name' => 'field_datetime', + 'type' => 'datetime', + 'entity_type' => 'entity_test', + 'settings' => ['datetime_type' => DateTimeItem::DATETIME_TYPE_DATETIME], + ]); + $this->fieldStorage->save(); + $this->field = FieldConfig::create([ + 'field_storage' => $this->fieldStorage, + 'bundle' => 'entity_test', + 'settings' => [ + 'default_value' => 'blank', + ], + ]); + $this->field->save(); + } + + /** + * Tests using entity fields of the datetime field type. + */ + public function testDateTime() { + $this->fieldStorage->setSetting('datetime_type', DateTimeItem::DATETIME_TYPE_DATETIME); + $this->fieldStorage->save(); + + // Verify entity creation. + $entity = EntityTest::create(); + $value = '2014-01-01T20:00:00'; + $entity->field_datetime = $value; + $entity->name->value = $this->randomMachineName(); + $this->entityValidateAndSave($entity); + + // Verify entity has been created properly. + $id = $entity->id(); + $entity = EntityTest::load($id); + $this->assertTrue($entity->field_datetime instanceof FieldItemListInterface, 'Field implements interface.'); + $this->assertTrue($entity->field_datetime[0] instanceof FieldItemInterface, 'Field item implements interface.'); + $this->assertEqual($entity->field_datetime->value, $value); + $this->assertEqual($entity->field_datetime[0]->value, $value); + $this->assertEquals(DATETIME_STORAGE_TIMEZONE, $entity->field_datetime->date->getTimeZone()->getName()); + + // Verify changing the date value. + $new_value = '2016-11-04T00:21:00'; + $entity->field_datetime->value = $new_value; + $this->assertEqual($entity->field_datetime->value, $new_value); + $this->assertEquals(DATETIME_STORAGE_TIMEZONE, $entity->field_datetime->date->getTimeZone()->getName()); + + // Read changed entity and assert changed values. + $this->entityValidateAndSave($entity); + $entity = EntityTest::load($id); + $this->assertEqual($entity->field_datetime->value, $new_value); + $this->assertEquals(DATETIME_STORAGE_TIMEZONE, $entity->field_datetime->date->getTimeZone()->getName()); + + // Test the generateSampleValue() method. + $entity = EntityTest::create(); + $entity->field_datetime->generateSampleItems(); + $this->entityValidateAndSave($entity); + } + + /** + * Tests using entity fields of the date field type. + */ + public function testDateOnly() { + $this->fieldStorage->setSetting('datetime_type', DateTimeItem::DATETIME_TYPE_DATE); + $this->fieldStorage->save(); + + // Verify entity creation. + $entity = EntityTest::create(); + $value = '2014-01-01'; + $entity->field_datetime = $value; + $entity->name->value = $this->randomMachineName(); + $this->entityValidateAndSave($entity); + + // Verify entity has been created properly. + $id = $entity->id(); + $entity = EntityTest::load($id); + $this->assertTrue($entity->field_datetime instanceof FieldItemListInterface, 'Field implements interface.'); + $this->assertTrue($entity->field_datetime[0] instanceof FieldItemInterface, 'Field item implements interface.'); + $this->assertEqual($entity->field_datetime->value, $value); + $this->assertEqual($entity->field_datetime[0]->value, $value); + $this->assertEquals(DATETIME_STORAGE_TIMEZONE, $entity->field_datetime->date->getTimeZone()->getName()); + + // Verify changing the date value. + $new_value = '2016-11-04'; + $entity->field_datetime->value = $new_value; + $this->assertEqual($entity->field_datetime->value, $new_value); + $this->assertEquals(DATETIME_STORAGE_TIMEZONE, $entity->field_datetime->date->getTimeZone()->getName()); + + // Read changed entity and assert changed values. + $this->entityValidateAndSave($entity); + $entity = EntityTest::load($id); + $this->assertEqual($entity->field_datetime->value, $new_value); + $this->assertEquals(DATETIME_STORAGE_TIMEZONE, $entity->field_datetime->date->getTimeZone()->getName()); + + // Test the generateSampleValue() method. + $entity = EntityTest::create(); + $entity->field_datetime->generateSampleItems(); + $this->entityValidateAndSave($entity); + } + + /** + * Tests DateTimeItem::setValue(). + */ + public function testSetValue() { + // Test a date+time field. + $this->fieldStorage->setSetting('datetime_type', DateTimeItem::DATETIME_TYPE_DATETIME); + $this->fieldStorage->save(); + + // Test DateTimeItem::setValue() using string. + $entity = EntityTest::create(); + $value = '2014-01-01T20:00:00'; + $entity->get('field_datetime')->set(0, $value); + $this->entityValidateAndSave($entity); + // Load the entity and ensure the field was saved correctly. + $id = $entity->id(); + $entity = EntityTest::load($id); + $this->assertEqual($entity->field_datetime[0]->value, $value, 'DateTimeItem::setValue() works with string value.'); + $this->assertEquals(DATETIME_STORAGE_TIMEZONE, $entity->field_datetime->date->getTimeZone()->getName()); + + // Test DateTimeItem::setValue() using property array. + $entity = EntityTest::create(); + $value = '2014-01-01T20:00:00'; + $entity->set('field_datetime', $value); + $this->entityValidateAndSave($entity); + // Load the entity and ensure the field was saved correctly. + $id = $entity->id(); + $entity = EntityTest::load($id); + $this->assertEqual($entity->field_datetime[0]->value, $value, 'DateTimeItem::setValue() works with array value.'); + $this->assertEquals(DATETIME_STORAGE_TIMEZONE, $entity->field_datetime->date->getTimeZone()->getName()); + + // Test a date-only field. + $this->fieldStorage->setSetting('datetime_type', DateTimeItem::DATETIME_TYPE_DATE); + $this->fieldStorage->save(); + + // Test DateTimeItem::setValue() using string. + $entity = EntityTest::create(); + $value = '2014-01-01'; + $entity->get('field_datetime')->set(0, $value); + $this->entityValidateAndSave($entity); + // Load the entity and ensure the field was saved correctly. + $id = $entity->id(); + $entity = EntityTest::load($id); + $this->assertEqual($entity->field_datetime[0]->value, $value, 'DateTimeItem::setValue() works with string value.'); + $this->assertEquals(DATETIME_STORAGE_TIMEZONE, $entity->field_datetime->date->getTimeZone()->getName()); + + // Test DateTimeItem::setValue() using property array. + $entity = EntityTest::create(); + $value = '2014-01-01'; + $entity->set('field_datetime', $value); + $this->entityValidateAndSave($entity); + // Load the entity and ensure the field was saved correctly. + $id = $entity->id(); + $entity = EntityTest::load($id); + $this->assertEqual($entity->field_datetime[0]->value, $value, 'DateTimeItem::setValue() works with array value.'); + $this->assertEquals(DATETIME_STORAGE_TIMEZONE, $entity->field_datetime->date->getTimeZone()->getName()); + } + + /** + * Tests setting the value of the DateTimeItem directly. + */ + public function testSetValueProperty() { + // Test Date::setValue() with a date+time field. + // Test a date+time field. + $this->fieldStorage->setSetting('datetime_type', DateTimeItem::DATETIME_TYPE_DATETIME); + $this->fieldStorage->save(); + $entity = EntityTest::create(); + $value = '2014-01-01T20:00:00'; + + $entity->set('field_datetime', $value); + $this->entityValidateAndSave($entity); + // Load the entity and ensure the field was saved correctly. + $id = $entity->id(); + $entity = EntityTest::load($id); + $this->assertEqual($entity->field_datetime[0]->value, $value, '"Value" property can be set directly.'); + $this->assertEquals(DATETIME_STORAGE_TIMEZONE, $entity->field_datetime->date->getTimeZone()->getName()); + + // Test Date::setValue() with a date-only field. + // Test a date+time field. + $this->fieldStorage->setSetting('datetime_type', DateTimeItem::DATETIME_TYPE_DATE); + $this->fieldStorage->save(); + $entity = EntityTest::create(); + $value = '2014-01-01'; + + $entity->set('field_datetime', $value); + $this->entityValidateAndSave($entity); + // Load the entity and ensure the field was saved correctly. + $id = $entity->id(); + $entity = EntityTest::load($id); + $this->assertEqual($entity->field_datetime[0]->value, $value, '"Value" property can be set directly.'); + $this->assertEquals(DATETIME_STORAGE_TIMEZONE, $entity->field_datetime->date->getTimeZone()->getName()); + } + + /** + * Tests the constraint validations for fields with date and time. + * + * @dataProvider datetimeValidationProvider + */ + public function testDatetimeValidation($value) { + $this->setExpectedException(\PHPUnit_Framework_AssertionFailedError::class); + + $this->fieldStorage->setSetting('datetime_type', DateTimeItem::DATETIME_TYPE_DATETIME); + $this->fieldStorage->save(); + $entity = EntityTest::create(); + + $entity->set('field_datetime', $value); + $this->entityValidateAndSave($entity); + } + + /** + * Provider for testDatetimeValidation(). + */ + public function datetimeValidationProvider() { + return [ + // Valid ISO 8601 dates, but unsupported by DateTimeItem. + ['2014-01-01T20:00:00Z'], + ['2014-01-01T20:00:00+04:00'], + ['2014-01-01T20:00:00+0400'], + ['2014-01-01T20:00:00+04'], + ['2014-01-01T20:00:00.123'], + ['2014-01-01T200000'], + ['2014-01-01T2000'], + ['2014-01-01T20'], + ['20140101T20:00:00'], + ['2014-01T20:00:00'], + ['2014-001T20:00:00'], + ['2014001T20:00:00'], + // Valid date strings, but unsupported by DateTimeItem. + ['2016-11-03 20:52:00'], + ['Thu, 03 Nov 2014 20:52:00 -0400'], + ['Thursday, November 3, 2016 - 20:52'], + ['Thu, 11/03/2016 - 20:52'], + ['11/03/2016 - 20:52'], + // Invalid date strings. + ['YYYY-01-01T20:00:00'], + ['2014-MM-01T20:00:00'], + ['2014-01-DDT20:00:00'], + ['2014-01-01Thh:00:00'], + ['2014-01-01T20:mm:00'], + ['2014-01-01T20:00:ss'], + // Invalid dates. + ['2014-13-13T20:00:00'], + ['2014-01-55T20:00:00'], + ['2014-01-01T25:00:00'], + ['2014-01-01T00:70:00'], + ['2014-01-01T00:00:70'], + // Proper format for different field setting. + ['2014-01-01'], + // Wrong input type. + [['2014', '01', '01', '00', '00', '00']], + ]; + } + + /** + * Tests the constraint validations for fields with date only. + * + * @dataProvider dateonlyValidationProvider + */ + public function testDateonlyValidation($value) { + $this->setExpectedException(\PHPUnit_Framework_AssertionFailedError::class); + + $this->fieldStorage->setSetting('datetime_type', DateTimeItem::DATETIME_TYPE_DATE); + $this->fieldStorage->save(); + $entity = EntityTest::create(); + + $entity->set('field_datetime', $value); + $this->entityValidateAndSave($entity); + } + + /** + * Provider for testDatetimeValidation(). + */ + public function dateonlyValidationProvider() { + return [ + // Valid date strings, but unsupported by DateTimeItem. + ['Thu, 03 Nov 2014'], + ['Thursday, November 3, 2016'], + ['Thu, 11/03/2016'], + ['11/03/2016'], + // Invalid date strings. + ['YYYY-01-01'], + ['2014-MM-01'], + ['2014-01-DD'], + // Invalid dates. + ['2014-13-01'], + ['2014-01-55'], + // Proper format for different field setting. + ['2014-01-01T20:00:00'], + // Wrong input type. + [['2014', '01', '01']], + ]; + } + +}