1
1
import { act , renderHook } from '@testing-library/react'
2
2
import { beforeEach , describe , expect , it } from 'vitest'
3
3
import { useBackgroundJobs } from './useBackgroundJobs'
4
+ import {
5
+ BACKGROUND_JOBS_STORAGE_KEY ,
6
+ useBackgroundJobsStore ,
7
+ } from './useBackgroundJobsStore'
4
8
import type { BackgroundJob } from '../lib/schemas'
5
9
6
10
describe ( 'useBackgroundJobs' , ( ) => {
7
- const STORAGE_KEY = 'background-jobs'
8
-
9
11
beforeEach ( ( ) => {
10
- localStorage . clear ( )
12
+ const { result } = renderHook ( ( ) => useBackgroundJobs ( ) )
13
+ act ( ( ) => {
14
+ result . current . clearAllJobs ( )
15
+ } )
11
16
} )
12
17
13
18
const createMockJob = (
@@ -21,6 +26,19 @@ describe('useBackgroundJobs', () => {
21
26
} )
22
27
23
28
describe ( 'initialization and persistence' , ( ) => {
29
+ it ( 'should reset jobs using resetJobs()' , ( ) => {
30
+ const { result } = renderHook ( ( ) => useBackgroundJobs ( ) )
31
+ const job = createMockJob ( { id : 'reset-job' } )
32
+ act ( ( ) => {
33
+ result . current . addJob ( job )
34
+ } )
35
+ expect ( result . current . jobs ) . toHaveLength ( 1 )
36
+ act ( ( ) => {
37
+ result . current . clearAllJobs ( )
38
+ } )
39
+ expect ( result . current . jobs ) . toHaveLength ( 0 )
40
+ expect ( result . current . jobsMap ) . toEqual ( { } )
41
+ } )
24
42
it ( 'should start with empty jobs when no data in localStorage' , ( ) => {
25
43
const { result } = renderHook ( ( ) => useBackgroundJobs ( ) )
26
44
@@ -33,7 +51,8 @@ describe('useBackgroundJobs', () => {
33
51
const job2 = createMockJob ( { id : 'job2' , status : 'completed' } )
34
52
const storedData = { job1, job2 }
35
53
36
- localStorage . setItem ( STORAGE_KEY , JSON . stringify ( storedData ) )
54
+ // Initialize store with existing data using proper API
55
+ useBackgroundJobsStore . getState ( ) . initializeJobs ( storedData )
37
56
38
57
const { result } = renderHook ( ( ) => useBackgroundJobs ( ) )
39
58
@@ -229,8 +248,10 @@ describe('useBackgroundJobs', () => {
229
248
expect ( finalJob ?. response ) . toBe ( 'Job completed successfully' )
230
249
expect ( finalJob ?. completedAt ) . toBe ( '2025-01-01T01:00:00Z' )
231
250
232
- const storedData = JSON . parse ( localStorage . getItem ( STORAGE_KEY ) || '{}' )
233
- expect ( storedData [ job . id ] ) . toEqual ( finalJob )
251
+ const storedData = JSON . parse (
252
+ localStorage . getItem ( BACKGROUND_JOBS_STORAGE_KEY ) || '{}' ,
253
+ )
254
+ expect ( storedData . state . jobs [ job . id ] ) . toEqual ( finalJob )
234
255
} )
235
256
236
257
it ( 'should handle concurrent job operations' , ( ) => {
@@ -252,7 +273,11 @@ describe('useBackgroundJobs', () => {
252
273
} )
253
274
254
275
expect ( result . current . jobs ) . toHaveLength ( 0 )
255
- expect ( localStorage . getItem ( STORAGE_KEY ) ) . toBeNull ( )
276
+ // Zustand persist middleware always creates localStorage entry, so check it has empty jobs
277
+ const storedData = JSON . parse (
278
+ localStorage . getItem ( BACKGROUND_JOBS_STORAGE_KEY ) || '{}' ,
279
+ )
280
+ expect ( storedData . state ?. jobs ) . toEqual ( { } )
256
281
257
282
act ( ( ) => {
258
283
result . current . addJob ( runningJob )
@@ -305,7 +330,11 @@ describe('useBackgroundJobs', () => {
305
330
const firstSessionResult = renderHook ( ( ) => useBackgroundJobs ( ) )
306
331
307
332
expect ( firstSessionResult . result . current . jobs ) . toHaveLength ( 0 )
308
- expect ( localStorage . getItem ( STORAGE_KEY ) ) . toBeNull ( )
333
+ // Zustand persist middleware always creates localStorage entry, so check it has empty jobs
334
+ const initialStoredData = JSON . parse (
335
+ localStorage . getItem ( BACKGROUND_JOBS_STORAGE_KEY ) || '{}' ,
336
+ )
337
+ expect ( initialStoredData . state ?. jobs ) . toEqual ( { } )
309
338
310
339
act ( ( ) => {
311
340
firstSessionResult . result . current . addJob ( job1 )
0 commit comments