11import { preferenceService } from '@data/PreferenceService'
2- import { renderHook } from '@testing-library/react'
2+ import { act , renderHook } from '@testing-library/react'
33import { beforeEach , describe , expect , it , vi } from 'vitest'
44
55import { useApiGatewayProvider } from '../useApiGatewayProvider'
@@ -12,7 +12,9 @@ const mocks = vi.hoisted(() => ({
1212 enabled : boolean
1313 } ,
1414 apiGatewayRunning : false ,
15- startApiGateway : vi . fn < ( ) => Promise < boolean > > ( )
15+ startApiGateway : vi . fn < ( ) => Promise < boolean > > ( ) ,
16+ cachedApiKey : null as string | null ,
17+ preferenceChanged : undefined as ( ( ) => void ) | undefined
1618} ) )
1719
1820vi . mock ( '@renderer/hooks/useApiGateway' , ( ) => ( {
@@ -24,7 +26,16 @@ vi.mock('@renderer/hooks/useApiGateway', () => ({
2426} ) )
2527
2628vi . mock ( '@data/PreferenceService' , ( ) => ( {
27- preferenceService : { get : vi . fn ( ) }
29+ preferenceService : {
30+ get : vi . fn ( ) ,
31+ getCachedValue : vi . fn ( ( ) => mocks . cachedApiKey ) ,
32+ subscribeChange : vi . fn ( ( ) => ( callback : ( ) => void ) => {
33+ mocks . preferenceChanged = callback
34+ return ( ) => {
35+ if ( mocks . preferenceChanged === callback ) mocks . preferenceChanged = undefined
36+ }
37+ } )
38+ }
2839} ) )
2940
3041vi . mock ( 'react-i18next' , ( ) => ( {
@@ -35,8 +46,12 @@ describe('useApiGatewayProvider.ensureReady', () => {
3546 beforeEach ( ( ) => {
3647 mocks . apiGatewayConfig = { host : '127.0.0.1' , port : 23333 , apiKey : 'cs-sk-old' , enabled : false }
3748 mocks . apiGatewayRunning = false
49+ mocks . cachedApiKey = null
50+ mocks . preferenceChanged = undefined
3851 mocks . startApiGateway . mockReset ( )
3952 vi . mocked ( preferenceService . get ) . mockReset ( )
53+ vi . mocked ( preferenceService . getCachedValue ) . mockClear ( )
54+ vi . mocked ( preferenceService . subscribeChange ) . mockClear ( )
4055 } )
4156
4257 it ( 'rejects (never returns a stale key) when a non-running gateway fails to start' , async ( ) => {
@@ -61,6 +76,23 @@ describe('useApiGatewayProvider.ensureReady', () => {
6176 await expect ( result . current ! . ensureReady ( ) ) . resolves . toBe ( 'cs-sk-fresh' )
6277 } )
6378
79+ it ( 'waits for the generated key when the renderer cache has not received the start update yet' , async ( ) => {
80+ mocks . apiGatewayRunning = false
81+ mocks . startApiGateway . mockResolvedValue ( true )
82+ vi . mocked ( preferenceService . get ) . mockResolvedValue ( null )
83+
84+ const { result } = renderHook ( ( ) => useApiGatewayProvider ( ) )
85+ const keyPromise = result . current ! . ensureReady ( )
86+ await vi . waitFor ( ( ) => expect ( preferenceService . subscribeChange ) . toHaveBeenCalled ( ) )
87+
88+ act ( ( ) => {
89+ mocks . cachedApiKey = 'cs-sk-generated'
90+ mocks . preferenceChanged ?.( )
91+ } )
92+
93+ await expect ( keyPromise ) . resolves . toBe ( 'cs-sk-generated' )
94+ } )
95+
6496 it ( 'returns the key without starting when the gateway is already running' , async ( ) => {
6597 mocks . apiGatewayRunning = true
6698 mocks . apiGatewayConfig = { host : '127.0.0.1' , port : 23333 , apiKey : 'cs-sk-live' , enabled : true }
0 commit comments