@@ -6,23 +6,23 @@ import { expect, test } from '@playwright/test';
66const OUTPUT_PAGE = 'default.html' ;
77
88test . 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 ( / f o n t - s e m i b o l d / ) ;
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 : / u s a g e g u i d e / i } ) . click ( ) ;
48+ test ( 'internal links switch to the target section' , async ( { page} ) => {
49+ await page . getByRole ( 'link' , { name : / u s a g e g u i d e / 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 ( / h i d d e n / ) ;
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 ( / h i d d e n / ) ;
96- await expect ( navContainer ) . toHaveClass ( / f l e x / ) ;
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 ( / h i d d e n / ) ;
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 ( / f l e x / ) ;
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 ( / h i d d e n / ) ;
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 ( / f o n t - s e m i b o l d / ) ;
129151 } ) ;
130- } ) ;
152+
153+ } )
0 commit comments