@@ -13,16 +13,25 @@ const locators = {
13
13
navLinksLocator : `[aria-label="${ englishLocale . components . containers . navBar . controls . toggle } "] + div` ,
14
14
// Global UI controls
15
15
languageDropdownName : englishLocale . components . common . languageDropdown . label ,
16
- themeToggleName : englishLocale . components . common . themeToggle . label ,
17
-
16
+ themeToggleAriaLabels : {
17
+ light : englishLocale . components . common . themeToggle . light ,
18
+ dark : englishLocale . components . common . themeToggle . dark ,
19
+ } ,
18
20
// Search components (from Orama library)
19
21
searchButtonTag : 'orama-button' ,
20
22
searchInputTag : 'orama-input' ,
21
23
searchResultsTag : 'orama-search-results' ,
22
24
} ;
23
25
24
26
const getTheme = ( page : Page ) =>
25
- page . evaluate ( ( ) => document . documentElement . dataset . theme ) ;
27
+ page . evaluate (
28
+ ( ) => document . documentElement . dataset . theme as 'light' | 'dark'
29
+ ) ;
30
+
31
+ const getCurrentAriaLabel = ( theme : string ) =>
32
+ theme === 'dark'
33
+ ? locators . themeToggleAriaLabels . light
34
+ : locators . themeToggleAriaLabels . dark ;
26
35
27
36
const openLanguageMenu = async ( page : Page ) => {
28
37
const button = page . getByRole ( 'button' , {
@@ -65,21 +74,27 @@ test.describe('Node.js Website', () => {
65
74
test . describe ( 'Theme' , ( ) => {
66
75
test ( 'should toggle between light/dark themes' , async ( { page } ) => {
67
76
const themeToggle = page . getByRole ( 'button' , {
68
- name : locators . themeToggleName ,
77
+ name : / S w i t c h t o ( L i g h t | D a r k ) M o d e / i ,
69
78
} ) ;
70
- await expect ( themeToggle ) . toBeVisible ( ) ;
71
79
72
80
const initialTheme = await getTheme ( page ) ;
81
+ const initialAriaLabel = getCurrentAriaLabel ( initialTheme ) ;
82
+ let currentAriaLabel = await themeToggle . getAttribute ( 'aria-label' ) ;
83
+ expect ( currentAriaLabel ) . toBe ( initialAriaLabel ) ;
84
+
73
85
await themeToggle . click ( ) ;
74
86
75
87
const newTheme = await getTheme ( page ) ;
76
- expect ( newTheme ) . not . toEqual ( initialTheme ) ;
77
- expect ( [ 'light' , 'dark' ] ) . toContain ( newTheme ) ;
88
+ const newAriaLabel = getCurrentAriaLabel ( newTheme ) ;
89
+ currentAriaLabel = await themeToggle . getAttribute ( 'aria-label' ) ;
90
+
91
+ expect ( newTheme ) . not . toBe ( initialTheme ) ;
92
+ expect ( currentAriaLabel ) . toBe ( newAriaLabel ) ;
78
93
} ) ;
79
94
80
95
test ( 'should persist theme across page navigation' , async ( { page } ) => {
81
96
const themeToggle = page . getByRole ( 'button' , {
82
- name : locators . themeToggleName ,
97
+ name : / S w i t c h t o ( L i g h t | D a r k ) M o d e / i ,
83
98
} ) ;
84
99
await themeToggle . click ( ) ;
85
100
const selectedTheme = await getTheme ( page ) ;
0 commit comments