From 8b7f8057b1c5eb75865c374849aebf43822dd7bb Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Ph=C3=A9na=20Proxima?= <adam@phenaproxima.net>
Date: Thu, 27 Feb 2025 13:30:00 -0500
Subject: [PATCH 1/2] Create a failing test

---
 .../ProjectBrowserTestMock.php                 | 16 +++++-----------
 .../ProjectBrowserUiTest.php                   | 13 +++++++++++++
 .../ProjectBrowserUiTestJsonApi.php            | 18 +++++++++++++++---
 3 files changed, 33 insertions(+), 14 deletions(-)

diff --git a/tests/modules/project_browser_test/src/Plugin/ProjectBrowserSource/ProjectBrowserTestMock.php b/tests/modules/project_browser_test/src/Plugin/ProjectBrowserSource/ProjectBrowserTestMock.php
index ec7a7c0aa..9fd99b719 100644
--- a/tests/modules/project_browser_test/src/Plugin/ProjectBrowserSource/ProjectBrowserTestMock.php
+++ b/tests/modules/project_browser_test/src/Plugin/ProjectBrowserSource/ProjectBrowserTestMock.php
@@ -263,6 +263,11 @@ final class ProjectBrowserTestMock extends ProjectBrowserSourceBase {
    * {@inheritdoc}
    */
   public function getFilterDefinitions(): array {
+    $filters_to_define = $this->state->get('filters_to_define');
+    if ($filters_to_define !== NULL) {
+      return $filters_to_define;
+    }
+
     $filters = [
       'search' => new TextFilter('', $this->t('Search'), NULL),
     ];
@@ -295,17 +300,6 @@ final class ProjectBrowserTestMock extends ProjectBrowserSourceBase {
       $this->t('Development status'),
       NULL,
     );
-
-    $filters_to_define = $this->state->get('filters_to_define');
-    if ($filters_to_define !== NULL) {
-      // Only keep those filters which needs to be defined according to
-      // $filters_to_define.
-      foreach ($filters as $filter_key => $filter_value) {
-        if (!in_array($filter_key, $filters_to_define, TRUE)) {
-          unset($filters[$filter_key]);
-        }
-      }
-    }
     return $filters;
   }
 
diff --git a/tests/src/FunctionalJavascript/ProjectBrowserUiTest.php b/tests/src/FunctionalJavascript/ProjectBrowserUiTest.php
index a2f3d3c1b..e58480323 100644
--- a/tests/src/FunctionalJavascript/ProjectBrowserUiTest.php
+++ b/tests/src/FunctionalJavascript/ProjectBrowserUiTest.php
@@ -8,6 +8,7 @@ use Behat\Mink\Element\DocumentElement;
 use Behat\Mink\Element\NodeElement;
 use Drupal\Core\Extension\MissingDependencyException;
 use Drupal\FunctionalJavascriptTests\WebDriverTestBase;
+use Drupal\project_browser\ProjectBrowser\Filter\TextFilter;
 
 // cspell:ignore coverageall doomer eggman quiznos statusactive statusmaintained
 // cspell:ignore vetica
@@ -1159,6 +1160,18 @@ class ProjectBrowserUiTest extends WebDriverTestBase {
     // Click Clear Filters button and make sure search empty again.
     $this->pressWithWait('Clear filters', '25 Results');
     $this->assertEquals($search_field->getValue(), '');
+
+    // Ensure that clearing filters will preserve the result count, even if
+    // all the initial filter values are falsy.
+    \Drupal::state()->set('filters_to_define', [
+      'search' => new TextFilter('', 'Search', NULL),
+    ]);
+    $this->getSession()->reload();
+    $this->assertElementIsVisible('named', ['button', 'Clear filters'])->press();
+    // Ensure that the result count remains even after we wait a sec for
+    // Svelte to re-render.
+    sleep(1);
+    $this->assertElementIsVisible('css', '.pb-search-results');
   }
 
   /**
diff --git a/tests/src/FunctionalJavascript/ProjectBrowserUiTestJsonApi.php b/tests/src/FunctionalJavascript/ProjectBrowserUiTestJsonApi.php
index e262762c6..5d4c0965d 100644
--- a/tests/src/FunctionalJavascript/ProjectBrowserUiTestJsonApi.php
+++ b/tests/src/FunctionalJavascript/ProjectBrowserUiTestJsonApi.php
@@ -5,6 +5,7 @@ declare(strict_types=1);
 namespace Drupal\Tests\project_browser\FunctionalJavascript;
 
 use Drupal\FunctionalJavascriptTests\WebDriverTestBase;
+use Drupal\project_browser\ProjectBrowser\Filter\BooleanFilter;
 
 // cspell:ignore cashpresso Adnuntius Paypage Redsys ZURB Superfish TMGMT Toki
 // cspell:ignore Webtheme Pitchburgh Gotem Webform Bsecurity Bstatus Cardless
@@ -343,11 +344,22 @@ class ProjectBrowserUiTestJsonApi extends WebDriverTestBase {
     $this->drupalGet('admin/modules/browse/project_browser_test_mock');
     $this->assertNull($assert_session->waitForElementVisible('css', '.search__form-filters-container'));
 
-    // Set the names of filters which will be defined by the test mock.
+    // Set the filters which will be defined by the test mock.
     // @see \Drupal\project_browser_test\Plugin\ProjectBrowserSource\ProjectBrowserTestMock::getFilterDefinitions()
     \Drupal::state()->set('filters_to_define', [
-      'maintenance_status',
-      'security_advisory_coverage',
+      'maintenance_status' => new BooleanFilter(
+        TRUE,
+        'Show actively maintained projects',
+        'Show all',
+        'Maintenance status',
+      ),
+      'security_advisory_coverage' => new BooleanFilter(
+        TRUE,
+        'Show projects covered by a security policy',
+        'Show all',
+        'Security advisory coverage',
+        NULL,
+      ),
     ]);
     $this->getSession()->reload();
     // Drupal.org test mock defines only two filters (actively maintained filter
-- 
GitLab


From 3d8033afd37df37675c779215a46e27ec4ee30ab Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Ph=C3=A9na=20Proxima?= <adam@phenaproxima.net>
Date: Thu, 27 Feb 2025 13:31:22 -0500
Subject: [PATCH 2/2] Fix bug

---
 sveltejs/public/build/bundle.js               | Bin 277238 -> 277318 bytes
 sveltejs/public/build/bundle.js.map           | Bin 257754 -> 257830 bytes
 sveltejs/src/QueryManager.js                  |   8 ++++----
 .../ProjectBrowserUiTestJsonApi.php           |   1 +
 4 files changed, 5 insertions(+), 4 deletions(-)

diff --git a/sveltejs/public/build/bundle.js b/sveltejs/public/build/bundle.js
index 2a93e4b8b8538dea08efe7e3120d78c771fd9695..86164c2f79e64779de5091ca5fa7fb7410e9da42 100644
GIT binary patch
delta 122
zcmezNRp8h+frb{w7N#xCU$1XhyTM$@G})Jh!%bgbAv{&RC{-anKQk{~p(J0Sur#%(
zQlTUxRUs)cIXg8kMMt4HU!f>9GcU6wGchN#DpeuBv`8T{uOzi7FEK}<xFoS;`k9N&
c%F}soFbhoAxxy?zefuqD-tC8PF&ifU0A3w0D*ylh

delta 60
zcmX^1P2k&Cfrb{w7N#xCU$0NUevw&X`t@7P0^8qQXRczJ9({+IbGpeDW^tav($u2L
R;F6-uymagB!nc`?698+H8b$yB

diff --git a/sveltejs/public/build/bundle.js.map b/sveltejs/public/build/bundle.js.map
index 37ecd7fc50b9a3e1fd7f6bff53eddac000c8be60..e2cb7317713d25d6380d7e3b939502e3c0dd10e5 100644
GIT binary patch
delta 194
zcmcb0mw(wk{)QIDEli?X+a0x-+?l55w==T4hNr3*r7EQ7XXd3Vl;kTEmZla}DwJfT
zDkLQ)XQ$?+=qMEDD-@+>=4F;-Cgx;Tr7Gl?7Aa)rm82HsCFUp;mn4>?>P_d@V$zvD
zQH@EO4{ShiNl|8Ax^+xm`$iq6?HhHN`Q}a6y~8BAUH>%mL?%Yh=@ZX0%TBjB&MY$h
u#VKZ$>5oq_i%#Evf|*Ms+|e;y$Jx=*+1k<3xy;$x)6v;+`=_(aFBAY_twp>5

delta 107
zcmZ2>kN?(P{)QIDEli?X)8kc`M5iCtVG^9~r^>{+T|$e=g=zW(T_(2aQ`MNnr@z->
z;%on}!?gXs4l~cZ>HE$y`%eFHoSA<*_Z24Y?b4^2XE9BGd5)QX`s?$|T+<cKF^jNz
PIy#p*Z?`+g{6YZ$<Vq%t

diff --git a/sveltejs/src/QueryManager.js b/sveltejs/src/QueryManager.js
index 5267398b5..6ae9ff5f2 100644
--- a/sveltejs/src/QueryManager.js
+++ b/sveltejs/src/QueryManager.js
@@ -87,9 +87,6 @@ export default class {
    * @return {Promise<Object>} - The list of project objects.
    */
   async load(filters, page, pageSize, sort, source) {
-    this.list = [];
-    this.count = 0;
-
     // Encode the current filter values as URL parameters.
     const searchParams = new URLSearchParams();
     Object.entries(filters).forEach(([key, value]) => {
@@ -108,8 +105,11 @@ export default class {
     if (this.lastQueryParams === queryString) {
       return;
     }
-
+    // We're going to query the backend, so reinitialize our internal state.
+    this.list = [];
+    this.count = 0;
     this.lastQueryParams = queryString;
+
     const res = await fetch(
       `${BASE_URL}project-browser/data/project?${queryString}`,
     );
diff --git a/tests/src/FunctionalJavascript/ProjectBrowserUiTestJsonApi.php b/tests/src/FunctionalJavascript/ProjectBrowserUiTestJsonApi.php
index 5d4c0965d..4a28a01c2 100644
--- a/tests/src/FunctionalJavascript/ProjectBrowserUiTestJsonApi.php
+++ b/tests/src/FunctionalJavascript/ProjectBrowserUiTestJsonApi.php
@@ -352,6 +352,7 @@ class ProjectBrowserUiTestJsonApi extends WebDriverTestBase {
         'Show actively maintained projects',
         'Show all',
         'Maintenance status',
+        NULL,
       ),
       'security_advisory_coverage' => new BooleanFilter(
         TRUE,
-- 
GitLab