From 17c16310132441ed2fb2c0a6c3e33aa041daeb67 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Greg=20Berg=C3=A9?= Date: Tue, 14 Jan 2025 12:39:12 +0100 Subject: [PATCH] Visual testing stabilization (#2741) --- packages/gitbook/e2e/pages.spec.ts | 30 +++++++++++++++---- .../src/components/Search/SearchAskAnswer.tsx | 2 +- .../Search/SearchQuestionResultItem.tsx | 1 + .../src/components/Search/SearchResults.tsx | 7 ++--- .../TableOfContents/TOCScroller.tsx | 7 ++++- 5 files changed, 35 insertions(+), 12 deletions(-) diff --git a/packages/gitbook/e2e/pages.spec.ts b/packages/gitbook/e2e/pages.spec.ts index f97465e8e..b96b99972 100644 --- a/packages/gitbook/e2e/pages.spec.ts +++ b/packages/gitbook/e2e/pages.spec.ts @@ -31,7 +31,7 @@ interface Test { cookies?: Parameters[0]; run?: (page: Page) => Promise; // The test to run fullPage?: boolean; // Whether the test should be fullscreened during testing - screenshot?: false; // Should a screenshot be stored + screenshot?: false | { threshold: number }; // Disable screenshot or set threshold only?: boolean; // Only run this test } @@ -95,19 +95,26 @@ const testCases: TestsCase[] = [ { name: 'Search', url: '?q=', + screenshot: false, + run: async (page) => { + await expect(page.getByTestId('search-results')).toBeVisible(); + const allItems = await page.getByTestId('search-result-item').all(); + // Expect at least 3 questions + await expect(allItems.length).toBeGreaterThan(2); + }, }, { name: 'Search Results', url: '?q=gitbook', run: async (page) => { - await page.waitForSelector('[data-test="search-results"]'); + await expect(page.getByTestId('search-results')).toBeVisible(); }, }, { name: 'AI Search', url: '?q=What+is+GitBook%3F&ask=true', run: async (page) => { - await page.waitForSelector('[data-test="search-ask-answer"]'); + await expect(page.getByTestId('search-ask-answer')).toBeVisible(); }, screenshot: false, }, @@ -273,14 +280,14 @@ const testCases: TestsCase[] = [ name: 'Search Results', url: '?q=gitbook', run: async (page) => { - await page.waitForSelector('[data-test="search-results"]'); + await expect(page.getByTestId('search-results')).toBeVisible(); }, }, { name: 'AI Search', url: '?q=What+is+GitBook%3F&ask=true', run: async (page) => { - await page.waitForSelector('[data-test="search-ask-answer"]'); + await expect(page.getByTestId('search-ask-answer')).toBeVisible(); }, screenshot: false, }, @@ -336,6 +343,7 @@ const testCases: TestsCase[] = [ name: 'Inline Images', url: 'blocks/inline-images', run: waitForCookiesDialog, + screenshot: { threshold: 0.8 }, }, { name: 'Tabs', @@ -678,6 +686,7 @@ const testCases: TestsCase[] = [ run: async (page) => { await expect(page.locator('h1')).toHaveText('SSO'); }, + screenshot: false, }, ], }, @@ -1347,6 +1356,7 @@ for (const testCase of testCases) { await testEntry.run(page); } if (testEntry.screenshot !== false) { + await scrollTOCToTop(page); await argosScreenshot(page, `${testCase.name} - ${testEntry.name}`, { viewports: ['macbook-16', 'macbook-13', 'iphone-x', 'ipad-2'], argosCSS: ` @@ -1355,6 +1365,7 @@ for (const testCase of testCases) { display: none !important; } `, + threshold: testEntry.screenshot?.threshold ?? undefined, fullPage: testEntry.fullPage ?? false, beforeScreenshot: async () => { await waitForIcons(page); @@ -1466,3 +1477,12 @@ async function waitForIcons(page: Page) { ); }); } + +/** + * Scroll the table of contents to the top to stabilize the screenshot. + */ +async function scrollTOCToTop(page: Page) { + await page.evaluate(() => { + document.querySelector('[data-testid=toc-container]')?.scrollTo(0, 0); + }); +} diff --git a/packages/gitbook/src/components/Search/SearchAskAnswer.tsx b/packages/gitbook/src/components/Search/SearchAskAnswer.tsx index 018575132..681ce3f9c 100644 --- a/packages/gitbook/src/components/Search/SearchAskAnswer.tsx +++ b/packages/gitbook/src/components/Search/SearchAskAnswer.tsx @@ -141,7 +141,7 @@ function AnswerBody(props: { answer: AskAnswerResult }) { return ( <>
+
{t(language, 'search_no_results', query)}
); @@ -234,7 +231,7 @@ export const SearchResults = React.forwardRef(function SearchResults( ) : null ) : ( <> -
+
{results.map((item, index) => { switch (item.type) { case 'page': { diff --git a/packages/gitbook/src/components/TableOfContents/TOCScroller.tsx b/packages/gitbook/src/components/TableOfContents/TOCScroller.tsx index 2d288cd4b..46a0560bb 100644 --- a/packages/gitbook/src/components/TableOfContents/TOCScroller.tsx +++ b/packages/gitbook/src/components/TableOfContents/TOCScroller.tsx @@ -26,7 +26,12 @@ export function TOCScrollContainer(props: { return ( -
+
{children}