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