@@ -64,6 +64,54 @@ Object.entries(testPages).forEach(([postDir, pageName]) => {
6464 await page . goto ( `./blog/simple-blog/_site/${ pageName } ` ) ;
6565 await checkCategoryLink ( page , '免疫' , pageName , 'Welcome To My Blog' ) ;
6666 } ) ;
67+
68+ test ( `Multiple category selection with Ctrl+click works for ${ pageName } ` , async ( { page } ) => {
69+ await page . goto ( `./blog/simple-blog/_site/${ pageName } ` ) ;
70+
71+ // Click on "code" category (only Post With Code has this category)
72+ await page . getByText ( 'code' , { exact : true } ) . click ( ) ;
73+ await expect ( page . locator ( `div.category[data-category="${ btoa ( encodeURIComponent ( 'code' ) ) } "]` ) ) . toHaveClass ( / a c t i v e / ) ;
74+ await expect ( page . getByRole ( 'link' , { name : 'Post With Code' } ) ) . toBeVisible ( ) ;
75+ await expect ( page . getByRole ( 'link' , { name : 'Welcome To My Blog' } ) ) . toBeHidden ( ) ;
76+
77+ // Ctrl+click on "euros (€)" category to add it to selection (only Welcome has this category)
78+ const modifier = process . platform === 'darwin' ? 'Meta' : 'Control' ;
79+ await page . keyboard . down ( modifier ) ;
80+ await page . getByText ( 'euros (€)' , { exact : true } ) . click ( ) ;
81+ await page . keyboard . up ( modifier ) ;
82+
83+ // Both categories should be active
84+ await expect ( page . locator ( `div.category[data-category="${ btoa ( encodeURIComponent ( 'code' ) ) } "]` ) ) . toHaveClass ( / a c t i v e / ) ;
85+ await expect ( page . locator ( `div.category[data-category="${ btoa ( encodeURIComponent ( 'euros (€)' ) ) } "]` ) ) . toHaveClass ( / a c t i v e / ) ;
86+
87+ // Both posts should be visible (OR logic: posts matching any selected category)
88+ await expect ( page . getByRole ( 'link' , { name : 'Post With Code' } ) ) . toBeVisible ( ) ;
89+ await expect ( page . getByRole ( 'link' , { name : 'Welcome To My Blog' } ) ) . toBeVisible ( ) ;
90+
91+ // URL hash should contain both categories (comma-separated)
92+ const url = page . url ( ) ;
93+ expect ( url ) . toContain ( 'category=' ) ;
94+ expect ( url ) . toContain ( encodeURIComponent ( 'code' ) ) ;
95+ expect ( url ) . toContain ( encodeURIComponent ( 'euros (€)' ) ) ;
96+ } ) ;
97+
98+ test ( `Deselecting last category with Ctrl+click shows all posts for ${ pageName } ` , async ( { page } ) => {
99+ await page . goto ( `./blog/simple-blog/_site/${ pageName } ` ) ;
100+
101+ // Click on "code" category
102+ await page . getByText ( 'code' , { exact : true } ) . click ( ) ;
103+ await expect ( page . locator ( `div.category[data-category="${ btoa ( encodeURIComponent ( 'code' ) ) } "]` ) ) . toHaveClass ( / a c t i v e / ) ;
104+
105+ // Ctrl+click on "code" again to deselect it
106+ const modifier = process . platform === 'darwin' ? 'Meta' : 'Control' ;
107+ await page . keyboard . down ( modifier ) ;
108+ await page . getByText ( 'code' , { exact : true } ) . click ( ) ;
109+ await page . keyboard . up ( modifier ) ;
110+
111+ // No category should be active (default state), all posts visible
112+ await expect ( page . getByRole ( 'link' , { name : 'Post With Code' } ) ) . toBeVisible ( ) ;
113+ await expect ( page . getByRole ( 'link' , { name : 'Welcome To My Blog' } ) ) . toBeVisible ( ) ;
114+ } ) ;
67115 }
68116} ) ;
69117
0 commit comments