package auth import ( "context" "net/http" "sync" "testing" cliproxyexecutor "github.com/router-for-me/CLIProxyAPI/v6/sdk/cliproxy/executor" ) type replaceAwareExecutor struct { id string mu sync.Mutex closedSessionIDs []string } func (e *replaceAwareExecutor) Identifier() string { return e.id } func (e *replaceAwareExecutor) Execute(context.Context, *Auth, cliproxyexecutor.Request, cliproxyexecutor.Options) (cliproxyexecutor.Response, error) { return cliproxyexecutor.Response{}, nil } func (e *replaceAwareExecutor) ExecuteStream(context.Context, *Auth, cliproxyexecutor.Request, cliproxyexecutor.Options) (<-chan cliproxyexecutor.StreamChunk, error) { ch := make(chan cliproxyexecutor.StreamChunk) close(ch) return ch, nil } func (e *replaceAwareExecutor) Refresh(_ context.Context, auth *Auth) (*Auth, error) { return auth, nil } func (e *replaceAwareExecutor) CountTokens(context.Context, *Auth, cliproxyexecutor.Request, cliproxyexecutor.Options) (cliproxyexecutor.Response, error) { return cliproxyexecutor.Response{}, nil } func (e *replaceAwareExecutor) HttpRequest(context.Context, *Auth, *http.Request) (*http.Response, error) { return nil, nil } func (e *replaceAwareExecutor) CloseExecutionSession(sessionID string) { e.mu.Lock() defer e.mu.Unlock() e.closedSessionIDs = append(e.closedSessionIDs, sessionID) } func (e *replaceAwareExecutor) ClosedSessionIDs() []string { e.mu.Lock() defer e.mu.Unlock() out := make([]string, len(e.closedSessionIDs)) copy(out, e.closedSessionIDs) return out } func TestManagerRegisterExecutorClosesReplacedExecutionSessions(t *testing.T) { t.Parallel() manager := NewManager(nil, nil, nil) replaced := &replaceAwareExecutor{id: "codex"} current := &replaceAwareExecutor{id: "codex"} manager.RegisterExecutor(replaced) manager.RegisterExecutor(current) closed := replaced.ClosedSessionIDs() if len(closed) != 1 { t.Fatalf("expected replaced executor close calls = 1, got %d", len(closed)) } if closed[0] != CloseAllExecutionSessionsID { t.Fatalf("expected close marker %q, got %q", CloseAllExecutionSessionsID, closed[0]) } if len(current.ClosedSessionIDs()) != 0 { t.Fatalf("expected current executor to stay open") } } func TestManagerExecutorReturnsRegisteredExecutor(t *testing.T) { t.Parallel() manager := NewManager(nil, nil, nil) current := &replaceAwareExecutor{id: "codex"} manager.RegisterExecutor(current) resolved, okResolved := manager.Executor("CODEX") if !okResolved { t.Fatal("expected registered executor to be found") } if resolved != current { t.Fatal("expected resolved executor to match registered executor") } _, okMissing := manager.Executor("unknown") if okMissing { t.Fatal("expected unknown provider lookup to fail") } }