@@ -9,12 +9,13 @@ vi.mock('$app/environment', () => ({
99
1010// Mock customizable settings
1111vi . mock ( '$lib/config/customizable-settings' , ( ) => ( {
12- DEFAULT_THEME : 'dark ' ,
12+ DEFAULT_THEME : 'ocean ' ,
1313} ) ) ;
1414
1515describe ( 'theme store' , ( ) => {
1616 let mockLocalStorage : Record < string , string > = { } ;
1717 let documentHeadAppendChildSpy : any ;
18+ let mockMatchMedia : any ;
1819
1920 beforeEach ( ( ) => {
2021 // Reset localStorage mock
@@ -35,6 +36,15 @@ describe('theme store', () => {
3536 key : ( index : number ) => Object . keys ( mockLocalStorage ) [ index ] || null ,
3637 } as Storage ;
3738
39+ // Mock matchMedia for prefers-color-scheme
40+ mockMatchMedia = vi . fn ( ( query : string ) => ( {
41+ matches : false ,
42+ media : query ,
43+ addEventListener : vi . fn ( ) ,
44+ removeEventListener : vi . fn ( ) ,
45+ } ) ) ;
46+ global . window . matchMedia = mockMatchMedia ;
47+
3848 // Mock document element for theme classes
3949 global . document = {
4050 documentElement : {
@@ -84,10 +94,10 @@ describe('theme store', () => {
8494 expect ( ids ) . toContain ( 'arctic' ) ;
8595 } ) ;
8696
87- it ( 'initializes with default theme' , async ( ) => {
97+ it ( 'initializes with default theme when not in browser ' , async ( ) => {
8898 const { theme } = await import ( '../../../../src/lib/stores/theme' ) ;
8999 const value = get ( theme ) ;
90- expect ( value ) . toBe ( 'dark ' ) ;
100+ expect ( value ) . toBe ( 'ocean ' ) ;
91101 } ) ;
92102
93103 it ( 'init sets theme from localStorage if valid' , async ( ) => {
@@ -99,15 +109,63 @@ describe('theme store', () => {
99109 expect ( get ( theme ) ) . toBe ( 'light' ) ;
100110 } ) ;
101111
102- it ( 'init falls back to default if localStorage theme is invalid' , async ( ) => {
112+ it ( 'init falls back to system preference if localStorage theme is invalid' , async ( ) => {
103113 mockLocalStorage [ 'theme' ] = 'invalid-theme' ;
114+ mockMatchMedia . mockImplementation ( ( query : string ) => ( {
115+ matches : query === '(prefers-color-scheme: dark)' ,
116+ media : query ,
117+ addEventListener : vi . fn ( ) ,
118+ removeEventListener : vi . fn ( ) ,
119+ } ) ) ;
120+ const { theme } = await import ( '../../../../src/lib/stores/theme' ) ;
121+
122+ const initialTheme = theme . init ( ) ;
123+ expect ( initialTheme ) . toBe ( 'dark' ) ;
124+ expect ( get ( theme ) ) . toBe ( 'dark' ) ;
125+ } ) ;
126+
127+ it ( 'init uses system preference (light) when no saved theme' , async ( ) => {
128+ mockMatchMedia . mockImplementation ( ( query : string ) => ( {
129+ matches : query === '(prefers-color-scheme: light)' ,
130+ media : query ,
131+ addEventListener : vi . fn ( ) ,
132+ removeEventListener : vi . fn ( ) ,
133+ } ) ) ;
134+ const { theme } = await import ( '../../../../src/lib/stores/theme' ) ;
135+
136+ const initialTheme = theme . init ( ) ;
137+ expect ( initialTheme ) . toBe ( 'light' ) ;
138+ expect ( get ( theme ) ) . toBe ( 'light' ) ;
139+ } ) ;
140+
141+ it ( 'init uses system preference (dark) when no saved theme' , async ( ) => {
142+ mockMatchMedia . mockImplementation ( ( query : string ) => ( {
143+ matches : query === '(prefers-color-scheme: dark)' ,
144+ media : query ,
145+ addEventListener : vi . fn ( ) ,
146+ removeEventListener : vi . fn ( ) ,
147+ } ) ) ;
104148 const { theme } = await import ( '../../../../src/lib/stores/theme' ) ;
105149
106150 const initialTheme = theme . init ( ) ;
107151 expect ( initialTheme ) . toBe ( 'dark' ) ;
108152 expect ( get ( theme ) ) . toBe ( 'dark' ) ;
109153 } ) ;
110154
155+ it ( 'init uses ocean when no saved theme and no system preference' , async ( ) => {
156+ mockMatchMedia . mockImplementation ( ( query : string ) => ( {
157+ matches : false ,
158+ media : query ,
159+ addEventListener : vi . fn ( ) ,
160+ removeEventListener : vi . fn ( ) ,
161+ } ) ) ;
162+ const { theme } = await import ( '../../../../src/lib/stores/theme' ) ;
163+
164+ const initialTheme = theme . init ( ) ;
165+ expect ( initialTheme ) . toBe ( 'ocean' ) ;
166+ expect ( get ( theme ) ) . toBe ( 'ocean' ) ;
167+ } ) ;
168+
111169 it ( 'setTheme updates store and localStorage' , async ( ) => {
112170 const { theme } = await import ( '../../../../src/lib/stores/theme' ) ;
113171 theme . init ( ) ;
0 commit comments