Compare commits

...
Sign in to create a new pull request.

2 commits

Author SHA1 Message Date
Kit Langton
613a8d1beb
test(provider): migrate more config-backed cases (#26984) 2026-05-11 22:21:50 -04:00
Kit Langton
708557880b test(provider): migrate provider tests to effect runner 2026-05-11 22:13:26 -04:00

View file

@ -15,6 +15,7 @@ import { Env } from "../../src/env"
import { Effect } from "effect" import { Effect } from "effect"
import { AppRuntime } from "../../src/effect/app-runtime" import { AppRuntime } from "../../src/effect/app-runtime"
import { makeRuntime } from "../../src/effect/run-service" import { makeRuntime } from "../../src/effect/run-service"
import { testEffect } from "../lib/effect"
const env = makeRuntime(Env.Service, Env.defaultLayer) const env = makeRuntime(Env.Service, Env.defaultLayer)
const set = (k: string, v: string) => env.runSync((svc) => svc.set(k, v)) const set = (k: string, v: string) => env.runSync((svc) => svc.set(k, v))
@ -70,6 +71,8 @@ function paid(providers: Awaited<ReturnType<typeof list>>) {
return Object.values(item.models).filter((model) => model.cost.input > 0).length return Object.values(item.models).filter((model) => model.cost.input > 0).length
} }
const it = testEffect(Provider.defaultLayer)
test("provider loaded from env variable", async () => { test("provider loaded from env variable", async () => {
await using tmp = await tmpdir({ await using tmp = await tmpdir({
init: async (dir) => { init: async (dir) => {
@ -515,13 +518,15 @@ test("defaultModel respects config model setting", async () => {
}) })
}) })
test("provider with baseURL from config", async () => { it.instance(
await using tmp = await tmpdir({ "provider with baseURL from config",
init: async (dir) => { Effect.gen(function* () {
await Bun.write( const providers = yield* Provider.Service.use((provider) => provider.list())
path.join(dir, "opencode.json"), expect(providers[ProviderID.make("custom-openai")]).toBeDefined()
JSON.stringify({ expect(providers[ProviderID.make("custom-openai")].options.baseURL).toBe("https://custom.openai.com/v1")
$schema: "https://opencode.ai/config.json", }),
{
config: {
provider: { provider: {
"custom-openai": { "custom-openai": {
name: "Custom OpenAI", name: "Custom OpenAI",
@ -540,27 +545,22 @@ test("provider with baseURL from config", async () => {
}, },
}, },
}, },
}), },
},
) )
},
})
await WithInstance.provide({
directory: tmp.path,
fn: async () => {
const providers = await list()
expect(providers[ProviderID.make("custom-openai")]).toBeDefined()
expect(providers[ProviderID.make("custom-openai")].options.baseURL).toBe("https://custom.openai.com/v1")
},
})
})
test("model cost defaults to zero when not specified", async () => { it.instance(
await using tmp = await tmpdir({ "model cost defaults to zero when not specified",
init: async (dir) => { Effect.gen(function* () {
await Bun.write( const providers = yield* Provider.Service.use((provider) => provider.list())
path.join(dir, "opencode.json"), const model = providers[ProviderID.make("test-provider")].models["test-model"]
JSON.stringify({ expect(model.cost.input).toBe(0)
$schema: "https://opencode.ai/config.json", expect(model.cost.output).toBe(0)
expect(model.cost.cache.read).toBe(0)
expect(model.cost.cache.write).toBe(0)
}),
{
config: {
provider: { provider: {
"test-provider": { "test-provider": {
name: "Test Provider", name: "Test Provider",
@ -578,32 +578,24 @@ test("model cost defaults to zero when not specified", async () => {
}, },
}, },
}, },
}), },
},
) )
},
})
await WithInstance.provide({
directory: tmp.path,
fn: async () => {
const providers = await list()
const model = providers[ProviderID.make("test-provider")].models["test-model"]
expect(model.cost.input).toBe(0)
expect(model.cost.output).toBe(0)
expect(model.cost.cache.read).toBe(0)
expect(model.cost.cache.write).toBe(0)
},
})
})
test("model options are merged from existing model", async () => { it.instance(
await using tmp = await tmpdir({ "model options are merged from existing model",
init: async (dir) => { Effect.gen(function* () {
await Bun.write( const providers = yield* Provider.Service.use((provider) => provider.list())
path.join(dir, "opencode.json"), const model = providers[ProviderID.anthropic].models["claude-sonnet-4-20250514"]
JSON.stringify({ expect(model.options.customOption).toBe("custom-value")
$schema: "https://opencode.ai/config.json", }),
{
config: {
provider: { provider: {
anthropic: { anthropic: {
options: {
apiKey: "test-api-key",
},
models: { models: {
"claude-sonnet-4-20250514": { "claude-sonnet-4-20250514": {
options: { options: {
@ -613,46 +605,29 @@ test("model options are merged from existing model", async () => {
}, },
}, },
}, },
}), },
},
) )
},
})
await WithInstance.provide({
directory: tmp.path,
fn: async () => {
set("ANTHROPIC_API_KEY", "test-api-key")
const providers = await list()
const model = providers[ProviderID.anthropic].models["claude-sonnet-4-20250514"]
expect(model.options.customOption).toBe("custom-value")
},
})
})
test("provider removed when all models filtered out", async () => { it.instance(
await using tmp = await tmpdir({ "provider removed when all models filtered out",
init: async (dir) => { Effect.gen(function* () {
await Bun.write( const providers = yield* Provider.Service.use((provider) => provider.list())
path.join(dir, "opencode.json"), expect(providers[ProviderID.anthropic]).toBeUndefined()
JSON.stringify({ }),
$schema: "https://opencode.ai/config.json", {
config: {
provider: { provider: {
anthropic: { anthropic: {
options: {
apiKey: "test-api-key",
},
whitelist: ["nonexistent-model"], whitelist: ["nonexistent-model"],
}, },
}, },
}), },
},
) )
},
})
await WithInstance.provide({
directory: tmp.path,
fn: async () => {
set("ANTHROPIC_API_KEY", "test-api-key")
const providers = await list()
expect(providers[ProviderID.anthropic]).toBeUndefined()
},
})
})
test("closest finds model by partial match", async () => { test("closest finds model by partial match", async () => {
await using tmp = await tmpdir({ await using tmp = await tmpdir({