11import { test , expect } from '@playwright/test' ;
22
33test . describe ( 'Theme' , ( ) => {
4- test . beforeEach ( async ( { page } ) => {
5- // Clear localStorage to start fresh
4+ test ( 'auto theme follows system light preference' , async ( { page } ) => {
5+ await page . emulateMedia ( { colorScheme : 'light' } ) ;
66 await page . goto ( '/login' ) ;
77 await page . evaluate ( ( ) => localStorage . removeItem ( 'app-theme' ) ) ;
8- } ) ;
9-
10- test ( 'defaults to auto theme (no dark class)' , async ( { page } ) => {
11- await page . goto ( '/login' ) ;
8+ await page . reload ( ) ;
129
13- // Check that dark class is not present initially (assuming system prefers light)
1410 const hasDarkClass = await page . evaluate ( ( ) =>
1511 document . documentElement . classList . contains ( 'dark' )
1612 ) ;
17- // This may be true or false depending on system preference
18- expect ( typeof hasDarkClass ) . toBe ( 'boolean' ) ;
13+ expect ( hasDarkClass ) . toBe ( false ) ;
1914 } ) ;
2015
21- test ( 'persists theme preference in localStorage' , async ( { page } ) => {
16+ test ( 'auto theme follows system dark preference' , async ( { page } ) => {
17+ await page . emulateMedia ( { colorScheme : 'dark' } ) ;
2218 await page . goto ( '/login' ) ;
23-
24- // Set theme via localStorage
25- await page . evaluate ( ( ) => localStorage . setItem ( 'app-theme' , 'dark' ) ) ;
19+ await page . evaluate ( ( ) => localStorage . removeItem ( 'app-theme' ) ) ;
2620 await page . reload ( ) ;
2721
28- const storedTheme = await page . evaluate ( ( ) => localStorage . getItem ( 'app-theme' ) ) ;
29- expect ( storedTheme ) . toBe ( 'dark' ) ;
22+ const hasDarkClass = await page . evaluate ( ( ) =>
23+ document . documentElement . classList . contains ( 'dark' )
24+ ) ;
25+ expect ( hasDarkClass ) . toBe ( true ) ;
3026 } ) ;
3127
32- test ( 'applies dark theme when set' , async ( { page } ) => {
28+ test ( 'explicit dark theme overrides system preference' , async ( { page } ) => {
29+ await page . emulateMedia ( { colorScheme : 'light' } ) ;
3330 await page . goto ( '/login' ) ;
34-
35- // Set dark theme
36- await page . evaluate ( ( ) => {
37- localStorage . setItem ( 'app-theme' , 'dark' ) ;
38- document . documentElement . classList . add ( 'dark' ) ;
39- } ) ;
31+ await page . evaluate ( ( ) => localStorage . setItem ( 'app-theme' , 'dark' ) ) ;
32+ await page . reload ( ) ;
4033
4134 const hasDarkClass = await page . evaluate ( ( ) =>
4235 document . documentElement . classList . contains ( 'dark' )
4336 ) ;
4437 expect ( hasDarkClass ) . toBe ( true ) ;
4538 } ) ;
4639
47- test ( 'applies light theme when set' , async ( { page } ) => {
40+ test ( 'explicit light theme overrides system preference' , async ( { page } ) => {
41+ await page . emulateMedia ( { colorScheme : 'dark' } ) ;
4842 await page . goto ( '/login' ) ;
49-
50- // Set light theme
51- await page . evaluate ( ( ) => {
52- localStorage . setItem ( 'app-theme' , 'light' ) ;
53- document . documentElement . classList . remove ( 'dark' ) ;
54- } ) ;
43+ await page . evaluate ( ( ) => localStorage . setItem ( 'app-theme' , 'light' ) ) ;
44+ await page . reload ( ) ;
5545
5646 const hasDarkClass = await page . evaluate ( ( ) =>
5747 document . documentElement . classList . contains ( 'dark' )
@@ -61,15 +51,15 @@ test.describe('Theme', () => {
6151
6252 test ( 'theme persists across page navigation' , async ( { page } ) => {
6353 await page . goto ( '/login' ) ;
64-
65- // Set dark theme
6654 await page . evaluate ( ( ) => localStorage . setItem ( 'app-theme' , 'dark' ) ) ;
67- await page . reload ( ) ;
68-
69- // Navigate to another page
7055 await page . goto ( '/register' ) ;
7156
7257 const storedTheme = await page . evaluate ( ( ) => localStorage . getItem ( 'app-theme' ) ) ;
7358 expect ( storedTheme ) . toBe ( 'dark' ) ;
59+
60+ const hasDarkClass = await page . evaluate ( ( ) =>
61+ document . documentElement . classList . contains ( 'dark' )
62+ ) ;
63+ expect ( hasDarkClass ) . toBe ( true ) ;
7464 } ) ;
7565} ) ;
0 commit comments