Skip to content

Commit 4542a98

Browse files
Martin Mahnerclaude
authored andcommitted
Add comprehensive Playwright tests for burger menu functionality
- Desktop: burger hidden, navigation visible by default - Mobile: burger button visible - Mobile: menu toggles on/off with burger clicks - Mobile: menu closes after section selection, active state persists All tests verify correct element visibility and state management across viewport sizes. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <[email protected]>
1 parent e066285 commit 4542a98

File tree

1 file changed

+71
-48
lines changed

1 file changed

+71
-48
lines changed

templates_src/default/default.spec.js

Lines changed: 71 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -6,23 +6,23 @@ import { expect, test } from '@playwright/test';
66
const OUTPUT_PAGE = 'default.html';
77

88
test.describe('default template microdocs output', () => {
9-
test.beforeEach(async ({ page }) => {
9+
test.beforeEach(async ({page}) => {
1010
await page.goto(OUTPUT_PAGE);
1111
});
1212

13-
test('renders generated markdown content', async ({ page }) => {
13+
test('renders generated markdown content', async ({page}) => {
1414
const readmeHeading = page.locator('section#readme article h1', {
1515
hasText: 'Default Template Playwright Test',
1616
});
1717
await expect(readmeHeading).toBeVisible();
1818
await expect(
19-
page.getByText('This README is used to verify the default template output for Playwright.')
19+
page.getByText('This README is used to verify the default template output for Playwright.')
2020
).toBeVisible();
2121
await expect(page.locator('section#readme pre code').first()).toContainText('greet');
2222
});
2323

24-
test('supports navigation between sections', async ({ page }) => {
25-
const guideTab = page.getByRole('button', { name: 'GUIDE' });
24+
test('supports navigation between sections', async ({page}) => {
25+
const guideTab = page.getByRole('button', {name: 'GUIDE'});
2626

2727
await expect(page.locator('section#readme')).toBeVisible();
2828
await guideTab.click();
@@ -32,32 +32,32 @@ test.describe('default template microdocs output', () => {
3232
await expect(guideTab).toHaveClass(/font-semibold/);
3333
});
3434

35-
test('builds the table of contents per section', async ({ page }) => {
35+
test('builds the table of contents per section', async ({page}) => {
3636
await page.waitForSelector('.toc-readme .toc-link');
37-
await expect(page.locator('.toc-readme .toc-link', { hasText: 'Overview' })).toBeVisible();
38-
await expect(page.locator('.toc-readme .toc-link', { hasText: 'Code Sample' })).toBeVisible();
37+
await expect(page.locator('.toc-readme .toc-link', {hasText: 'Overview'})).toBeVisible();
38+
await expect(page.locator('.toc-readme .toc-link', {hasText: 'Code Sample'})).toBeVisible();
3939

40-
await page.getByRole('button', { name: 'GUIDE' }).click();
40+
await page.getByRole('button', {name: 'GUIDE'}).click();
4141
await page.waitForSelector('.toc-guide .toc-link');
4242

43-
await expect(page.locator('.toc-guide .toc-link', { hasText: 'Setup' })).toBeVisible();
44-
await expect(page.locator('.toc-guide .toc-link', { hasText: 'Navigation' })).toBeVisible();
43+
await expect(page.locator('.toc-guide .toc-link', {hasText: 'Setup'})).toBeVisible();
44+
await expect(page.locator('.toc-guide .toc-link', {hasText: 'Navigation'})).toBeVisible();
4545
await expect(page.locator('.toc-readme')).toBeHidden();
4646
});
4747

48-
test('internal links switch to the target section', async ({ page }) => {
49-
await page.getByRole('link', { name: /usage guide/i }).click();
48+
test('internal links switch to the target section', async ({page}) => {
49+
await page.getByRole('link', {name: /usage guide/i}).click();
5050
await expect(page.locator('section#guide')).toBeVisible();
51-
await expect(page.getByRole('heading', { name: 'Usage Guide' })).toBeVisible();
51+
await expect(page.getByRole('heading', {name: 'Usage Guide'})).toBeVisible();
5252
});
5353

54-
test('TOC links navigate within the current section, not across sections', async ({ page }) => {
54+
test('TOC links navigate within the current section, not across sections', async ({page}) => {
5555
// Navigate to GUIDE section
56-
await page.getByRole('button', { name: 'GUIDE' }).click();
56+
await page.getByRole('button', {name: 'GUIDE'}).click();
5757
await expect(page.locator('section#guide')).toBeVisible();
5858

5959
// Click the "Deep Dive" TOC link in GUIDE section
60-
const deepDiveTocLink = page.locator('.toc-guide .toc-link', { hasText: 'Deep Dive' });
60+
const deepDiveTocLink = page.locator('.toc-guide .toc-link', {hasText: 'Deep Dive'});
6161
await deepDiveTocLink.click();
6262

6363
// Should still be in GUIDE section, not README
@@ -78,53 +78,76 @@ test.describe('default template microdocs output', () => {
7878
await expect(readmeDeepDive).not.toBeInViewport();
7979
});
8080

81-
test('burger menu toggles mobile navigation on small screens', async ({ page }) => {
82-
// Set viewport to mobile size
83-
await page.setViewportSize({ width: 375, height: 667 });
81+
test('desktop: burger menu not shown, navigation visible by default', async ({page}) => {
82+
await page.setViewportSize({width: 1024, height: 768});
8483

85-
// Initially, the navigation should be hidden on mobile
86-
const navContainer = page.locator('nav#main-nav').locator('..');
87-
await expect(navContainer).toHaveClass(/hidden/);
84+
const burgerButton = page.locator('button[aria-label="Toggle navigation"]');
85+
const navigationContainer = page.locator('nav#main-nav').locator('..');
86+
87+
// Burger button should not be visible on desktop
88+
await expect(burgerButton).toBeHidden();
89+
90+
// Navigation should be visible by default
91+
await expect(navigationContainer).toBeVisible();
92+
await expect(page.getByRole('button', {name: 'README'})).toBeVisible();
93+
await expect(page.getByRole('button', {name: 'GUIDE'})).toBeVisible();
94+
});
95+
96+
test('mobile: burger menu button is visible', async ({page}) => {
97+
await page.setViewportSize({width: 375, height: 667});
8898

89-
// Find and click the burger menu button
9099
const burgerButton = page.locator('button[aria-label="Toggle navigation"]');
100+
101+
// Burger button should be visible on mobile
91102
await expect(burgerButton).toBeVisible();
92-
await burgerButton.click();
103+
});
93104

94-
// After clicking, navigation should be visible
95-
await expect(navContainer).not.toHaveClass(/hidden/);
96-
await expect(navContainer).toHaveClass(/flex/);
105+
test('mobile: menu hidden by default, toggles on burger click', async ({page}) => {
106+
await page.setViewportSize({width: 375, height: 667});
97107

98-
// Navigation items should be visible
99-
await expect(page.getByRole('button', { name: 'README' })).toBeVisible();
100-
await expect(page.getByRole('button', { name: 'GUIDE' })).toBeVisible();
108+
const burgerButton = page.locator('button[aria-label="Toggle navigation"]');
109+
const navigationContainer = page.locator('nav#main-nav').locator('..');
101110

102-
// Click burger menu again to close
111+
// Navigation should be hidden by default on mobile
112+
await expect(navigationContainer).toBeHidden();
113+
114+
// Click burger to open menu
103115
await burgerButton.click();
104-
await expect(navContainer).toHaveClass(/hidden/);
116+
await expect(navigationContainer).toBeVisible();
117+
118+
// Click burger again to close menu
119+
await burgerButton.click();
120+
await expect(navigationContainer).toBeHidden();
105121
});
106122

107-
test('mobile navigation closes after selecting a section', async ({ page }) => {
108-
// Set viewport to mobile size
109-
await page.setViewportSize({ width: 375, height: 667 });
123+
test('mobile: menu closes after section link click, burger resets', async ({page}) => {
124+
await page.setViewportSize({width: 375, height: 667});
110125

111-
// Open mobile menu
112126
const burgerButton = page.locator('button[aria-label="Toggle navigation"]');
113-
await burgerButton.click();
127+
const navigationContainer = page.locator('nav#main-nav').locator('..');
128+
const guideTab = page.getByRole('button', {name: 'GUIDE'});
114129

115-
// Navigation should be visible
116-
const navContainer = page.locator('nav#main-nav').locator('..');
117-
await expect(navContainer).toHaveClass(/flex/);
130+
// Open menu
131+
await burgerButton.click();
132+
await expect(navigationContainer).toBeVisible();
118133

119-
// Click on a navigation item
120-
const guideButton = page.getByRole('button', { name: 'GUIDE' });
121-
await guideButton.click();
134+
// Click on GUIDE section link
135+
await guideTab.click();
122136

123-
// Navigation should close automatically
124-
await expect(navContainer).toHaveClass(/hidden/);
137+
// Menu should close automatically
138+
await expect(navigationContainer).toBeHidden();
125139

126-
// Section should have changed
140+
// GUIDE section should be active and visible
127141
await expect(page.locator('section#guide')).toBeVisible();
128142
await expect(page.locator('section#readme')).toBeHidden();
143+
144+
// Burger should be in closed state (can be clicked to open again)
145+
await expect(burgerButton).toBeVisible();
146+
147+
// Reopen menu to verify GUIDE is still active
148+
await burgerButton.click();
149+
await expect(navigationContainer).toBeVisible();
150+
await expect(guideTab).toHaveClass(/font-semibold/);
129151
});
130-
});
152+
153+
})

0 commit comments

Comments
 (0)