7cb0fa040ab8c04651129e2c8e08a753febc84cf
[yaffs-website] / web / core / modules / datetime / tests / src / Kernel / Views / FilterDateTimeTest.php
1 <?php
2
3 namespace Drupal\Tests\datetime\Kernel\Views;
4
5 use Drupal\datetime\Plugin\Field\FieldType\DateTimeItemInterface;
6 use Drupal\node\Entity\Node;
7 use Drupal\views\Views;
8
9 /**
10  * Tests the Drupal\datetime\Plugin\views\filter\Date handler.
11  *
12  * @group datetime
13  */
14 class FilterDateTimeTest extends DateTimeHandlerTestBase {
15
16   /**
17    * {@inheritdoc}
18    */
19   public static $testViews = ['test_filter_datetime'];
20
21   /**
22    * For offset tests, set a date 1 day in the future.
23    */
24   protected static $date;
25
26   /**
27    * Use a non-UTC timezone.
28    *
29    * @var string
30    */
31   protected static $timezone = 'America/Vancouver';
32
33   /**
34    * {@inheritdoc}
35    */
36   protected function setUp($import_test_views = TRUE) {
37     parent::setUp($import_test_views);
38
39     static::$date = REQUEST_TIME + 86400;
40
41     // Set the timezone.
42     date_default_timezone_set(static::$timezone);
43     $this->config('system.date')
44       ->set('timezone.default', static::$timezone)
45       ->save();
46
47     // Add some basic test nodes.
48     $dates = [
49       '2000-10-10T00:01:30',
50       '2001-10-10T12:12:12',
51       '2002-10-10T14:14:14',
52       // The date storage timezone is used (this mimics the steps taken in the
53       // widget: \Drupal\datetime\Plugin\Field\FieldWidget::messageFormValues().
54       \Drupal::service('date.formatter')->format(static::$date, 'custom', DateTimeItemInterface::DATETIME_STORAGE_FORMAT, DateTimeItemInterface::STORAGE_TIMEZONE),
55     ];
56     foreach ($dates as $date) {
57       $node = Node::create([
58         'title' => $this->randomMachineName(8),
59         'type' => 'page',
60         'field_date' => [
61           'value' => $date,
62         ]
63       ]);
64       $node->save();
65       $this->nodes[] = $node;
66     }
67   }
68
69   /**
70    * Test filter operations.
71    */
72   public function testDatetimeFilter() {
73     $this->_testOffset();
74     $this->_testBetween();
75     $this->_testExact();
76   }
77
78   /**
79    * Test offset operations.
80    */
81   protected function _testOffset() {
82     $view = Views::getView('test_filter_datetime');
83     $field = static::$field_name . '_value';
84
85     // Test simple operations.
86     $view->initHandlers();
87
88     $view->filter[$field]->operator = '>';
89     $view->filter[$field]->value['type'] = 'offset';
90     $view->filter[$field]->value['value'] = '+1 hour';
91     $view->setDisplay('default');
92     $this->executeView($view);
93     $expected_result = [
94       ['nid' => $this->nodes[3]->id()],
95     ];
96     $this->assertIdenticalResultset($view, $expected_result, $this->map);
97     $view->destroy();
98
99     // Test offset for between operator.
100     $view->initHandlers();
101     $view->filter[$field]->operator = 'between';
102     $view->filter[$field]->value['type'] = 'offset';
103     $view->filter[$field]->value['max'] = '+2 days';
104     $view->filter[$field]->value['min'] = '+1 hour';
105     $view->setDisplay('default');
106     $this->executeView($view);
107     $expected_result = [
108       ['nid' => $this->nodes[3]->id()],
109     ];
110     $this->assertIdenticalResultset($view, $expected_result, $this->map);
111   }
112
113   /**
114    * Test between operations.
115    */
116   protected function _testBetween() {
117     $view = Views::getView('test_filter_datetime');
118     $field = static::$field_name . '_value';
119
120     // Test between with min and max.
121     $view->initHandlers();
122     $view->filter[$field]->operator = 'between';
123     $view->filter[$field]->value['min'] = '2001-01-01';
124     $view->filter[$field]->value['max'] = '2002-01-01';
125     $view->setDisplay('default');
126     $this->executeView($view);
127     $expected_result = [
128       ['nid' => $this->nodes[1]->id()],
129     ];
130     $this->assertIdenticalResultset($view, $expected_result, $this->map);
131     $view->destroy();
132
133     // Test between with just max.
134     $view->initHandlers();
135     $view->filter[$field]->operator = 'between';
136     $view->filter[$field]->value['max'] = '2002-01-01';
137     $view->setDisplay('default');
138     $this->executeView($view);
139     $expected_result = [
140       ['nid' => $this->nodes[0]->id()],
141       ['nid' => $this->nodes[1]->id()],
142     ];
143     $this->assertIdenticalResultset($view, $expected_result, $this->map);
144     $view->destroy();
145
146     // Test not between with min and max.
147     $view->initHandlers();
148     $view->filter[$field]->operator = 'not between';
149     $view->filter[$field]->value['min'] = '2001-01-01';
150     // Set maximum date to date of node 1 to test range borders.
151     $view->filter[$field]->value['max'] = '2001-10-10T12:12:12';
152     $view->setDisplay('default');
153     $this->executeView($view);
154     $expected_result = [
155       ['nid' => $this->nodes[0]->id()],
156       ['nid' => $this->nodes[2]->id()],
157       ['nid' => $this->nodes[3]->id()],
158     ];
159     $this->assertIdenticalResultset($view, $expected_result, $this->map);
160     $view->destroy();
161
162     // Test not between with just max.
163     $view->initHandlers();
164     $view->filter[$field]->operator = 'not between';
165     $view->filter[$field]->value['max'] = '2001-01-01';
166     $view->setDisplay('default');
167     $this->executeView($view);
168     $expected_result = [
169       ['nid' => $this->nodes[1]->id()],
170       ['nid' => $this->nodes[2]->id()],
171       ['nid' => $this->nodes[3]->id()],
172     ];
173     $this->assertIdenticalResultset($view, $expected_result, $this->map);
174   }
175
176   /**
177    * Test exact date matching.
178    */
179   protected function _testExact() {
180     $view = Views::getView('test_filter_datetime');
181     $field = static::$field_name . '_value';
182
183     // Test between with min and max.
184     $view->initHandlers();
185     $view->filter[$field]->operator = '=';
186     $view->filter[$field]->value['min'] = '';
187     $view->filter[$field]->value['max'] = '';
188     // Use the date from node 3. Use the site timezone (mimics a value entered
189     // through the UI).
190     $view->filter[$field]->value['value'] = \Drupal::service('date.formatter')->format(static::$date, 'custom', DateTimeItemInterface::DATETIME_STORAGE_FORMAT, static::$timezone);
191     $view->setDisplay('default');
192     $this->executeView($view);
193     $expected_result = [
194       ['nid' => $this->nodes[3]->id()],
195     ];
196     $this->assertIdenticalResultset($view, $expected_result, $this->map);
197     $view->destroy();
198
199   }
200
201 }