3 namespace Drupal\Tests\datetime\Kernel\Views;
5 use Drupal\node\Entity\Node;
6 use Drupal\views\Views;
9 * Tests the Drupal\datetime\Plugin\views\filter\Date handler.
13 class FilterDateTimeTest extends DateTimeHandlerTestBase {
18 public static $testViews = ['test_filter_datetime'];
21 * For offset tests, set a date 1 day in the future.
23 protected static $date;
26 * Use a non-UTC timezone.
30 protected static $timezone = 'America/Vancouver';
35 protected function setUp($import_test_views = TRUE) {
36 parent::setUp($import_test_views);
38 static::$date = REQUEST_TIME + 86400;
41 date_default_timezone_set(static::$timezone);
43 // Add some basic test nodes.
45 '2000-10-10T00:01:30',
46 '2001-10-10T12:12:12',
47 '2002-10-10T14:14:14',
48 // The date storage timezone is used (this mimics the steps taken in the
49 // widget: \Drupal\datetime\Plugin\Field\FieldWidget::messageFormValues().
50 \Drupal::service('date.formatter')->format(static::$date, 'custom', DATETIME_DATETIME_STORAGE_FORMAT, DATETIME_STORAGE_TIMEZONE),
52 foreach ($dates as $date) {
53 $node = Node::create([
54 'title' => $this->randomMachineName(8),
61 $this->nodes[] = $node;
66 * Test filter operations.
68 public function testDatetimeFilter() {
70 $this->_testBetween();
75 * Test offset operations.
77 protected function _testOffset() {
78 $view = Views::getView('test_filter_datetime');
79 $field = static::$field_name . '_value';
81 // Test simple operations.
82 $view->initHandlers();
84 $view->filter[$field]->operator = '>';
85 $view->filter[$field]->value['type'] = 'offset';
86 $view->filter[$field]->value['value'] = '+1 hour';
87 $view->setDisplay('default');
88 $this->executeView($view);
90 ['nid' => $this->nodes[3]->id()],
92 $this->assertIdenticalResultset($view, $expected_result, $this->map);
95 // Test offset for between operator.
96 $view->initHandlers();
97 $view->filter[$field]->operator = 'between';
98 $view->filter[$field]->value['type'] = 'offset';
99 $view->filter[$field]->value['max'] = '+2 days';
100 $view->filter[$field]->value['min'] = '+1 hour';
101 $view->setDisplay('default');
102 $this->executeView($view);
104 ['nid' => $this->nodes[3]->id()],
106 $this->assertIdenticalResultset($view, $expected_result, $this->map);
110 * Test between operations.
112 protected function _testBetween() {
113 $view = Views::getView('test_filter_datetime');
114 $field = static::$field_name . '_value';
116 // Test between with min and max.
117 $view->initHandlers();
118 $view->filter[$field]->operator = 'between';
119 $view->filter[$field]->value['min'] = '2001-01-01';
120 $view->filter[$field]->value['max'] = '2002-01-01';
121 $view->setDisplay('default');
122 $this->executeView($view);
124 ['nid' => $this->nodes[1]->id()],
126 $this->assertIdenticalResultset($view, $expected_result, $this->map);
129 // Test between with just max.
130 $view->initHandlers();
131 $view->filter[$field]->operator = 'between';
132 $view->filter[$field]->value['max'] = '2002-01-01';
133 $view->setDisplay('default');
134 $this->executeView($view);
136 ['nid' => $this->nodes[0]->id()],
137 ['nid' => $this->nodes[1]->id()],
139 $this->assertIdenticalResultset($view, $expected_result, $this->map);
142 // Test not between with min and max.
143 $view->initHandlers();
144 $view->filter[$field]->operator = 'not between';
145 $view->filter[$field]->value['min'] = '2001-01-01';
146 // Set maximum date to date of node 1 to test range borders.
147 $view->filter[$field]->value['max'] = '2001-10-10T12:12:12';
148 $view->setDisplay('default');
149 $this->executeView($view);
151 ['nid' => $this->nodes[0]->id()],
152 ['nid' => $this->nodes[2]->id()],
153 ['nid' => $this->nodes[3]->id()],
155 $this->assertIdenticalResultset($view, $expected_result, $this->map);
158 // Test not between with just max.
159 $view->initHandlers();
160 $view->filter[$field]->operator = 'not between';
161 $view->filter[$field]->value['max'] = '2001-01-01';
162 $view->setDisplay('default');
163 $this->executeView($view);
165 ['nid' => $this->nodes[1]->id()],
166 ['nid' => $this->nodes[2]->id()],
167 ['nid' => $this->nodes[3]->id()],
169 $this->assertIdenticalResultset($view, $expected_result, $this->map);
173 * Test exact date matching.
175 protected function _testExact() {
176 $view = Views::getView('test_filter_datetime');
177 $field = static::$field_name . '_value';
179 // Test between with min and max.
180 $view->initHandlers();
181 $view->filter[$field]->operator = '=';
182 $view->filter[$field]->value['min'] = '';
183 $view->filter[$field]->value['max'] = '';
184 // Use the date from node 3. Use the site timezone (mimics a value entered
186 $view->filter[$field]->value['value'] = \Drupal::service('date.formatter')->format(static::$date, 'custom', DATETIME_DATETIME_STORAGE_FORMAT, static::$timezone);
187 $view->setDisplay('default');
188 $this->executeView($view);
190 ['nid' => $this->nodes[3]->id()],
192 $this->assertIdenticalResultset($view, $expected_result, $this->map);