diff --git a/internal/http/tts_test.go b/internal/http/tts_test.go index a0bb97b7..3660a916 100644 --- a/internal/http/tts_test.go +++ b/internal/http/tts_test.go @@ -25,12 +25,15 @@ type mockTTSProvider struct { result *audio.SynthResult err error block bool // if true, blocks until ctx is cancelled (timeout test) + stateless bool // if true, don't capture opts (for concurrent tests) } func (m *mockTTSProvider) Name() string { return m.name } func (m *mockTTSProvider) Synthesize(ctx context.Context, text string, opts audio.TTSOptions) (*audio.SynthResult, error) { - m.capturedOpts = opts + if !m.stateless { + m.capturedOpts = opts + } if m.block { <-ctx.Done() return nil, ctx.Err() diff --git a/internal/http/tts_update_manager_test.go b/internal/http/tts_update_manager_test.go index 97fe1073..d8d93694 100644 --- a/internal/http/tts_update_manager_test.go +++ b/internal/http/tts_update_manager_test.go @@ -66,9 +66,9 @@ func TestTTSHandler_UpdateManager_SwapsProvider(t *testing.T) { func TestTTSHandler_UpdateManager_ConcurrentSafe(t *testing.T) { setupTestToken(t, "") // dev mode - // Use stateless mock — each provider is separate instance + // Use stateless mock to avoid race on capturedOpts mgr := audio.NewManager(audio.ManagerConfig{Primary: "mock"}) - mgr.RegisterTTS(&mockTTSProvider{name: "mock"}) + mgr.RegisterTTS(&mockTTSProvider{name: "mock", stateless: true}) h := NewTTSHandler(mgr) mux := http.NewServeMux() @@ -96,7 +96,7 @@ func TestTTSHandler_UpdateManager_ConcurrentSafe(t *testing.T) { go func() { defer wg.Done() newMgr := audio.NewManager(audio.ManagerConfig{Primary: "mock-new"}) - newMgr.RegisterTTS(&mockTTSProvider{name: "mock-new"}) + newMgr.RegisterTTS(&mockTTSProvider{name: "mock-new", stateless: true}) h.UpdateManager(newMgr) }()