Move into nested docroot
This commit is contained in:
parent
83a0d3a149
commit
c8b70abde9
13405 changed files with 0 additions and 0 deletions
182
web/core/modules/datetime/src/Tests/DateTestBase.php
Normal file
182
web/core/modules/datetime/src/Tests/DateTestBase.php
Normal file
|
@ -0,0 +1,182 @@
|
|||
<?php
|
||||
|
||||
namespace Drupal\datetime\Tests;
|
||||
|
||||
use Drupal\Component\Utility\Unicode;
|
||||
use Drupal\Core\Entity\Entity\EntityFormDisplay;
|
||||
use Drupal\Core\Entity\Entity\EntityViewDisplay;
|
||||
use Drupal\datetime_range\Plugin\Field\FieldType\DateRangeItem;
|
||||
use Drupal\entity_test\Entity\EntityTest;
|
||||
use Drupal\field\Entity\FieldConfig;
|
||||
use Drupal\field\Entity\FieldStorageConfig;
|
||||
use Drupal\simpletest\WebTestBase;
|
||||
|
||||
/**
|
||||
* Provides a base class for testing Datetime field functionality.
|
||||
*/
|
||||
abstract class DateTestBase extends WebTestBase {
|
||||
|
||||
/**
|
||||
* Modules to enable.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
public static $modules = ['node', 'entity_test', 'datetime', 'field_ui'];
|
||||
|
||||
/**
|
||||
* An array of display options to pass to entity_get_display()
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
protected $displayOptions;
|
||||
|
||||
/**
|
||||
* 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;
|
||||
|
||||
/**
|
||||
* The date formatter service.
|
||||
*
|
||||
* @var \Drupal\Core\Datetime\DateFormatterInterface
|
||||
*/
|
||||
protected $dateFormatter;
|
||||
|
||||
/**
|
||||
* An array of timezone extremes to test.
|
||||
*
|
||||
* @var string[]
|
||||
*/
|
||||
protected static $timezones = [
|
||||
// UTC-12, no DST.
|
||||
'Pacific/Kwajalein',
|
||||
// UTC-11, no DST
|
||||
'Pacific/Midway',
|
||||
// UTC-7, no DST.
|
||||
'America/Phoenix',
|
||||
// UTC.
|
||||
'UTC',
|
||||
// UTC+5:30, no DST.
|
||||
'Asia/Kolkata',
|
||||
// UTC+12, no DST
|
||||
'Pacific/Funafuti',
|
||||
// UTC+13, no DST.
|
||||
'Pacific/Tongatapu',
|
||||
];
|
||||
|
||||
/**
|
||||
* Returns the type of field to be tested.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
abstract protected function getTestFieldType();
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
protected function setUp() {
|
||||
parent::setUp();
|
||||
|
||||
$web_user = $this->drupalCreateUser([
|
||||
'access content',
|
||||
'view test entity',
|
||||
'administer entity_test content',
|
||||
'administer entity_test form display',
|
||||
'administer content types',
|
||||
'administer node fields',
|
||||
]);
|
||||
$this->drupalLogin($web_user);
|
||||
|
||||
// Create a field with settings to validate.
|
||||
$this->createField();
|
||||
|
||||
$this->dateFormatter = $this->container->get('date.formatter');
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a date test field.
|
||||
*/
|
||||
protected function createField() {
|
||||
$field_name = Unicode::strtolower($this->randomMachineName());
|
||||
$type = $this->getTestFieldType();
|
||||
$widget_type = $formatter_type = $type . '_default';
|
||||
|
||||
$this->fieldStorage = FieldStorageConfig::create([
|
||||
'field_name' => $field_name,
|
||||
'entity_type' => 'entity_test',
|
||||
'type' => $type,
|
||||
'settings' => ['datetime_type' => DateRangeItem::DATETIME_TYPE_DATE],
|
||||
]);
|
||||
$this->fieldStorage->save();
|
||||
$this->field = FieldConfig::create([
|
||||
'field_storage' => $this->fieldStorage,
|
||||
'bundle' => 'entity_test',
|
||||
'required' => TRUE,
|
||||
]);
|
||||
$this->field->save();
|
||||
|
||||
EntityFormDisplay::load('entity_test.entity_test.default')
|
||||
->setComponent($field_name, ['type' => $widget_type])
|
||||
->save();
|
||||
|
||||
$this->displayOptions = [
|
||||
'type' => $formatter_type,
|
||||
'label' => 'hidden',
|
||||
'settings' => ['format_type' => 'medium'] + $this->defaultSettings,
|
||||
];
|
||||
EntityViewDisplay::create([
|
||||
'targetEntityType' => $this->field->getTargetEntityTypeId(),
|
||||
'bundle' => $this->field->getTargetBundle(),
|
||||
'mode' => 'full',
|
||||
'status' => TRUE,
|
||||
])->setComponent($field_name, $this->displayOptions)
|
||||
->save();
|
||||
}
|
||||
|
||||
/**
|
||||
* Renders a entity_test and sets the output in the internal browser.
|
||||
*
|
||||
* @param int $id
|
||||
* The entity_test ID to render.
|
||||
* @param string $view_mode
|
||||
* (optional) The view mode to use for rendering. Defaults to 'full'.
|
||||
* @param bool $reset
|
||||
* (optional) Whether to reset the entity_test controller cache. Defaults to
|
||||
* TRUE to simplify testing.
|
||||
*/
|
||||
protected function renderTestEntity($id, $view_mode = 'full', $reset = TRUE) {
|
||||
if ($reset) {
|
||||
$this->container->get('entity_type.manager')->getStorage('entity_test')->resetCache([$id]);
|
||||
}
|
||||
$entity = EntityTest::load($id);
|
||||
$display = EntityViewDisplay::collectRenderDisplay($entity, $view_mode);
|
||||
$build = $display->build($entity);
|
||||
$output = $this->container->get('renderer')->renderRoot($build);
|
||||
$this->setRawContent($output);
|
||||
$this->verbose($output);
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the site timezone to a given timezone.
|
||||
*
|
||||
* @param string $timezone
|
||||
* The timezone identifier to set.
|
||||
*/
|
||||
protected function setSiteTimezone($timezone) {
|
||||
// Set an explicit site timezone, and disallow per-user timezones.
|
||||
$this->config('system.date')
|
||||
->set('timezone.user.configurable', 0)
|
||||
->set('timezone.default', $timezone)
|
||||
->save();
|
||||
}
|
||||
|
||||
}
|
822
web/core/modules/datetime/src/Tests/DateTimeFieldTest.php
Normal file
822
web/core/modules/datetime/src/Tests/DateTimeFieldTest.php
Normal file
|
@ -0,0 +1,822 @@
|
|||
<?php
|
||||
|
||||
namespace Drupal\datetime\Tests;
|
||||
|
||||
use Drupal\Component\Utility\SafeMarkup;
|
||||
use Drupal\Component\Utility\Unicode;
|
||||
use Drupal\Core\Datetime\DrupalDateTime;
|
||||
use Drupal\Core\Datetime\Entity\DateFormat;
|
||||
use Drupal\entity_test\Entity\EntityTest;
|
||||
use Drupal\field\Entity\FieldConfig;
|
||||
use Drupal\field\Entity\FieldStorageConfig;
|
||||
use Drupal\node\Entity\Node;
|
||||
|
||||
/**
|
||||
* Tests Datetime field functionality.
|
||||
*
|
||||
* @group datetime
|
||||
*/
|
||||
class DateTimeFieldTest extends DateTestBase {
|
||||
|
||||
/**
|
||||
* The default display settings to use for the formatters.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
protected $defaultSettings = ['timezone_override' => ''];
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
protected function getTestFieldType() {
|
||||
return 'datetime';
|
||||
}
|
||||
|
||||
/**
|
||||
* Tests date field functionality.
|
||||
*/
|
||||
function testDateField() {
|
||||
$field_name = $this->fieldStorage->getName();
|
||||
|
||||
// Loop through defined timezones to test that date-only fields work at the
|
||||
// extremes.
|
||||
foreach (static::$timezones as $timezone) {
|
||||
|
||||
$this->setSiteTimezone($timezone);
|
||||
|
||||
// Display creation form.
|
||||
$this->drupalGet('entity_test/add');
|
||||
$this->assertFieldByName("{$field_name}[0][value][date]", '', 'Date element found.');
|
||||
$this->assertFieldByXPath('//*[@id="edit-' . $field_name . '-wrapper"]/h4[contains(@class, "js-form-required")]', TRUE, 'Required markup found');
|
||||
$this->assertNoFieldByName("{$field_name}[0][value][time]", '', 'Time element not found.');
|
||||
|
||||
// Build up a date in the UTC timezone. Note that using this will also
|
||||
// mimic the user in a different timezone simply entering '2012-12-31' via
|
||||
// the UI.
|
||||
$value = '2012-12-31 00:00:00';
|
||||
$date = new DrupalDateTime($value, DATETIME_STORAGE_TIMEZONE);
|
||||
|
||||
// Submit a valid date and ensure it is accepted.
|
||||
$date_format = DateFormat::load('html_date')->getPattern();
|
||||
$time_format = DateFormat::load('html_time')->getPattern();
|
||||
|
||||
$edit = array(
|
||||
"{$field_name}[0][value][date]" => $date->format($date_format),
|
||||
);
|
||||
$this->drupalPostForm(NULL, $edit, t('Save'));
|
||||
preg_match('|entity_test/manage/(\d+)|', $this->url, $match);
|
||||
$id = $match[1];
|
||||
$this->assertText(t('entity_test @id has been created.', array('@id' => $id)));
|
||||
$this->assertRaw($date->format($date_format));
|
||||
$this->assertNoRaw($date->format($time_format));
|
||||
|
||||
// Verify the date doesn't change if using a timezone that is UTC+12 when
|
||||
// the entity is edited through the form.
|
||||
$entity = EntityTest::load($id);
|
||||
$this->assertEqual('2012-12-31', $entity->{$field_name}->value);
|
||||
$this->drupalGet('entity_test/manage/' . $id . '/edit');
|
||||
$this->drupalPostForm(NULL, [], t('Save'));
|
||||
$this->drupalGet('entity_test/manage/' . $id . '/edit');
|
||||
$this->drupalPostForm(NULL, [], t('Save'));
|
||||
$this->drupalGet('entity_test/manage/' . $id . '/edit');
|
||||
$this->drupalPostForm(NULL, [], t('Save'));
|
||||
$entity = EntityTest::load($id);
|
||||
$this->assertEqual('2012-12-31', $entity->{$field_name}->value);
|
||||
|
||||
// Reset display options since these get changed below.
|
||||
$this->displayOptions = array(
|
||||
'type' => 'datetime_default',
|
||||
'label' => 'hidden',
|
||||
'settings' => array('format_type' => 'medium') + $this->defaultSettings,
|
||||
);
|
||||
// Verify that the date is output according to the formatter settings.
|
||||
$options = array(
|
||||
'format_type' => array('short', 'medium', 'long'),
|
||||
);
|
||||
// Formats that display a time component for date-only fields will display
|
||||
// the default time, so that is applied before calculating the expected
|
||||
// value.
|
||||
datetime_date_default_time($date);
|
||||
foreach ($options as $setting => $values) {
|
||||
foreach ($values as $new_value) {
|
||||
// Update the entity display settings.
|
||||
$this->displayOptions['settings'] = array($setting => $new_value) + $this->defaultSettings;
|
||||
entity_get_display($this->field->getTargetEntityTypeId(), $this->field->getTargetBundle(), 'full')
|
||||
->setComponent($field_name, $this->displayOptions)
|
||||
->save();
|
||||
|
||||
$this->renderTestEntity($id);
|
||||
switch ($setting) {
|
||||
case 'format_type':
|
||||
// Verify that a date is displayed. Since this is a date-only
|
||||
// field, it is expected to display the time as 00:00:00.
|
||||
$expected = format_date($date->getTimestamp(), $new_value, '', DATETIME_STORAGE_TIMEZONE);
|
||||
$expected_iso = format_date($date->getTimestamp(), 'custom', 'Y-m-d\TH:i:s\Z', DATETIME_STORAGE_TIMEZONE);
|
||||
$this->renderTestEntity($id);
|
||||
$this->assertFieldByXPath('//time[@datetime="' . $expected_iso . '"]', $expected, SafeMarkup::format('Formatted date field using %value format displayed as %expected with %expected_iso attribute.', array('%value' => $new_value, '%expected' => $expected, '%expected_iso' => $expected_iso)));
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Verify that the plain formatter works.
|
||||
$this->displayOptions['type'] = 'datetime_plain';
|
||||
$this->displayOptions['settings'] = $this->defaultSettings;
|
||||
entity_get_display($this->field->getTargetEntityTypeId(), $this->field->getTargetBundle(), 'full')
|
||||
->setComponent($field_name, $this->displayOptions)
|
||||
->save();
|
||||
$expected = $date->format(DATETIME_DATE_STORAGE_FORMAT);
|
||||
$this->renderTestEntity($id);
|
||||
$this->assertText($expected, SafeMarkup::format('Formatted date field using plain format displayed as %expected.', array('%expected' => $expected)));
|
||||
|
||||
// Verify that the 'datetime_custom' formatter works.
|
||||
$this->displayOptions['type'] = 'datetime_custom';
|
||||
$this->displayOptions['settings'] = array('date_format' => 'm/d/Y') + $this->defaultSettings;
|
||||
entity_get_display($this->field->getTargetEntityTypeId(), $this->field->getTargetBundle(), 'full')
|
||||
->setComponent($field_name, $this->displayOptions)
|
||||
->save();
|
||||
$expected = $date->format($this->displayOptions['settings']['date_format']);
|
||||
$this->renderTestEntity($id);
|
||||
$this->assertText($expected, SafeMarkup::format('Formatted date field using datetime_custom format displayed as %expected.', array('%expected' => $expected)));
|
||||
|
||||
// Verify that the 'datetime_time_ago' formatter works for intervals in the
|
||||
// past. First update the test entity so that the date difference always
|
||||
// has the same interval. Since the database always stores UTC, and the
|
||||
// interval will use this, force the test date to use UTC and not the local
|
||||
// or user timezome.
|
||||
$timestamp = REQUEST_TIME - 87654321;
|
||||
$entity = EntityTest::load($id);
|
||||
$field_name = $this->fieldStorage->getName();
|
||||
$date = DrupalDateTime::createFromTimestamp($timestamp, 'UTC');
|
||||
$entity->{$field_name}->value = $date->format($date_format);
|
||||
$entity->save();
|
||||
|
||||
$this->displayOptions['type'] = 'datetime_time_ago';
|
||||
$this->displayOptions['settings'] = array(
|
||||
'future_format' => '@interval in the future',
|
||||
'past_format' => '@interval in the past',
|
||||
'granularity' => 3,
|
||||
);
|
||||
entity_get_display($this->field->getTargetEntityTypeId(), $this->field->getTargetBundle(), 'full')
|
||||
->setComponent($field_name, $this->displayOptions)
|
||||
->save();
|
||||
$expected = SafeMarkup::format($this->displayOptions['settings']['past_format'], [
|
||||
'@interval' => $this->dateFormatter->formatTimeDiffSince($timestamp, ['granularity' => $this->displayOptions['settings']['granularity']])
|
||||
]);
|
||||
$this->renderTestEntity($id);
|
||||
$this->assertText($expected, SafeMarkup::format('Formatted date field using datetime_time_ago format displayed as %expected.', array('%expected' => $expected)));
|
||||
|
||||
// Verify that the 'datetime_time_ago' formatter works for intervals in the
|
||||
// future. First update the test entity so that the date difference always
|
||||
// has the same interval. Since the database always stores UTC, and the
|
||||
// interval will use this, force the test date to use UTC and not the local
|
||||
// or user timezome.
|
||||
$timestamp = REQUEST_TIME + 87654321;
|
||||
$entity = EntityTest::load($id);
|
||||
$field_name = $this->fieldStorage->getName();
|
||||
$date = DrupalDateTime::createFromTimestamp($timestamp, 'UTC');
|
||||
$entity->{$field_name}->value = $date->format($date_format);
|
||||
$entity->save();
|
||||
|
||||
entity_get_display($this->field->getTargetEntityTypeId(), $this->field->getTargetBundle(), 'full')
|
||||
->setComponent($field_name, $this->displayOptions)
|
||||
->save();
|
||||
$expected = SafeMarkup::format($this->displayOptions['settings']['future_format'], [
|
||||
'@interval' => $this->dateFormatter->formatTimeDiffUntil($timestamp, ['granularity' => $this->displayOptions['settings']['granularity']])
|
||||
]);
|
||||
$this->renderTestEntity($id);
|
||||
$this->assertText($expected, SafeMarkup::format('Formatted date field using datetime_time_ago format displayed as %expected.', array('%expected' => $expected)));
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Tests date and time field.
|
||||
*/
|
||||
function testDatetimeField() {
|
||||
$field_name = $this->fieldStorage->getName();
|
||||
// Change the field to a datetime field.
|
||||
$this->fieldStorage->setSetting('datetime_type', 'datetime');
|
||||
$this->fieldStorage->save();
|
||||
|
||||
// Display creation form.
|
||||
$this->drupalGet('entity_test/add');
|
||||
$this->assertFieldByName("{$field_name}[0][value][date]", '', 'Date element found.');
|
||||
$this->assertFieldByName("{$field_name}[0][value][time]", '', 'Time element found.');
|
||||
|
||||
// Build up a date in the UTC timezone.
|
||||
$value = '2012-12-31 00:00:00';
|
||||
$date = new DrupalDateTime($value, 'UTC');
|
||||
|
||||
// Update the timezone to the system default.
|
||||
$date->setTimezone(timezone_open(drupal_get_user_timezone()));
|
||||
|
||||
// Submit a valid date and ensure it is accepted.
|
||||
$date_format = DateFormat::load('html_date')->getPattern();
|
||||
$time_format = DateFormat::load('html_time')->getPattern();
|
||||
|
||||
$edit = array(
|
||||
"{$field_name}[0][value][date]" => $date->format($date_format),
|
||||
"{$field_name}[0][value][time]" => $date->format($time_format),
|
||||
);
|
||||
$this->drupalPostForm(NULL, $edit, t('Save'));
|
||||
preg_match('|entity_test/manage/(\d+)|', $this->url, $match);
|
||||
$id = $match[1];
|
||||
$this->assertText(t('entity_test @id has been created.', array('@id' => $id)));
|
||||
$this->assertRaw($date->format($date_format));
|
||||
$this->assertRaw($date->format($time_format));
|
||||
|
||||
// Verify that the date is output according to the formatter settings.
|
||||
$options = array(
|
||||
'format_type' => array('short', 'medium', 'long'),
|
||||
);
|
||||
foreach ($options as $setting => $values) {
|
||||
foreach ($values as $new_value) {
|
||||
// Update the entity display settings.
|
||||
$this->displayOptions['settings'] = array($setting => $new_value) + $this->defaultSettings;
|
||||
entity_get_display($this->field->getTargetEntityTypeId(), $this->field->getTargetBundle(), 'full')
|
||||
->setComponent($field_name, $this->displayOptions)
|
||||
->save();
|
||||
|
||||
$this->renderTestEntity($id);
|
||||
switch ($setting) {
|
||||
case 'format_type':
|
||||
// Verify that a date is displayed.
|
||||
$expected = format_date($date->getTimestamp(), $new_value);
|
||||
$expected_iso = format_date($date->getTimestamp(), 'custom', 'Y-m-d\TH:i:s\Z', 'UTC');
|
||||
$this->renderTestEntity($id);
|
||||
$this->assertFieldByXPath('//time[@datetime="' . $expected_iso . '"]', $expected, SafeMarkup::format('Formatted date field using %value format displayed as %expected with %expected_iso attribute.', array('%value' => $new_value, '%expected' => $expected, '%expected_iso' => $expected_iso)));
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Verify that the plain formatter works.
|
||||
$this->displayOptions['type'] = 'datetime_plain';
|
||||
$this->displayOptions['settings'] = $this->defaultSettings;
|
||||
entity_get_display($this->field->getTargetEntityTypeId(), $this->field->getTargetBundle(), 'full')
|
||||
->setComponent($field_name, $this->displayOptions)
|
||||
->save();
|
||||
$expected = $date->format(DATETIME_DATETIME_STORAGE_FORMAT);
|
||||
$this->renderTestEntity($id);
|
||||
$this->assertText($expected, SafeMarkup::format('Formatted date field using plain format displayed as %expected.', array('%expected' => $expected)));
|
||||
|
||||
// Verify that the 'datetime_custom' formatter works.
|
||||
$this->displayOptions['type'] = 'datetime_custom';
|
||||
$this->displayOptions['settings'] = array('date_format' => 'm/d/Y g:i:s A') + $this->defaultSettings;
|
||||
entity_get_display($this->field->getTargetEntityTypeId(), $this->field->getTargetBundle(), 'full')
|
||||
->setComponent($field_name, $this->displayOptions)
|
||||
->save();
|
||||
$expected = $date->format($this->displayOptions['settings']['date_format']);
|
||||
$this->renderTestEntity($id);
|
||||
$this->assertText($expected, SafeMarkup::format('Formatted date field using datetime_custom format displayed as %expected.', array('%expected' => $expected)));
|
||||
|
||||
// Verify that the 'timezone_override' setting works.
|
||||
$this->displayOptions['type'] = 'datetime_custom';
|
||||
$this->displayOptions['settings'] = array('date_format' => 'm/d/Y g:i:s A', 'timezone_override' => 'America/New_York') + $this->defaultSettings;
|
||||
entity_get_display($this->field->getTargetEntityTypeId(), $this->field->getTargetBundle(), 'full')
|
||||
->setComponent($field_name, $this->displayOptions)
|
||||
->save();
|
||||
$expected = $date->format($this->displayOptions['settings']['date_format'], array('timezone' => 'America/New_York'));
|
||||
$this->renderTestEntity($id);
|
||||
$this->assertText($expected, SafeMarkup::format('Formatted date field using datetime_custom format displayed as %expected.', array('%expected' => $expected)));
|
||||
|
||||
// Verify that the 'datetime_time_ago' formatter works for intervals in the
|
||||
// past. First update the test entity so that the date difference always
|
||||
// has the same interval. Since the database always stores UTC, and the
|
||||
// interval will use this, force the test date to use UTC and not the local
|
||||
// or user timezome.
|
||||
$timestamp = REQUEST_TIME - 87654321;
|
||||
$entity = EntityTest::load($id);
|
||||
$field_name = $this->fieldStorage->getName();
|
||||
$date = DrupalDateTime::createFromTimestamp($timestamp, 'UTC');
|
||||
$entity->{$field_name}->value = $date->format(DATETIME_DATETIME_STORAGE_FORMAT);
|
||||
$entity->save();
|
||||
|
||||
$this->displayOptions['type'] = 'datetime_time_ago';
|
||||
$this->displayOptions['settings'] = array(
|
||||
'future_format' => '@interval from now',
|
||||
'past_format' => '@interval earlier',
|
||||
'granularity' => 3,
|
||||
);
|
||||
entity_get_display($this->field->getTargetEntityTypeId(), $this->field->getTargetBundle(), 'full')
|
||||
->setComponent($field_name, $this->displayOptions)
|
||||
->save();
|
||||
$expected = SafeMarkup::format($this->displayOptions['settings']['past_format'], [
|
||||
'@interval' => $this->dateFormatter->formatTimeDiffSince($timestamp, ['granularity' => $this->displayOptions['settings']['granularity']])
|
||||
]);
|
||||
$this->renderTestEntity($id);
|
||||
$this->assertText($expected, SafeMarkup::format('Formatted date field using datetime_time_ago format displayed as %expected.', array('%expected' => $expected)));
|
||||
|
||||
// Verify that the 'datetime_time_ago' formatter works for intervals in the
|
||||
// future. First update the test entity so that the date difference always
|
||||
// has the same interval. Since the database always stores UTC, and the
|
||||
// interval will use this, force the test date to use UTC and not the local
|
||||
// or user timezome.
|
||||
$timestamp = REQUEST_TIME + 87654321;
|
||||
$entity = EntityTest::load($id);
|
||||
$field_name = $this->fieldStorage->getName();
|
||||
$date = DrupalDateTime::createFromTimestamp($timestamp, 'UTC');
|
||||
$entity->{$field_name}->value = $date->format(DATETIME_DATETIME_STORAGE_FORMAT);
|
||||
$entity->save();
|
||||
|
||||
entity_get_display($this->field->getTargetEntityTypeId(), $this->field->getTargetBundle(), 'full')
|
||||
->setComponent($field_name, $this->displayOptions)
|
||||
->save();
|
||||
$expected = SafeMarkup::format($this->displayOptions['settings']['future_format'], [
|
||||
'@interval' => $this->dateFormatter->formatTimeDiffUntil($timestamp, ['granularity' => $this->displayOptions['settings']['granularity']])
|
||||
]);
|
||||
$this->renderTestEntity($id);
|
||||
$this->assertText($expected, SafeMarkup::format('Formatted date field using datetime_time_ago format displayed as %expected.', array('%expected' => $expected)));
|
||||
}
|
||||
|
||||
/**
|
||||
* Tests Date List Widget functionality.
|
||||
*/
|
||||
function testDatelistWidget() {
|
||||
$field_name = $this->fieldStorage->getName();
|
||||
|
||||
// Ensure field is set to a date only field.
|
||||
$this->fieldStorage->setSetting('datetime_type', 'date');
|
||||
$this->fieldStorage->save();
|
||||
|
||||
// Change the widget to a datelist widget.
|
||||
entity_get_form_display($this->field->getTargetEntityTypeId(), $this->field->getTargetBundle(), 'default')
|
||||
->setComponent($field_name, array(
|
||||
'type' => 'datetime_datelist',
|
||||
'settings' => array(
|
||||
'date_order' => 'YMD',
|
||||
),
|
||||
))
|
||||
->save();
|
||||
\Drupal::entityManager()->clearCachedFieldDefinitions();
|
||||
|
||||
// Display creation form.
|
||||
$this->drupalGet('entity_test/add');
|
||||
|
||||
// Assert that Hour and Minute Elements do not appear on Date Only
|
||||
$this->assertNoFieldByXPath("//*[@id=\"edit-$field_name-0-value-hour\"]", NULL, 'Hour element not found on Date Only.');
|
||||
$this->assertNoFieldByXPath("//*[@id=\"edit-$field_name-0-value-minute\"]", NULL, 'Minute element not found on Date Only.');
|
||||
|
||||
// Go to the form display page to assert that increment option does not appear on Date Only
|
||||
$fieldEditUrl = 'entity_test/structure/entity_test/form-display';
|
||||
$this->drupalGet($fieldEditUrl);
|
||||
|
||||
// Click on the widget settings button to open the widget settings form.
|
||||
$this->drupalPostAjaxForm(NULL, array(), $field_name . "_settings_edit");
|
||||
$xpathIncr = "//select[starts-with(@id, \"edit-fields-$field_name-settings-edit-form-settings-increment\")]";
|
||||
$this->assertNoFieldByXPath($xpathIncr, NULL, 'Increment element not found for Date Only.');
|
||||
|
||||
// Change the field to a datetime field.
|
||||
$this->fieldStorage->setSetting('datetime_type', 'datetime');
|
||||
$this->fieldStorage->save();
|
||||
|
||||
// Change the widget to a datelist widget.
|
||||
entity_get_form_display($this->field->getTargetEntityTypeId(), $this->field->getTargetBundle(), 'default')
|
||||
->setComponent($field_name, array(
|
||||
'type' => 'datetime_datelist',
|
||||
'settings' => array(
|
||||
'increment' => 1,
|
||||
'date_order' => 'YMD',
|
||||
'time_type' => '12',
|
||||
),
|
||||
))
|
||||
->save();
|
||||
\Drupal::entityManager()->clearCachedFieldDefinitions();
|
||||
|
||||
// Go to the form display page to assert that increment option does appear on Date Time
|
||||
$fieldEditUrl = 'entity_test/structure/entity_test/form-display';
|
||||
$this->drupalGet($fieldEditUrl);
|
||||
|
||||
// Click on the widget settings button to open the widget settings form.
|
||||
$this->drupalPostAjaxForm(NULL, array(), $field_name . "_settings_edit");
|
||||
$this->assertFieldByXPath($xpathIncr, NULL, 'Increment element found for Date and time.');
|
||||
|
||||
// Display creation form.
|
||||
$this->drupalGet('entity_test/add');
|
||||
|
||||
$this->assertFieldByXPath("//*[@id=\"edit-$field_name-0-value-year\"]", NULL, 'Year element found.');
|
||||
$this->assertOptionSelected("edit-$field_name-0-value-year", '', 'No year selected.');
|
||||
$this->assertOptionByText("edit-$field_name-0-value-year", t('Year'));
|
||||
$this->assertFieldByXPath("//*[@id=\"edit-$field_name-0-value-month\"]", NULL, 'Month element found.');
|
||||
$this->assertOptionSelected("edit-$field_name-0-value-month", '', 'No month selected.');
|
||||
$this->assertOptionByText("edit-$field_name-0-value-month", t('Month'));
|
||||
$this->assertFieldByXPath("//*[@id=\"edit-$field_name-0-value-day\"]", NULL, 'Day element found.');
|
||||
$this->assertOptionSelected("edit-$field_name-0-value-day", '', 'No day selected.');
|
||||
$this->assertOptionByText("edit-$field_name-0-value-day", t('Day'));
|
||||
$this->assertFieldByXPath("//*[@id=\"edit-$field_name-0-value-hour\"]", NULL, 'Hour element found.');
|
||||
$this->assertOptionSelected("edit-$field_name-0-value-hour", '', 'No hour selected.');
|
||||
$this->assertOptionByText("edit-$field_name-0-value-hour", t('Hour'));
|
||||
$this->assertFieldByXPath("//*[@id=\"edit-$field_name-0-value-minute\"]", NULL, 'Minute element found.');
|
||||
$this->assertOptionSelected("edit-$field_name-0-value-minute", '', 'No minute selected.');
|
||||
$this->assertOptionByText("edit-$field_name-0-value-minute", t('Minute'));
|
||||
$this->assertNoFieldByXPath("//*[@id=\"edit-$field_name-0-value-second\"]", NULL, 'Second element not found.');
|
||||
$this->assertFieldByXPath("//*[@id=\"edit-$field_name-0-value-ampm\"]", NULL, 'AMPM element found.');
|
||||
$this->assertOptionSelected("edit-$field_name-0-value-ampm", '', 'No ampm selected.');
|
||||
$this->assertOptionByText("edit-$field_name-0-value-ampm", t('AM/PM'));
|
||||
|
||||
// Submit a valid date and ensure it is accepted.
|
||||
$date_value = array('year' => 2012, 'month' => 12, 'day' => 31, 'hour' => 5, 'minute' => 15);
|
||||
|
||||
$edit = array();
|
||||
// Add the ampm indicator since we are testing 12 hour time.
|
||||
$date_value['ampm'] = 'am';
|
||||
foreach ($date_value as $part => $value) {
|
||||
$edit["{$field_name}[0][value][$part]"] = $value;
|
||||
}
|
||||
|
||||
$this->drupalPostForm(NULL, $edit, t('Save'));
|
||||
preg_match('|entity_test/manage/(\d+)|', $this->url, $match);
|
||||
$id = $match[1];
|
||||
$this->assertText(t('entity_test @id has been created.', array('@id' => $id)));
|
||||
|
||||
$this->assertOptionSelected("edit-$field_name-0-value-year", '2012', 'Correct year selected.');
|
||||
$this->assertOptionSelected("edit-$field_name-0-value-month", '12', 'Correct month selected.');
|
||||
$this->assertOptionSelected("edit-$field_name-0-value-day", '31', 'Correct day selected.');
|
||||
$this->assertOptionSelected("edit-$field_name-0-value-hour", '5', 'Correct hour selected.');
|
||||
$this->assertOptionSelected("edit-$field_name-0-value-minute", '15', 'Correct minute selected.');
|
||||
$this->assertOptionSelected("edit-$field_name-0-value-ampm", 'am', 'Correct ampm selected.');
|
||||
|
||||
// Test the widget using increment other than 1 and 24 hour mode.
|
||||
entity_get_form_display($this->field->getTargetEntityTypeId(), $this->field->getTargetBundle(), 'default')
|
||||
->setComponent($field_name, array(
|
||||
'type' => 'datetime_datelist',
|
||||
'settings' => array(
|
||||
'increment' => 15,
|
||||
'date_order' => 'YMD',
|
||||
'time_type' => '24',
|
||||
),
|
||||
))
|
||||
->save();
|
||||
\Drupal::entityManager()->clearCachedFieldDefinitions();
|
||||
|
||||
// Display creation form.
|
||||
$this->drupalGet('entity_test/add');
|
||||
|
||||
// Other elements are unaffected by the changed settings.
|
||||
$this->assertFieldByXPath("//*[@id=\"edit-$field_name-0-value-hour\"]", NULL, 'Hour element found.');
|
||||
$this->assertOptionSelected("edit-$field_name-0-value-hour", '', 'No hour selected.');
|
||||
$this->assertNoFieldByXPath("//*[@id=\"edit-$field_name-0-value-ampm\"]", NULL, 'AMPM element not found.');
|
||||
|
||||
// Submit a valid date and ensure it is accepted.
|
||||
$date_value = array('year' => 2012, 'month' => 12, 'day' => 31, 'hour' => 17, 'minute' => 15);
|
||||
|
||||
$edit = array();
|
||||
foreach ($date_value as $part => $value) {
|
||||
$edit["{$field_name}[0][value][$part]"] = $value;
|
||||
}
|
||||
|
||||
$this->drupalPostForm(NULL, $edit, t('Save'));
|
||||
preg_match('|entity_test/manage/(\d+)|', $this->url, $match);
|
||||
$id = $match[1];
|
||||
$this->assertText(t('entity_test @id has been created.', array('@id' => $id)));
|
||||
|
||||
$this->assertOptionSelected("edit-$field_name-0-value-year", '2012', 'Correct year selected.');
|
||||
$this->assertOptionSelected("edit-$field_name-0-value-month", '12', 'Correct month selected.');
|
||||
$this->assertOptionSelected("edit-$field_name-0-value-day", '31', 'Correct day selected.');
|
||||
$this->assertOptionSelected("edit-$field_name-0-value-hour", '17', 'Correct hour selected.');
|
||||
$this->assertOptionSelected("edit-$field_name-0-value-minute", '15', 'Correct minute selected.');
|
||||
|
||||
// Test the widget for partial completion of fields.
|
||||
entity_get_form_display($this->field->getTargetEntityTypeId(), $this->field->getTargetBundle(), 'default')
|
||||
->setComponent($field_name, array(
|
||||
'type' => 'datetime_datelist',
|
||||
'settings' => array(
|
||||
'increment' => 1,
|
||||
'date_order' => 'YMD',
|
||||
'time_type' => '24',
|
||||
),
|
||||
))
|
||||
->save();
|
||||
\Drupal::entityManager()->clearCachedFieldDefinitions();
|
||||
|
||||
// Test the widget for validation notifications.
|
||||
foreach ($this->datelistDataProvider() as $data) {
|
||||
list($date_value, $expected) = $data;
|
||||
|
||||
// Display creation form.
|
||||
$this->drupalGet('entity_test/add');
|
||||
|
||||
// Submit a partial date and ensure and error message is provided.
|
||||
$edit = array();
|
||||
foreach ($date_value as $part => $value) {
|
||||
$edit["{$field_name}[0][value][$part]"] = $value;
|
||||
}
|
||||
|
||||
$this->drupalPostForm(NULL, $edit, t('Save'));
|
||||
$this->assertResponse(200);
|
||||
foreach ($expected as $expected_text) {
|
||||
$this->assertText(t($expected_text));
|
||||
}
|
||||
}
|
||||
|
||||
// Test the widget for complete input with zeros as part of selections.
|
||||
$this->drupalGet('entity_test/add');
|
||||
|
||||
$date_value = array('year' => 2012, 'month' => '12', 'day' => '31', 'hour' => '0', 'minute' => '0');
|
||||
$edit = array();
|
||||
foreach ($date_value as $part => $value) {
|
||||
$edit["{$field_name}[0][value][$part]"] = $value;
|
||||
}
|
||||
|
||||
$this->drupalPostForm(NULL, $edit, t('Save'));
|
||||
$this->assertResponse(200);
|
||||
preg_match('|entity_test/manage/(\d+)|', $this->url, $match);
|
||||
$id = $match[1];
|
||||
$this->assertText(t('entity_test @id has been created.', array('@id' => $id)));
|
||||
|
||||
// Test the widget to ensure zeros are not deselected on validation.
|
||||
$this->drupalGet('entity_test/add');
|
||||
|
||||
$date_value = array('year' => 2012, 'month' => '12', 'day' => '31', 'hour' => '', 'minute' => '0');
|
||||
$edit = array();
|
||||
foreach ($date_value as $part => $value) {
|
||||
$edit["{$field_name}[0][value][$part]"] = $value;
|
||||
}
|
||||
|
||||
$this->drupalPostForm(NULL, $edit, t('Save'));
|
||||
$this->assertResponse(200);
|
||||
$this->assertOptionSelected("edit-$field_name-0-value-minute", '0', 'Correct minute selected.');
|
||||
}
|
||||
|
||||
/**
|
||||
* The data provider for testing the validation of the datelist widget.
|
||||
*
|
||||
* @return array
|
||||
* An array of datelist input permutations to test.
|
||||
*/
|
||||
protected function datelistDataProvider() {
|
||||
return [
|
||||
// Year only selected, validation error on Month, Day, Hour, Minute.
|
||||
[['year' => 2012, 'month' => '', 'day' => '', 'hour' => '', 'minute' => ''], [
|
||||
'A value must be selected for month.',
|
||||
'A value must be selected for day.',
|
||||
'A value must be selected for hour.',
|
||||
'A value must be selected for minute.',
|
||||
]],
|
||||
// Year and Month selected, validation error on Day, Hour, Minute.
|
||||
[['year' => 2012, 'month' => '12', 'day' => '', 'hour' => '', 'minute' => ''], [
|
||||
'A value must be selected for day.',
|
||||
'A value must be selected for hour.',
|
||||
'A value must be selected for minute.',
|
||||
]],
|
||||
// Year, Month and Day selected, validation error on Hour, Minute.
|
||||
[['year' => 2012, 'month' => '12', 'day' => '31', 'hour' => '', 'minute' => ''], [
|
||||
'A value must be selected for hour.',
|
||||
'A value must be selected for minute.',
|
||||
]],
|
||||
// Year, Month, Day and Hour selected, validation error on Minute only.
|
||||
[['year' => 2012, 'month' => '12', 'day' => '31', 'hour' => '0', 'minute' => ''], [
|
||||
'A value must be selected for minute.',
|
||||
]],
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* Test default value functionality.
|
||||
*/
|
||||
function testDefaultValue() {
|
||||
// Create a test content type.
|
||||
$this->drupalCreateContentType(array('type' => 'date_content'));
|
||||
|
||||
// Create a field storage with settings to validate.
|
||||
$field_name = Unicode::strtolower($this->randomMachineName());
|
||||
$field_storage = FieldStorageConfig::create(array(
|
||||
'field_name' => $field_name,
|
||||
'entity_type' => 'node',
|
||||
'type' => 'datetime',
|
||||
'settings' => array('datetime_type' => 'date'),
|
||||
));
|
||||
$field_storage->save();
|
||||
|
||||
$field = FieldConfig::create([
|
||||
'field_storage' => $field_storage,
|
||||
'bundle' => 'date_content',
|
||||
]);
|
||||
$field->save();
|
||||
|
||||
// Loop through defined timezones to test that date-only defaults work at
|
||||
// the extremes.
|
||||
foreach (static::$timezones as $timezone) {
|
||||
|
||||
$this->setSiteTimezone($timezone);
|
||||
|
||||
// Set now as default_value.
|
||||
$field_edit = array(
|
||||
'default_value_input[default_date_type]' => 'now',
|
||||
);
|
||||
$this->drupalPostForm('admin/structure/types/manage/date_content/fields/node.date_content.' . $field_name, $field_edit, t('Save settings'));
|
||||
|
||||
// Check that default value is selected in default value form.
|
||||
$this->drupalGet('admin/structure/types/manage/date_content/fields/node.date_content.' . $field_name);
|
||||
$this->assertOptionSelected('edit-default-value-input-default-date-type', 'now', 'The default value is selected in instance settings page');
|
||||
$this->assertFieldByName('default_value_input[default_date]', '', 'The relative default value is empty in instance settings page');
|
||||
|
||||
// Check if default_date has been stored successfully.
|
||||
$config_entity = $this->config('field.field.node.date_content.' . $field_name)
|
||||
->get();
|
||||
$this->assertEqual($config_entity['default_value'][0], array(
|
||||
'default_date_type' => 'now',
|
||||
'default_date' => 'now',
|
||||
), 'Default value has been stored successfully');
|
||||
|
||||
// Clear field cache in order to avoid stale cache values.
|
||||
\Drupal::entityManager()->clearCachedFieldDefinitions();
|
||||
|
||||
// Create a new node to check that datetime field default value is today.
|
||||
$new_node = Node::create(['type' => 'date_content']);
|
||||
$expected_date = new DrupalDateTime('now', drupal_get_user_timezone());
|
||||
$this->assertEqual($new_node->get($field_name)
|
||||
->offsetGet(0)->value, $expected_date->format(DATETIME_DATE_STORAGE_FORMAT));
|
||||
|
||||
// Set an invalid relative default_value to test validation.
|
||||
$field_edit = array(
|
||||
'default_value_input[default_date_type]' => 'relative',
|
||||
'default_value_input[default_date]' => 'invalid date',
|
||||
);
|
||||
$this->drupalPostForm('admin/structure/types/manage/date_content/fields/node.date_content.' . $field_name, $field_edit, t('Save settings'));
|
||||
|
||||
$this->assertText('The relative date value entered is invalid.');
|
||||
|
||||
// Set a relative default_value.
|
||||
$field_edit = array(
|
||||
'default_value_input[default_date_type]' => 'relative',
|
||||
'default_value_input[default_date]' => '+90 days',
|
||||
);
|
||||
$this->drupalPostForm('admin/structure/types/manage/date_content/fields/node.date_content.' . $field_name, $field_edit, t('Save settings'));
|
||||
|
||||
// Check that default value is selected in default value form.
|
||||
$this->drupalGet('admin/structure/types/manage/date_content/fields/node.date_content.' . $field_name);
|
||||
$this->assertOptionSelected('edit-default-value-input-default-date-type', 'relative', 'The default value is selected in instance settings page');
|
||||
$this->assertFieldByName('default_value_input[default_date]', '+90 days', 'The relative default value is displayed in instance settings page');
|
||||
|
||||
// Check if default_date has been stored successfully.
|
||||
$config_entity = $this->config('field.field.node.date_content.' . $field_name)
|
||||
->get();
|
||||
$this->assertEqual($config_entity['default_value'][0], array(
|
||||
'default_date_type' => 'relative',
|
||||
'default_date' => '+90 days',
|
||||
), 'Default value has been stored successfully');
|
||||
|
||||
// Clear field cache in order to avoid stale cache values.
|
||||
\Drupal::entityManager()->clearCachedFieldDefinitions();
|
||||
|
||||
// Create a new node to check that datetime field default value is +90
|
||||
// days.
|
||||
$new_node = Node::create(['type' => 'date_content']);
|
||||
$expected_date = new DrupalDateTime('+90 days', drupal_get_user_timezone());
|
||||
$this->assertEqual($new_node->get($field_name)
|
||||
->offsetGet(0)->value, $expected_date->format(DATETIME_DATE_STORAGE_FORMAT));
|
||||
|
||||
// Remove default value.
|
||||
$field_edit = array(
|
||||
'default_value_input[default_date_type]' => '',
|
||||
);
|
||||
$this->drupalPostForm('admin/structure/types/manage/date_content/fields/node.date_content.' . $field_name, $field_edit, t('Save settings'));
|
||||
|
||||
// Check that default value is selected in default value form.
|
||||
$this->drupalGet('admin/structure/types/manage/date_content/fields/node.date_content.' . $field_name);
|
||||
$this->assertOptionSelected('edit-default-value-input-default-date-type', '', 'The default value is selected in instance settings page');
|
||||
$this->assertFieldByName('default_value_input[default_date]', '', 'The relative default value is empty in instance settings page');
|
||||
|
||||
// Check if default_date has been stored successfully.
|
||||
$config_entity = $this->config('field.field.node.date_content.' . $field_name)
|
||||
->get();
|
||||
$this->assertTrue(empty($config_entity['default_value']), 'Empty default value has been stored successfully');
|
||||
|
||||
// Clear field cache in order to avoid stale cache values.
|
||||
\Drupal::entityManager()->clearCachedFieldDefinitions();
|
||||
|
||||
// Create a new node to check that datetime field default value is not
|
||||
// set.
|
||||
$new_node = Node::create(['type' => 'date_content']);
|
||||
$this->assertNull($new_node->get($field_name)->value, 'Default value is not set');
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Test that invalid values are caught and marked as invalid.
|
||||
*/
|
||||
function testInvalidField() {
|
||||
// Change the field to a datetime field.
|
||||
$this->fieldStorage->setSetting('datetime_type', 'datetime');
|
||||
$this->fieldStorage->save();
|
||||
$field_name = $this->fieldStorage->getName();
|
||||
|
||||
// Display creation form.
|
||||
$this->drupalGet('entity_test/add');
|
||||
$this->assertFieldByName("{$field_name}[0][value][date]", '', 'Date element found.');
|
||||
$this->assertFieldByName("{$field_name}[0][value][time]", '', 'Time element found.');
|
||||
|
||||
// Submit invalid dates and ensure they is not accepted.
|
||||
$date_value = '';
|
||||
$edit = array(
|
||||
"{$field_name}[0][value][date]" => $date_value,
|
||||
"{$field_name}[0][value][time]" => '12:00:00',
|
||||
);
|
||||
$this->drupalPostForm(NULL, $edit, t('Save'));
|
||||
$this->assertText('date is invalid', 'Empty date value has been caught.');
|
||||
|
||||
$date_value = 'aaaa-12-01';
|
||||
$edit = array(
|
||||
"{$field_name}[0][value][date]" => $date_value,
|
||||
"{$field_name}[0][value][time]" => '00:00:00',
|
||||
);
|
||||
$this->drupalPostForm(NULL, $edit, t('Save'));
|
||||
$this->assertText('date is invalid', format_string('Invalid year value %date has been caught.', array('%date' => $date_value)));
|
||||
|
||||
$date_value = '2012-75-01';
|
||||
$edit = array(
|
||||
"{$field_name}[0][value][date]" => $date_value,
|
||||
"{$field_name}[0][value][time]" => '00:00:00',
|
||||
);
|
||||
$this->drupalPostForm(NULL, $edit, t('Save'));
|
||||
$this->assertText('date is invalid', format_string('Invalid month value %date has been caught.', array('%date' => $date_value)));
|
||||
|
||||
$date_value = '2012-12-99';
|
||||
$edit = array(
|
||||
"{$field_name}[0][value][date]" => $date_value,
|
||||
"{$field_name}[0][value][time]" => '00:00:00',
|
||||
);
|
||||
$this->drupalPostForm(NULL, $edit, t('Save'));
|
||||
$this->assertText('date is invalid', format_string('Invalid day value %date has been caught.', array('%date' => $date_value)));
|
||||
|
||||
$date_value = '2012-12-01';
|
||||
$time_value = '';
|
||||
$edit = array(
|
||||
"{$field_name}[0][value][date]" => $date_value,
|
||||
"{$field_name}[0][value][time]" => $time_value,
|
||||
);
|
||||
$this->drupalPostForm(NULL, $edit, t('Save'));
|
||||
$this->assertText('date is invalid', 'Empty time value has been caught.');
|
||||
|
||||
$date_value = '2012-12-01';
|
||||
$time_value = '49:00:00';
|
||||
$edit = array(
|
||||
"{$field_name}[0][value][date]" => $date_value,
|
||||
"{$field_name}[0][value][time]" => $time_value,
|
||||
);
|
||||
$this->drupalPostForm(NULL, $edit, t('Save'));
|
||||
$this->assertText('date is invalid', format_string('Invalid hour value %time has been caught.', array('%time' => $time_value)));
|
||||
|
||||
$date_value = '2012-12-01';
|
||||
$time_value = '12:99:00';
|
||||
$edit = array(
|
||||
"{$field_name}[0][value][date]" => $date_value,
|
||||
"{$field_name}[0][value][time]" => $time_value,
|
||||
);
|
||||
$this->drupalPostForm(NULL, $edit, t('Save'));
|
||||
$this->assertText('date is invalid', format_string('Invalid minute value %time has been caught.', array('%time' => $time_value)));
|
||||
|
||||
$date_value = '2012-12-01';
|
||||
$time_value = '12:15:99';
|
||||
$edit = array(
|
||||
"{$field_name}[0][value][date]" => $date_value,
|
||||
"{$field_name}[0][value][time]" => $time_value,
|
||||
);
|
||||
$this->drupalPostForm(NULL, $edit, t('Save'));
|
||||
$this->assertText('date is invalid', format_string('Invalid second value %time has been caught.', array('%time' => $time_value)));
|
||||
}
|
||||
|
||||
/**
|
||||
* Tests that 'Date' field storage setting form is disabled if field has data.
|
||||
*/
|
||||
public function testDateStorageSettings() {
|
||||
// Create a test content type.
|
||||
$this->drupalCreateContentType(['type' => 'date_content']);
|
||||
|
||||
// Create a field storage with settings to validate.
|
||||
$field_name = Unicode::strtolower($this->randomMachineName());
|
||||
$field_storage = FieldStorageConfig::create([
|
||||
'field_name' => $field_name,
|
||||
'entity_type' => 'node',
|
||||
'type' => 'datetime',
|
||||
'settings' => [
|
||||
'datetime_type' => 'date',
|
||||
],
|
||||
]);
|
||||
$field_storage->save();
|
||||
$field = FieldConfig::create([
|
||||
'field_storage' => $field_storage,
|
||||
'field_name' => $field_name,
|
||||
'bundle' => 'date_content',
|
||||
]);
|
||||
$field->save();
|
||||
|
||||
entity_get_form_display('node', 'date_content', 'default')
|
||||
->setComponent($field_name, [
|
||||
'type' => 'datetime_default',
|
||||
])
|
||||
->save();
|
||||
$edit = [
|
||||
'title[0][value]' => $this->randomString(),
|
||||
'body[0][value]' => $this->randomString(),
|
||||
$field_name . '[0][value][date]' => '2016-04-01',
|
||||
];
|
||||
$this->drupalPostForm('node/add/date_content', $edit, t('Save'));
|
||||
$this->drupalGet('admin/structure/types/manage/date_content/fields/node.date_content.' . $field_name . '/storage');
|
||||
$result = $this->xpath("//*[@id='edit-settings-datetime-type' and contains(@disabled, 'disabled')]");
|
||||
$this->assertEqual(count($result), 1, "Changing datetime setting is disabled.");
|
||||
$this->assertText('There is data for this field in the database. The field settings can no longer be changed.');
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,203 @@
|
|||
<?php
|
||||
|
||||
namespace Drupal\datetime\Tests\Views;
|
||||
|
||||
use Drupal\views\Views;
|
||||
|
||||
/**
|
||||
* Tests the Drupal\datetime\Plugin\views\filter\Date handler.
|
||||
*
|
||||
* @group datetime
|
||||
*/
|
||||
class ArgumentDateTimeTest extends DateTimeHandlerTestBase {
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public static $testViews = ['test_argument_datetime'];
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
protected function setUp() {
|
||||
parent::setUp();
|
||||
|
||||
// Add some basic test nodes.
|
||||
$dates = [
|
||||
'2000-10-10',
|
||||
'2001-10-10',
|
||||
'2002-01-01',
|
||||
];
|
||||
foreach ($dates as $date) {
|
||||
$this->nodes[] = $this->drupalCreateNode([
|
||||
'field_date' => [
|
||||
'value' => $date,
|
||||
]
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Test year argument.
|
||||
*
|
||||
* @see \Drupal\datetime\Plugin\views\argument\YearDate
|
||||
*/
|
||||
public function testDatetimeArgumentYear() {
|
||||
$view = Views::getView('test_argument_datetime');
|
||||
|
||||
// The 'default' display has the 'year' argument.
|
||||
$view->setDisplay('default');
|
||||
$this->executeView($view, ['2000']);
|
||||
$expected = [];
|
||||
$expected[] = ['nid' => $this->nodes[0]->id()];
|
||||
$this->assertIdenticalResultset($view, $expected, $this->map);
|
||||
$view->destroy();
|
||||
|
||||
$view->setDisplay('default');
|
||||
$this->executeView($view, ['2002']);
|
||||
$expected = [];
|
||||
$expected[] = ['nid' => $this->nodes[2]->id()];
|
||||
$this->assertIdenticalResultset($view, $expected, $this->map);
|
||||
$view->destroy();
|
||||
}
|
||||
|
||||
/**
|
||||
* Test month argument.
|
||||
*
|
||||
* @see \Drupal\datetime\Plugin\views\argument\MonthDate
|
||||
*/
|
||||
public function testDatetimeArgumentMonth() {
|
||||
$view = Views::getView('test_argument_datetime');
|
||||
// The 'embed_1' display has the 'month' argument.
|
||||
$view->setDisplay('embed_1');
|
||||
|
||||
$this->executeView($view, ['10']);
|
||||
$expected = [];
|
||||
$expected[] = ['nid' => $this->nodes[0]->id()];
|
||||
$expected[] = ['nid' => $this->nodes[1]->id()];
|
||||
$this->assertIdenticalResultset($view, $expected, $this->map);
|
||||
$view->destroy();
|
||||
|
||||
$view->setDisplay('embed_1');
|
||||
$this->executeView($view, ['01']);
|
||||
$expected = [];
|
||||
$expected[] = ['nid' => $this->nodes[2]->id()];
|
||||
$this->assertIdenticalResultset($view, $expected, $this->map);
|
||||
$view->destroy();
|
||||
}
|
||||
|
||||
/**
|
||||
* Test day argument.
|
||||
*
|
||||
* @see \Drupal\datetime\Plugin\views\argument\DayDate
|
||||
*/
|
||||
public function testDatetimeArgumentDay() {
|
||||
$view = Views::getView('test_argument_datetime');
|
||||
|
||||
// The 'embed_2' display has the 'day' argument.
|
||||
$view->setDisplay('embed_2');
|
||||
$this->executeView($view, ['10']);
|
||||
$expected = [];
|
||||
$expected[] = ['nid' => $this->nodes[0]->id()];
|
||||
$expected[] = ['nid' => $this->nodes[1]->id()];
|
||||
$this->assertIdenticalResultset($view, $expected, $this->map);
|
||||
$view->destroy();
|
||||
|
||||
$view->setDisplay('embed_2');
|
||||
$this->executeView($view, ['01']);
|
||||
$expected = [];
|
||||
$expected[] = ['nid' => $this->nodes[2]->id()];
|
||||
$this->assertIdenticalResultset($view, $expected, $this->map);
|
||||
$view->destroy();
|
||||
}
|
||||
|
||||
/**
|
||||
* Test year, month, and day arguments combined.
|
||||
*/
|
||||
public function testDatetimeArgumentAll() {
|
||||
$view = Views::getView('test_argument_datetime');
|
||||
// The 'embed_3' display has year, month, and day arguments.
|
||||
$view->setDisplay('embed_3');
|
||||
|
||||
$this->executeView($view, ['2000', '10', '10']);
|
||||
$expected = [];
|
||||
$expected[] = ['nid' => $this->nodes[0]->id()];
|
||||
$this->assertIdenticalResultset($view, $expected, $this->map);
|
||||
$view->destroy();
|
||||
|
||||
$view->setDisplay('embed_3');
|
||||
$this->executeView($view, ['2002', '01', '01']);
|
||||
$expected = [];
|
||||
$expected[] = ['nid' => $this->nodes[2]->id()];
|
||||
$this->assertIdenticalResultset($view, $expected, $this->map);
|
||||
$view->destroy();
|
||||
}
|
||||
|
||||
/**
|
||||
* Test week WW argument.
|
||||
*/
|
||||
public function testDatetimeArgumentWeek() {
|
||||
$view = Views::getView('test_argument_datetime');
|
||||
// The 'embed_4' display has WW argument.
|
||||
$view->setDisplay('embed_4');
|
||||
|
||||
$this->executeView($view, ['41']);
|
||||
$expected = [];
|
||||
$expected[] = ['nid' => $this->nodes[0]->id()];
|
||||
$expected[] = ['nid' => $this->nodes[1]->id()];
|
||||
$this->assertIdenticalResultset($view, $expected, $this->map);
|
||||
$view->destroy();
|
||||
|
||||
$view->setDisplay('embed_4');
|
||||
$this->executeView($view, ['01']);
|
||||
$expected = [];
|
||||
$expected[] = ['nid' => $this->nodes[2]->id()];
|
||||
$this->assertIdenticalResultset($view, $expected, $this->map);
|
||||
$view->destroy();
|
||||
}
|
||||
|
||||
/**
|
||||
* Test full_date CCYYMMDD argument.
|
||||
*/
|
||||
public function testDatetimeArgumentFullDate() {
|
||||
$view = Views::getView('test_argument_datetime');
|
||||
// The 'embed_5' display has CCYYMMDD argument.
|
||||
$view->setDisplay('embed_5');
|
||||
|
||||
$this->executeView($view, ['20001010']);
|
||||
$expected = [];
|
||||
$expected[] = ['nid' => $this->nodes[0]->id()];
|
||||
$this->assertIdenticalResultset($view, $expected, $this->map);
|
||||
$view->destroy();
|
||||
|
||||
$view->setDisplay('embed_5');
|
||||
$this->executeView($view, ['20020101']);
|
||||
$expected = [];
|
||||
$expected[] = ['nid' => $this->nodes[2]->id()];
|
||||
$this->assertIdenticalResultset($view, $expected, $this->map);
|
||||
$view->destroy();
|
||||
}
|
||||
|
||||
/**
|
||||
* Test year_month CCYYMM argument.
|
||||
*/
|
||||
public function testDatetimeArgumentYearMonth() {
|
||||
$view = Views::getView('test_argument_datetime');
|
||||
// The 'embed_6' display has CCYYMM argument.
|
||||
$view->setDisplay('embed_6');
|
||||
|
||||
$this->executeView($view, ['200010']);
|
||||
$expected = [];
|
||||
$expected[] = ['nid' => $this->nodes[0]->id()];
|
||||
$this->assertIdenticalResultset($view, $expected, $this->map);
|
||||
$view->destroy();
|
||||
|
||||
$view->setDisplay('embed_6');
|
||||
$this->executeView($view, ['200201']);
|
||||
$expected = [];
|
||||
$expected[] = ['nid' => $this->nodes[2]->id()];
|
||||
$this->assertIdenticalResultset($view, $expected, $this->map);
|
||||
$view->destroy();
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,76 @@
|
|||
<?php
|
||||
|
||||
namespace Drupal\datetime\Tests\Views;
|
||||
|
||||
use Drupal\datetime\Plugin\Field\FieldType\DateTimeItem;
|
||||
use Drupal\field\Entity\FieldConfig;
|
||||
use Drupal\node\Entity\NodeType;
|
||||
use Drupal\views\Tests\Handler\HandlerTestBase;
|
||||
use Drupal\views\Tests\ViewTestData;
|
||||
use Drupal\field\Entity\FieldStorageConfig;
|
||||
|
||||
/**
|
||||
* Base class for testing datetime handlers.
|
||||
*/
|
||||
abstract class DateTimeHandlerTestBase extends HandlerTestBase {
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public static $modules = ['datetime_test', 'node', 'datetime'];
|
||||
|
||||
/**
|
||||
* Name of the field.
|
||||
*
|
||||
* Note, this is used in the default test view.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected static $field_name = 'field_date';
|
||||
|
||||
/**
|
||||
* Nodes to test.
|
||||
*
|
||||
* @var \Drupal\node\NodeInterface[]
|
||||
*/
|
||||
protected $nodes = [];
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
protected function setUp() {
|
||||
parent::setUp();
|
||||
|
||||
// Add a date field to page nodes.
|
||||
$node_type = NodeType::create([
|
||||
'type' => 'page',
|
||||
'name' => 'page'
|
||||
]);
|
||||
$node_type->save();
|
||||
$fieldStorage = FieldStorageConfig::create([
|
||||
'field_name' => static::$field_name,
|
||||
'entity_type' => 'node',
|
||||
'type' => 'datetime',
|
||||
'settings' => ['datetime_type' => DateTimeItem::DATETIME_TYPE_DATETIME],
|
||||
]);
|
||||
$fieldStorage->save();
|
||||
$field = FieldConfig::create([
|
||||
'field_storage' => $fieldStorage,
|
||||
'bundle' => 'page',
|
||||
'required' => TRUE,
|
||||
]);
|
||||
$field->save();
|
||||
|
||||
// Views needs to be aware of the new field.
|
||||
$this->container->get('views.views_data')->clear();
|
||||
|
||||
// Set column map.
|
||||
$this->map = [
|
||||
'nid' => 'nid',
|
||||
];
|
||||
|
||||
// Load test views.
|
||||
ViewTestData::createTestViews(get_class($this), ['datetime_test']);
|
||||
}
|
||||
|
||||
}
|
110
web/core/modules/datetime/src/Tests/Views/FilterDateTest.php
Normal file
110
web/core/modules/datetime/src/Tests/Views/FilterDateTest.php
Normal file
|
@ -0,0 +1,110 @@
|
|||
<?php
|
||||
|
||||
namespace Drupal\datetime\Tests\Views;
|
||||
use Drupal\datetime\Plugin\Field\FieldType\DateTimeItem;
|
||||
use Drupal\field\Entity\FieldStorageConfig;
|
||||
use Drupal\views\Views;
|
||||
|
||||
/**
|
||||
* Tests date-only fields.
|
||||
*
|
||||
* @group datetime
|
||||
*/
|
||||
class FilterDateTest extends DateTimeHandlerTestBase {
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public static $testViews = ['test_filter_datetime'];
|
||||
|
||||
/**
|
||||
* For offset tests, set to the current time.
|
||||
*/
|
||||
protected static $date;
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*
|
||||
* Create nodes with relative dates of yesterday, today, and tomorrow.
|
||||
*/
|
||||
protected function setUp() {
|
||||
parent::setUp();
|
||||
|
||||
// Set to 'today'.
|
||||
static::$date = REQUEST_TIME;
|
||||
|
||||
// Change field storage to date-only.
|
||||
$storage = FieldStorageConfig::load('node.' . static::$field_name);
|
||||
$storage->setSetting('datetime_type', DateTimeItem::DATETIME_TYPE_DATE);
|
||||
$storage->save();
|
||||
|
||||
$dates = [
|
||||
// Tomorrow.
|
||||
\Drupal::service('date.formatter')->format(static::$date + 86400, 'custom', DATETIME_DATE_STORAGE_FORMAT, DATETIME_STORAGE_TIMEZONE),
|
||||
// Today.
|
||||
\Drupal::service('date.formatter')->format(static::$date, 'custom', DATETIME_DATE_STORAGE_FORMAT, DATETIME_STORAGE_TIMEZONE),
|
||||
// Yesterday.
|
||||
\Drupal::service('date.formatter')->format(static::$date - 86400, 'custom', DATETIME_DATE_STORAGE_FORMAT, DATETIME_STORAGE_TIMEZONE),
|
||||
];
|
||||
|
||||
foreach ($dates as $date) {
|
||||
$this->nodes[] = $this->drupalCreateNode([
|
||||
'field_date' => [
|
||||
'value' => $date,
|
||||
]
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Test offsets with date-only fields.
|
||||
*/
|
||||
public function testDateOffsets() {
|
||||
$view = Views::getView('test_filter_datetime');
|
||||
$field = static::$field_name . '_value';
|
||||
|
||||
// Test simple operations.
|
||||
$view->initHandlers();
|
||||
|
||||
// A greater than or equal to 'now', should return the 'today' and
|
||||
// the 'tomorrow' node.
|
||||
$view->filter[$field]->operator = '>=';
|
||||
$view->filter[$field]->value['type'] = 'offset';
|
||||
$view->filter[$field]->value['value'] = 'now';
|
||||
$view->setDisplay('default');
|
||||
$this->executeView($view);
|
||||
$expected_result = [
|
||||
['nid' => $this->nodes[0]->id()],
|
||||
['nid' => $this->nodes[1]->id()],
|
||||
];
|
||||
$this->assertIdenticalResultset($view, $expected_result, $this->map);
|
||||
$view->destroy();
|
||||
|
||||
// Only dates in the past.
|
||||
$view->initHandlers();
|
||||
$view->filter[$field]->operator = '<';
|
||||
$view->filter[$field]->value['type'] = 'offset';
|
||||
$view->filter[$field]->value['value'] = 'now';
|
||||
$view->setDisplay('default');
|
||||
$this->executeView($view);
|
||||
$expected_result = [
|
||||
['nid' => $this->nodes[2]->id()],
|
||||
];
|
||||
$this->assertIdenticalResultset($view, $expected_result, $this->map);
|
||||
$view->destroy();
|
||||
|
||||
// Test offset for between operator. Only the 'tomorrow' node should appear.
|
||||
$view->initHandlers();
|
||||
$view->filter[$field]->operator = 'between';
|
||||
$view->filter[$field]->value['type'] = 'offset';
|
||||
$view->filter[$field]->value['max'] = '+2 days';
|
||||
$view->filter[$field]->value['min'] = '+1 day';
|
||||
$view->setDisplay('default');
|
||||
$this->executeView($view);
|
||||
$expected_result = [
|
||||
['nid' => $this->nodes[0]->id()],
|
||||
];
|
||||
$this->assertIdenticalResultset($view, $expected_result, $this->map);
|
||||
}
|
||||
|
||||
}
|
190
web/core/modules/datetime/src/Tests/Views/FilterDateTimeTest.php
Normal file
190
web/core/modules/datetime/src/Tests/Views/FilterDateTimeTest.php
Normal file
|
@ -0,0 +1,190 @@
|
|||
<?php
|
||||
|
||||
namespace Drupal\datetime\Tests\Views;
|
||||
|
||||
use Drupal\views\Views;
|
||||
|
||||
/**
|
||||
* Tests the Drupal\datetime\Plugin\views\filter\Date handler.
|
||||
*
|
||||
* @group datetime
|
||||
*/
|
||||
class FilterDateTimeTest extends DateTimeHandlerTestBase {
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public static $testViews = ['test_filter_datetime'];
|
||||
|
||||
/**
|
||||
* For offset tests, set a date 1 day in the future.
|
||||
*/
|
||||
protected static $date;
|
||||
|
||||
/**
|
||||
* Use a non-UTC timezone.
|
||||
*/
|
||||
protected static $timezone = 'America/Vancouver';
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
protected function setUp() {
|
||||
parent::setUp();
|
||||
|
||||
static::$date = REQUEST_TIME + 86400;
|
||||
|
||||
// Set the timezone.
|
||||
date_default_timezone_set(static::$timezone);
|
||||
|
||||
// Add some basic test nodes.
|
||||
$dates = [
|
||||
'2000-10-10T00:01:30',
|
||||
'2001-10-10T12:12:12',
|
||||
'2002-10-10T14:14:14',
|
||||
// The date storage timezone is used (this mimics the steps taken in the
|
||||
// widget: \Drupal\datetime\Plugin\Field\FieldWidget::messageFormValues().
|
||||
\Drupal::service('date.formatter')->format(static::$date, 'custom', DATETIME_DATETIME_STORAGE_FORMAT, DATETIME_STORAGE_TIMEZONE),
|
||||
];
|
||||
foreach ($dates as $date) {
|
||||
$this->nodes[] = $this->drupalCreateNode([
|
||||
'field_date' => [
|
||||
'value' => $date,
|
||||
]
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Test filter operations.
|
||||
*/
|
||||
public function testDatetimeFilter() {
|
||||
$this->_testOffset();
|
||||
$this->_testBetween();
|
||||
$this->_testExact();
|
||||
}
|
||||
|
||||
/**
|
||||
* Test offset operations.
|
||||
*/
|
||||
protected function _testOffset() {
|
||||
$view = Views::getView('test_filter_datetime');
|
||||
$field = static::$field_name . '_value';
|
||||
|
||||
// Test simple operations.
|
||||
$view->initHandlers();
|
||||
|
||||
$view->filter[$field]->operator = '>';
|
||||
$view->filter[$field]->value['type'] = 'offset';
|
||||
$view->filter[$field]->value['value'] = '+1 hour';
|
||||
$view->setDisplay('default');
|
||||
$this->executeView($view);
|
||||
$expected_result = [
|
||||
['nid' => $this->nodes[3]->id()],
|
||||
];
|
||||
$this->assertIdenticalResultset($view, $expected_result, $this->map);
|
||||
$view->destroy();
|
||||
|
||||
// Test offset for between operator.
|
||||
$view->initHandlers();
|
||||
$view->filter[$field]->operator = 'between';
|
||||
$view->filter[$field]->value['type'] = 'offset';
|
||||
$view->filter[$field]->value['max'] = '+2 days';
|
||||
$view->filter[$field]->value['min'] = '+1 hour';
|
||||
$view->setDisplay('default');
|
||||
$this->executeView($view);
|
||||
$expected_result = [
|
||||
['nid' => $this->nodes[3]->id()],
|
||||
];
|
||||
$this->assertIdenticalResultset($view, $expected_result, $this->map);
|
||||
}
|
||||
|
||||
/**
|
||||
* Test between operations.
|
||||
*/
|
||||
protected function _testBetween() {
|
||||
$view = Views::getView('test_filter_datetime');
|
||||
$field = static::$field_name . '_value';
|
||||
|
||||
// Test between with min and max.
|
||||
$view->initHandlers();
|
||||
$view->filter[$field]->operator = 'between';
|
||||
$view->filter[$field]->value['min'] = '2001-01-01';
|
||||
$view->filter[$field]->value['max'] = '2002-01-01';
|
||||
$view->setDisplay('default');
|
||||
$this->executeView($view);
|
||||
$expected_result = [
|
||||
['nid' => $this->nodes[1]->id()],
|
||||
];
|
||||
$this->assertIdenticalResultset($view, $expected_result, $this->map);
|
||||
$view->destroy();
|
||||
|
||||
// Test between with just max.
|
||||
$view->initHandlers();
|
||||
$view->filter[$field]->operator = 'between';
|
||||
$view->filter[$field]->value['max'] = '2002-01-01';
|
||||
$view->setDisplay('default');
|
||||
$this->executeView($view);
|
||||
$expected_result = [
|
||||
['nid' => $this->nodes[0]->id()],
|
||||
['nid' => $this->nodes[1]->id()],
|
||||
];
|
||||
$this->assertIdenticalResultset($view, $expected_result, $this->map);
|
||||
$view->destroy();
|
||||
|
||||
// Test not between with min and max.
|
||||
$view->initHandlers();
|
||||
$view->filter[$field]->operator = 'not between';
|
||||
$view->filter[$field]->value['min'] = '2001-01-01';
|
||||
// Set maximum date to date of node 1 to test range borders.
|
||||
$view->filter[$field]->value['max'] = '2001-10-10T12:12:12';
|
||||
$view->setDisplay('default');
|
||||
$this->executeView($view);
|
||||
$expected_result = [
|
||||
['nid' => $this->nodes[0]->id()],
|
||||
['nid' => $this->nodes[2]->id()],
|
||||
['nid' => $this->nodes[3]->id()],
|
||||
];
|
||||
$this->assertIdenticalResultset($view, $expected_result, $this->map);
|
||||
$view->destroy();
|
||||
|
||||
// Test not between with just max.
|
||||
$view->initHandlers();
|
||||
$view->filter[$field]->operator = 'not between';
|
||||
$view->filter[$field]->value['max'] = '2001-01-01';
|
||||
$view->setDisplay('default');
|
||||
$this->executeView($view);
|
||||
$expected_result = [
|
||||
['nid' => $this->nodes[1]->id()],
|
||||
['nid' => $this->nodes[2]->id()],
|
||||
['nid' => $this->nodes[3]->id()],
|
||||
];
|
||||
$this->assertIdenticalResultset($view, $expected_result, $this->map);
|
||||
}
|
||||
|
||||
/**
|
||||
* Test exact date matching.
|
||||
*/
|
||||
protected function _testExact() {
|
||||
$view = Views::getView('test_filter_datetime');
|
||||
$field = static::$field_name . '_value';
|
||||
|
||||
// Test between with min and max.
|
||||
$view->initHandlers();
|
||||
$view->filter[$field]->operator = '=';
|
||||
$view->filter[$field]->value['min'] = '';
|
||||
$view->filter[$field]->value['max'] = '';
|
||||
// Use the date from node 3. Use the site timezone (mimics a value entered
|
||||
// through the UI).
|
||||
$view->filter[$field]->value['value'] = \Drupal::service('date.formatter')->format(static::$date, 'custom', DATETIME_DATETIME_STORAGE_FORMAT, static::$timezone);
|
||||
$view->setDisplay('default');
|
||||
$this->executeView($view);
|
||||
$expected_result = [
|
||||
['nid' => $this->nodes[3]->id()],
|
||||
];
|
||||
$this->assertIdenticalResultset($view, $expected_result, $this->map);
|
||||
$view->destroy();
|
||||
|
||||
}
|
||||
|
||||
}
|
125
web/core/modules/datetime/src/Tests/Views/SortDateTimeTest.php
Normal file
125
web/core/modules/datetime/src/Tests/Views/SortDateTimeTest.php
Normal file
|
@ -0,0 +1,125 @@
|
|||
<?php
|
||||
|
||||
namespace Drupal\datetime\Tests\Views;
|
||||
|
||||
use Drupal\views\Views;
|
||||
|
||||
/**
|
||||
* Tests for core Drupal\datetime\Plugin\views\sort\Date handler.
|
||||
*
|
||||
* @group datetime
|
||||
*/
|
||||
class SortDateTimeTest extends DateTimeHandlerTestBase {
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public static $testViews = ['test_sort_datetime'];
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
protected function setUp() {
|
||||
parent::setUp();
|
||||
|
||||
// Add some basic test nodes.
|
||||
$dates = [
|
||||
'2014-10-10T00:03:00',
|
||||
'2000-10-10T00:01:00',
|
||||
'2000-10-10T00:02:00',
|
||||
'2000-10-10T00:03:00',
|
||||
'2000-10-10T00:03:02',
|
||||
'2000-10-10T00:03:01',
|
||||
'2000-10-10T00:03:03',
|
||||
];
|
||||
foreach ($dates as $date) {
|
||||
$this->nodes[] = $this->drupalCreateNode([
|
||||
'field_date' => [
|
||||
'value' => $date,
|
||||
]
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Tests the datetime sort handler.
|
||||
*/
|
||||
public function testDateTimeSort() {
|
||||
$field = static::$field_name . '_value';
|
||||
$view = Views::getView('test_sort_datetime');
|
||||
|
||||
// Set granularity to 'minute', and the secondary node ID order should
|
||||
// define the order of nodes with the same minute.
|
||||
$view->initHandlers();
|
||||
$view->sort[$field]->options['granularity'] = 'minute';
|
||||
$view->setDisplay('default');
|
||||
$this->executeView($view);
|
||||
$expected_result = [
|
||||
['nid' => $this->nodes[0]->id()],
|
||||
['nid' => $this->nodes[3]->id()],
|
||||
['nid' => $this->nodes[4]->id()],
|
||||
['nid' => $this->nodes[5]->id()],
|
||||
['nid' => $this->nodes[6]->id()],
|
||||
['nid' => $this->nodes[2]->id()],
|
||||
['nid' => $this->nodes[1]->id()],
|
||||
];
|
||||
$this->assertIdenticalResultset($view, $expected_result, $this->map);
|
||||
$view->destroy();
|
||||
|
||||
// Check ASC.
|
||||
$view->initHandlers();
|
||||
$field = static::$field_name . '_value';
|
||||
$view->sort[$field]->options['order'] = 'ASC';
|
||||
$view->setDisplay('default');
|
||||
$this->executeView($view);
|
||||
$expected_result = [
|
||||
['nid' => $this->nodes[1]->id()],
|
||||
['nid' => $this->nodes[2]->id()],
|
||||
['nid' => $this->nodes[3]->id()],
|
||||
['nid' => $this->nodes[5]->id()],
|
||||
['nid' => $this->nodes[4]->id()],
|
||||
['nid' => $this->nodes[6]->id()],
|
||||
['nid' => $this->nodes[0]->id()],
|
||||
];
|
||||
$this->assertIdenticalResultset($view, $expected_result, $this->map);
|
||||
$view->destroy();
|
||||
|
||||
// Change granularity to 'year', and the secondary node ID order should
|
||||
// define the order of nodes with the same year.
|
||||
$view->initHandlers();
|
||||
$view->sort[$field]->options['granularity'] = 'year';
|
||||
$view->sort[$field]->options['order'] = 'DESC';
|
||||
$view->setDisplay('default');
|
||||
$this->executeView($view);
|
||||
$expected_result = [
|
||||
['nid' => $this->nodes[0]->id()],
|
||||
['nid' => $this->nodes[1]->id()],
|
||||
['nid' => $this->nodes[2]->id()],
|
||||
['nid' => $this->nodes[3]->id()],
|
||||
['nid' => $this->nodes[4]->id()],
|
||||
['nid' => $this->nodes[5]->id()],
|
||||
['nid' => $this->nodes[6]->id()],
|
||||
];
|
||||
$this->assertIdenticalResultset($view, $expected_result, $this->map);
|
||||
$view->destroy();
|
||||
|
||||
// Change granularity to 'second'.
|
||||
$view->initHandlers();
|
||||
$view->sort[$field]->options['granularity'] = 'second';
|
||||
$view->sort[$field]->options['order'] = 'DESC';
|
||||
$view->setDisplay('default');
|
||||
$this->executeView($view);
|
||||
$expected_result = [
|
||||
['nid' => $this->nodes[0]->id()],
|
||||
['nid' => $this->nodes[6]->id()],
|
||||
['nid' => $this->nodes[4]->id()],
|
||||
['nid' => $this->nodes[5]->id()],
|
||||
['nid' => $this->nodes[3]->id()],
|
||||
['nid' => $this->nodes[2]->id()],
|
||||
['nid' => $this->nodes[1]->id()],
|
||||
];
|
||||
$this->assertIdenticalResultset($view, $expected_result, $this->map);
|
||||
$view->destroy();
|
||||
}
|
||||
|
||||
}
|
Reference in a new issue