Skip to content

Commit c473069

Browse files
committed
Add tests for mobile menu
1 parent 01db884 commit c473069

File tree

4 files changed

+70
-5
lines changed

4 files changed

+70
-5
lines changed

packages/gitbook/e2e/internal.spec.ts

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1621,6 +1621,61 @@ const testCases: TestsCase[] = [
16211621
]),
16221622
],
16231623
},
1624+
{
1625+
name: 'Mobile menu',
1626+
contentBaseURL: 'https://gitbook-open-e2e-sites.gitbook.io/',
1627+
tests: [
1628+
{
1629+
name: 'Mobile menu open',
1630+
viewports: ['iphone-x'],
1631+
url: '',
1632+
run: async (page) => {
1633+
// Set mobile viewport size to ensure mobile menu is visible
1634+
await page.setViewportSize({ width: 375, height: 812 }); // iPhone X dimensions
1635+
1636+
await waitForCookiesDialog(page);
1637+
1638+
await page.locator('[data-testid="mobile-menu-button"]').click();
1639+
1640+
// Wait for table of contents to appear
1641+
const tableOfContents = page.locator('[data-testid="table-of-contents"]');
1642+
await tableOfContents.waitFor({ state: 'visible', timeout: 5000 });
1643+
await expect(tableOfContents).toBeVisible();
1644+
},
1645+
},
1646+
{
1647+
name: 'Mobile menu with dropdown menu',
1648+
viewports: ['iphone-x'],
1649+
url: 'multi-variants/',
1650+
run: async (page) => {
1651+
// Set mobile viewport size to ensure mobile menu is visible
1652+
await page.setViewportSize({ width: 375, height: 812 }); // iPhone X dimensions
1653+
1654+
await waitForCookiesDialog(page);
1655+
1656+
await page.locator('[data-testid="mobile-menu-button"]').click();
1657+
1658+
// Wait for table of contents to appear
1659+
const tableOfContents = page.locator('[data-testid="table-of-contents"]');
1660+
await tableOfContents.waitFor({ state: 'visible', timeout: 5000 });
1661+
await expect(tableOfContents).toBeVisible();
1662+
1663+
// Wait for space dropdown button to be visible
1664+
const spaceDropdownButton = tableOfContents.locator(
1665+
'[data-testid="space-dropdown-button"]'
1666+
);
1667+
await spaceDropdownButton.waitFor({ state: 'visible', timeout: 5000 });
1668+
await expect(spaceDropdownButton).toBeVisible();
1669+
await spaceDropdownButton.click();
1670+
1671+
// Wait for space dropdown to appear
1672+
const spaceDropdown = page.locator('[data-testid="dropdown-menu"]');
1673+
await spaceDropdown.waitFor({ state: 'visible', timeout: 5000 });
1674+
await expect(spaceDropdown).toBeVisible();
1675+
},
1676+
},
1677+
],
1678+
},
16241679
];
16251680

16261681
runTestCases(testCases);

packages/gitbook/e2e/util.ts

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,10 @@ export interface Test {
6464
* Whether to only run this test.
6565
*/
6666
only?: boolean;
67+
/**
68+
* Viewport to use for the test.
69+
*/
70+
viewports?: ('macbook-16' | 'macbook-13' | 'ipad-2' | 'iphone-x')[];
6771
}
6872

6973
export type TestsCase = {
@@ -159,7 +163,7 @@ export function runTestCases(testCases: TestsCase[]) {
159163

160164
test.describe(testCase.name, () => {
161165
for (const testEntry of testCase.tests) {
162-
const { mode = 'page' } = testEntry;
166+
const { mode = 'page', viewports } = testEntry;
163167
const testFn = testEntry.only ? test.only : test;
164168
testFn(testEntry.name, async ({ page, context }) => {
165169
const testEntryPathname =
@@ -204,13 +208,18 @@ export function runTestCases(testCases: TestsCase[]) {
204208
const screenshotName = `${testCase.name} - ${testEntry.name}`;
205209
if (mode === 'image') {
206210
await argosScreenshot(page, screenshotName, {
207-
viewports: ['macbook-13'],
211+
viewports: viewports ?? ['macbook-13'],
208212
threshold: screenshotOptions?.threshold ?? undefined,
209213
fullPage: true,
210214
});
211215
} else {
212216
await argosScreenshot(page, screenshotName, {
213-
viewports: ['macbook-16', 'macbook-13', 'ipad-2', 'iphone-x'],
217+
viewports: viewports ?? [
218+
'macbook-16',
219+
'macbook-13',
220+
'ipad-2',
221+
'iphone-x',
222+
],
214223
argosCSS: `
215224
/* Hide Intercom */
216225
.intercom-lightweight-app {

packages/gitbook/src/components/Header/HeaderMobileMenuButton.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ export function HeaderMobileMenuButton(
2323
<button
2424
{...props}
2525
aria-label={tString(language, 'table_of_contents_button_label')}
26+
data-testid="mobile-menu-button"
2627
onClick={toggleNavigation}
2728
className={tcls(
2829
'flex flex-row items-center rounded straight-corners:rounded-sm px-2 py-1',

packages/gitbook/src/components/TableOfContents/TableOfContents.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ export function TableOfContents(props: {
5050
'max-lg:[html.sidebar-filled.theme-muted_&]:bg-tint-base',
5151
'max-lg:[html.sidebar-filled.theme-bold.tint_&]:bg-tint-base',
5252

53-
'max-lg:py-2',
53+
'max-lg:pb-2',
5454
'max-lg:w-10/12',
5555
'max-lg:shadow-lg',
5656
'max-lg:depth-flat:shadow-none',
@@ -107,7 +107,7 @@ export function TableOfContents(props: {
107107
icon="close"
108108
iconOnly
109109
autoFocus={false}
110-
className="absolute top-2 right-2 z-50 bg-transparent text-tint opacity-8 shadow-none ring-transparent"
110+
className="absolute top-2 right-2 z-50 bg-transparent text-tint opacity-8 shadow-none ring-transparent lg:hidden"
111111
onClick={() => setOpen(false)}
112112
>
113113
<span className="sr-only">Close</span>

0 commit comments

Comments
 (0)