From 428f586ab2fbabbb13adab13e15b220c8ccaef4a Mon Sep 17 00:00:00 2001
From: Lee Rowlands <lee.rowlands@previousnext.com.au>
Date: Sat, 19 Mar 2022 06:42:45 +1000
Subject: [PATCH] Issue #2636086 by Matroskeen, jian he, Sweetchuck, dawehner,
 Lendude: Add extra test coverage for operators of views date filters

---
 .../src/Functional/Views/FilterDateTest.php   | 74 +++++++++++++++----
 1 file changed, 60 insertions(+), 14 deletions(-)

diff --git a/core/modules/datetime/tests/src/Functional/Views/FilterDateTest.php b/core/modules/datetime/tests/src/Functional/Views/FilterDateTest.php
index d1d4712f28b5..74f825c25ab3 100644
--- a/core/modules/datetime/tests/src/Functional/Views/FilterDateTest.php
+++ b/core/modules/datetime/tests/src/Functional/Views/FilterDateTest.php
@@ -7,7 +7,7 @@
 use Drupal\datetime\Plugin\Field\FieldType\DateTimeItemInterface;
 use Drupal\field\Entity\FieldStorageConfig;
 use Drupal\field\Entity\FieldConfig;
-use Drupal\Tests\BrowserTestBase;
+use Drupal\Tests\views\Functional\ViewTestBase;
 use Drupal\views\Tests\ViewTestData;
 
 /**
@@ -15,7 +15,7 @@
  *
  * @group datetime
  */
-class FilterDateTest extends BrowserTestBase {
+class FilterDateTest extends ViewTestBase {
 
   /**
    * Name of the field.
@@ -38,6 +38,13 @@ class FilterDateTest extends BrowserTestBase {
    */
   protected $nodes = [];
 
+  /**
+   * Dates of test nodes in date storage format.
+   *
+   * @var string[]
+   */
+  protected $dates;
+
   /**
    * {@inheritdoc}
    */
@@ -45,7 +52,6 @@ class FilterDateTest extends BrowserTestBase {
     'datetime',
     'datetime_test',
     'node',
-    'views',
     'views_ui',
   ];
 
@@ -59,8 +65,8 @@ class FilterDateTest extends BrowserTestBase {
    *
    * Create nodes with relative dates of yesterday, today, and tomorrow.
    */
-  protected function setUp(): void {
-    parent::setUp();
+  protected function setUp($import_test_views = TRUE): void {
+    parent::setUp($import_test_views);
 
     $now = \Drupal::time()->getRequestTime();
 
@@ -85,17 +91,17 @@ protected function setUp(): void {
     $field->save();
 
     // Create some nodes.
-    $dates = [
+    $this->dates = [
       // Tomorrow.
-      DrupalDateTime::createFromTimestamp($now + 86400, DateTimeItemInterface::STORAGE_TIMEZONE)->format(DateTimeItemInterface::DATE_STORAGE_FORMAT),
+      DrupalDateTime::createFromTimestamp($now + 86400, DateTimeItemInterface::STORAGE_TIMEZONE)->format(DateTimeItemInterface::DATETIME_STORAGE_FORMAT),
       // Today.
-      DrupalDateTime::createFromTimestamp($now, DateTimeItemInterface::STORAGE_TIMEZONE)->format(DateTimeItemInterface::DATE_STORAGE_FORMAT),
+      DrupalDateTime::createFromTimestamp($now, DateTimeItemInterface::STORAGE_TIMEZONE)->format(DateTimeItemInterface::DATETIME_STORAGE_FORMAT),
       // Yesterday.
-      DrupalDateTime::createFromTimestamp($now - 86400, DateTimeItemInterface::STORAGE_TIMEZONE)->format(DateTimeItemInterface::DATE_STORAGE_FORMAT),
+      DrupalDateTime::createFromTimestamp($now - 86400, DateTimeItemInterface::STORAGE_TIMEZONE)->format(DateTimeItemInterface::DATETIME_STORAGE_FORMAT),
     ];
 
     $this->nodes = [];
-    foreach ($dates as $date) {
+    foreach ($this->dates as $date) {
       $this->nodes[] = $this->drupalCreateNode([
         $this->fieldName => [
           'value' => $date,
@@ -121,12 +127,26 @@ public function testExposedGroupedFilters() {
     $this->submitForm([], 'Expose filter');
     $this->submitForm([], 'Grouped filters');
 
+    // Test operators with different amount of expected values.
     $edit = [];
+    // No values are required.
     $edit['options[group_info][group_items][1][title]'] = 'empty';
     $edit['options[group_info][group_items][1][operator]'] = 'empty';
     $edit['options[group_info][group_items][2][title]'] = 'not empty';
     $edit['options[group_info][group_items][2][operator]'] = 'not empty';
 
+    // One value is required.
+    $edit['options[group_info][group_items][3][title]'] = 'less than';
+    $edit['options[group_info][group_items][3][operator]'] = '<';
+    $edit['options[group_info][group_items][3][value][value]'] = $this->dates[0];
+
+    // Two values are required (min and max).
+    $this->submitForm($edit, 'Add another item');
+    $edit['options[group_info][group_items][4][title]'] = 'between';
+    $edit['options[group_info][group_items][4][operator]'] = 'between';
+    $edit['options[group_info][group_items][4][value][type]'] = 'offset';
+    $edit['options[group_info][group_items][4][value][min]'] = '-2 hours';
+    $edit['options[group_info][group_items][4][value][max]'] = '+2 hours';
     $this->submitForm($edit, 'Apply');
 
     // Test that the exposed filter works as expected.
@@ -142,14 +162,40 @@ public function testExposedGroupedFilters() {
     // Filter the Preview by 'empty'.
     $this->getSession()->getPage()->findField($this->fieldName . '_value')->selectOption(1);
     $this->getSession()->getPage()->pressButton('Apply');
-    $results = $this->cssSelect('.view-content .field-content');
-    $this->assertCount(1, $results);
+    $this->assertIds([4]);
 
     // Filter the Preview by 'not empty'.
     $this->getSession()->getPage()->findField($this->fieldName . '_value')->selectOption(2);
     $this->getSession()->getPage()->pressButton('Apply');
-    $results = $this->cssSelect('.view-content .field-content');
-    $this->assertCount(3, $results);
+    $this->assertIds([1, 2, 3]);
+
+    // Filter the Preview by 'less than'.
+    $this->getSession()->getPage()->findField($this->fieldName . '_value')->selectOption(3);
+    $this->getSession()->getPage()->pressButton('Apply');
+    $this->assertIds([2, 3]);
+
+    // Filter the Preview by 'between'.
+    $this->getSession()->getPage()->findField($this->fieldName . '_value')->selectOption(4);
+    $this->getSession()->getPage()->pressButton('Apply');
+    $this->assertIds([2]);
+  }
+
+  /**
+   * Ensures that a given list of items appear on the view result.
+   *
+   * @param array $expected_ids
+   *   An array of IDs.
+   */
+  protected function assertIds(array $expected_ids = []): void {
+    // First verify the count.
+    $elements = $this->cssSelect('.view-content span.field-content');
+    $this->assertCount(count($expected_ids), $elements);
+
+    $actual_ids = [];
+    foreach ($elements as $element) {
+      $actual_ids[] = (int) $element->getText();
+    }
+    $this->assertEquals($expected_ids, $actual_ids);
   }
 
 }
-- 
GitLab