From df85ea0e18985308c61e204b134bc21fac23e291 Mon Sep 17 00:00:00 2001 From: dongmucat <1127093059@qq.com> Date: Thu, 23 Apr 2026 16:24:23 +0800 Subject: [PATCH] fix(search): preserve empty-query discovery results --- web/e2e/search-page-full.spec.ts | 12 ++++++++++++ web/src/shared/hooks/skill-query-helpers.test.ts | 12 ++++++++++++ web/src/shared/hooks/skill-query-helpers.ts | 2 +- 3 files changed, 25 insertions(+), 1 deletion(-) diff --git a/web/e2e/search-page-full.spec.ts b/web/e2e/search-page-full.spec.ts index 09117161..9f18bb24 100644 --- a/web/e2e/search-page-full.spec.ts +++ b/web/e2e/search-page-full.spec.ts @@ -41,7 +41,19 @@ test.describe('Search Input (Real API)', () => { // TC_SEARCH_INPUT_003 P0 - empty search shows the default discovery list test('TC_SEARCH_INPUT_003: empty search shows the default discovery list', async ({ page }) => { + const emptyQueryResponse = page.waitForResponse((response) => { + if (!response.url().includes('/api/web/skills?')) { + return false + } + + const url = new URL(response.url()) + return response.status() === 200 + && url.searchParams.has('q') + && url.searchParams.get('q') === '' + }) + await page.goto(searchUrl('')) + await emptyQueryResponse await expect(page).toHaveURL(/\/search/) await expect(getSearchCards(page).first()).toBeVisible({ timeout: 10_000 }) }) diff --git a/web/src/shared/hooks/skill-query-helpers.test.ts b/web/src/shared/hooks/skill-query-helpers.test.ts index bfd6a003..7381037a 100644 --- a/web/src/shared/hooks/skill-query-helpers.test.ts +++ b/web/src/shared/hooks/skill-query-helpers.test.ts @@ -16,6 +16,18 @@ describe('buildSkillSearchUrl', () => { it('returns the base skills endpoint when no search params are provided', () => { expect(buildSkillSearchUrl({})).toBe('/api/web/skills') }) + + it('keeps an empty q parameter when the search query is an empty string', () => { + expect(buildSkillSearchUrl({ q: '' })).toBe('/api/web/skills?q=') + }) + + it('normalizes whitespace-only queries to an empty q parameter', () => { + expect(buildSkillSearchUrl({ + q: ' ', + sort: 'relevance', + page: 0, + })).toBe('/api/web/skills?q=&sort=relevance&page=0') + }) }) describe('shouldEnableNamespaceMemberCandidates', () => { diff --git a/web/src/shared/hooks/skill-query-helpers.ts b/web/src/shared/hooks/skill-query-helpers.ts index 147d7a52..24a9d745 100644 --- a/web/src/shared/hooks/skill-query-helpers.ts +++ b/web/src/shared/hooks/skill-query-helpers.ts @@ -6,7 +6,7 @@ export function buildSkillSearchUrl(params: SearchParams) { const queryParams = new URLSearchParams() const normalizedQuery = normalizeSearchQuery(params.q ?? '') - if (normalizedQuery) { + if (params.q !== undefined) { queryParams.append('q', normalizedQuery) }