Skip to content

Commit 9b5d09e

Browse files
authored
test(coderd/x/chatd): seed anthropic provider for computer_use tests (#24611)
`TestSubagentLifecycleToolsIncludePersistedSubagentTypeAcrossVariants/ComputerUse` and two adjacent positive tests passed a static Anthropic key into `newInternalTestServer`, but `seedInternalChatDeps` only inserts an OpenAI provider. At runtime, `Server.resolveUserProviderAPIKeys` calls `chatprovider.PruneDisabledProviderKeys`, which clears `keys.Anthropic` because Anthropic is not in the enabled DB provider set, so the `computer_use` execution path loses its key. Add a focused test helper `seedEnabledAnthropicProvider` and use it only in the positive tests that actually drive a `computer_use` spawn through the runtime key-resolution path (the `computer_use` branch of `TestSubagentLifecycleToolsIncludePersistedSubagentTypeAcrossVariants`, `TestSpawnAgent_ComputerUseUsesComputerUseModelNotParent`, and `TestSpawnAgent_ComputerUseInheritsMCPServerIDs`). `seedInternalChatDeps` stays unchanged, so the negative availability tests continue to model the "Anthropic unavailable" fixture. No production code is modified. Closes coder/internal#1486 > This PR was opened by Mux working on Mike's behalf.
1 parent 5c316d4 commit 9b5d09e

2 files changed

Lines changed: 74 additions & 14 deletions

File tree

coderd/x/chatd/subagent_context_internal_test.go

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -472,12 +472,11 @@ func TestSpawnComputerUseAgentInheritsContext(t *testing.T) {
472472

473473
db, ps := dbtestutil.NewDB(t)
474474
require.NoError(t, db.UpsertChatDesktopEnabled(chatdTestContext(t), true))
475-
server := newInternalTestServer(t, db, ps, chatprovider.ProviderAPIKeys{
476-
Anthropic: "test-anthropic-key",
477-
})
475+
server := newInternalTestServer(t, db, ps, chatprovider.ProviderAPIKeys{})
478476

479477
ctx := chatdTestContext(t)
480478
parentChat := createParentChatWithInheritedContext(ctx, t, db, server)
479+
insertEnabledAnthropicProvider(ctx, t, db, parentChat.OwnerID)
481480

482481
tools := server.subagentTools(ctx, func() database.Chat { return parentChat }, parentChat.LastModelConfigID)
483482
tool := findToolByName(tools, spawnAgentToolName)

coderd/x/chatd/subagent_internal_test.go

Lines changed: 72 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -147,6 +147,70 @@ func seedInternalChatDeps(
147147
return user, org, model
148148
}
149149

150+
// insertEnabledAnthropicProvider inserts an enabled Anthropic provider for
151+
// the current test user so computer_use flows keep Anthropic credentials
152+
// after provider-key pruning.
153+
func insertEnabledAnthropicProvider(
154+
ctx context.Context,
155+
t *testing.T,
156+
db database.Store,
157+
userID uuid.UUID,
158+
) {
159+
t.Helper()
160+
161+
_, err := db.InsertChatProvider(ctx, database.InsertChatProviderParams{
162+
Provider: "anthropic",
163+
DisplayName: "Anthropic",
164+
APIKey: "test-anthropic-key",
165+
BaseUrl: "",
166+
ApiKeyKeyID: sql.NullString{},
167+
CreatedBy: uuid.NullUUID{UUID: userID, Valid: true},
168+
Enabled: true,
169+
CentralApiKeyEnabled: true,
170+
})
171+
require.NoError(t, err)
172+
}
173+
174+
func TestResolveUserProviderAPIKeys_PreservesAnthropicKeyFromDBProvider(t *testing.T) {
175+
t.Parallel()
176+
177+
t.Run("PreservesDBProviderKeyWithoutFallback", func(t *testing.T) {
178+
t.Parallel()
179+
180+
db, ps := dbtestutil.NewDB(t)
181+
server := newInternalTestServer(t, db, ps, chatprovider.ProviderAPIKeys{})
182+
183+
ctx := chatdTestContext(t)
184+
user, _, _ := seedInternalChatDeps(ctx, t, db)
185+
insertEnabledAnthropicProvider(ctx, t, db, user.ID)
186+
187+
keys, err := server.resolveUserProviderAPIKeys(ctx, user.ID)
188+
require.NoError(t, err)
189+
require.Equal(t, "test-anthropic-key", keys.Anthropic)
190+
require.Equal(t, "test-anthropic-key", keys.APIKey("anthropic"))
191+
require.Equal(t, "test-anthropic-key", keys.ByProvider["anthropic"])
192+
})
193+
194+
t.Run("PrunesFallbackKeyWithoutEnabledProvider", func(t *testing.T) {
195+
t.Parallel()
196+
197+
db, ps := dbtestutil.NewDB(t)
198+
server := newInternalTestServer(t, db, ps, chatprovider.ProviderAPIKeys{
199+
Anthropic: "test-anthropic-key",
200+
})
201+
202+
ctx := chatdTestContext(t)
203+
user, _, _ := seedInternalChatDeps(ctx, t, db)
204+
205+
keys, err := server.resolveUserProviderAPIKeys(ctx, user.ID)
206+
require.NoError(t, err)
207+
require.Empty(t, keys.Anthropic)
208+
require.Empty(t, keys.APIKey("anthropic"))
209+
_, ok := keys.ByProvider["anthropic"]
210+
require.False(t, ok)
211+
})
212+
}
213+
150214
func insertInternalChatModelConfig(
151215
ctx context.Context,
152216
t *testing.T,
@@ -983,14 +1047,13 @@ func TestSubagentLifecycleToolsIncludePersistedSubagentTypeAcrossVariants(t *tes
9831047
require.NoError(t, db.UpsertChatDesktopEnabled(chatdTestContext(t), true))
9841048
}
9851049

986-
providerKeys := chatprovider.ProviderAPIKeys{}
987-
if tt.variant == subagentTypeComputerUse {
988-
providerKeys = chatprovider.ProviderAPIKeys{Anthropic: "test-anthropic-key"}
989-
}
990-
server := newInternalTestServer(t, db, ps, providerKeys)
1050+
server := newInternalTestServer(t, db, ps, chatprovider.ProviderAPIKeys{})
9911051

9921052
ctx := chatdTestContext(t)
9931053
user, org, model := seedInternalChatDeps(ctx, t, db)
1054+
if tt.variant == subagentTypeComputerUse {
1055+
insertEnabledAnthropicProvider(ctx, t, db, user.ID)
1056+
}
9941057
parentChat := createInternalParentChat(
9951058
ctx,
9961059
t,
@@ -1121,12 +1184,11 @@ func TestSpawnAgent_ComputerUseUsesComputerUseModelNotParent(t *testing.T) {
11211184

11221185
db, ps := dbtestutil.NewDB(t)
11231186
require.NoError(t, db.UpsertChatDesktopEnabled(chatdTestContext(t), true))
1124-
server := newInternalTestServer(t, db, ps, chatprovider.ProviderAPIKeys{
1125-
Anthropic: "test-anthropic-key",
1126-
})
1187+
server := newInternalTestServer(t, db, ps, chatprovider.ProviderAPIKeys{})
11271188

11281189
ctx := chatdTestContext(t)
11291190
user, org, model := seedInternalChatDeps(ctx, t, db)
1191+
insertEnabledAnthropicProvider(ctx, t, db, user.ID)
11301192
workspace, build, agent := seedWorkspaceBinding(t, db, user.ID)
11311193

11321194
require.Equal(t, "openai", model.Provider, "seed helper must create an OpenAI model")
@@ -1179,12 +1241,11 @@ func TestSpawnAgent_ComputerUseInheritsMCPServerIDs(t *testing.T) {
11791241

11801242
db, ps := dbtestutil.NewDB(t)
11811243
require.NoError(t, db.UpsertChatDesktopEnabled(chatdTestContext(t), true))
1182-
server := newInternalTestServer(t, db, ps, chatprovider.ProviderAPIKeys{
1183-
Anthropic: "test-anthropic-key",
1184-
})
1244+
server := newInternalTestServer(t, db, ps, chatprovider.ProviderAPIKeys{})
11851245

11861246
ctx := chatdTestContext(t)
11871247
user, org, model := seedInternalChatDeps(ctx, t, db)
1248+
insertEnabledAnthropicProvider(ctx, t, db, user.ID)
11881249

11891250
mcpCfg, err := db.InsertMCPServerConfig(ctx, database.InsertMCPServerConfigParams{
11901251
DisplayName: "MCP Test",

0 commit comments

Comments
 (0)