| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236 |
- import { test, expect } from "bun:test"
- import path from "path"
- import { tmpdir } from "../fixture/fixture"
- import { Instance } from "../../src/project/instance"
- import { Provider } from "../../src/provider/provider"
- import { Env } from "../../src/env"
- import { Auth } from "../../src/auth"
- import { Global } from "../../src/global"
- test("Bedrock: config region takes precedence over AWS_REGION env var", async () => {
- await using tmp = await tmpdir({
- init: async (dir) => {
- await Bun.write(
- path.join(dir, "opencode.json"),
- JSON.stringify({
- $schema: "https://opencode.ai/config.json",
- provider: {
- "amazon-bedrock": {
- options: {
- region: "eu-west-1",
- },
- },
- },
- }),
- )
- },
- })
- await Instance.provide({
- directory: tmp.path,
- init: async () => {
- Env.set("AWS_REGION", "us-east-1")
- Env.set("AWS_PROFILE", "default")
- },
- fn: async () => {
- const providers = await Provider.list()
- expect(providers["amazon-bedrock"]).toBeDefined()
- // Region from config should be used (not env var)
- expect(providers["amazon-bedrock"].options?.region).toBe("eu-west-1")
- },
- })
- })
- test("Bedrock: falls back to AWS_REGION env var when no config", async () => {
- await using tmp = await tmpdir({
- init: async (dir) => {
- await Bun.write(
- path.join(dir, "opencode.json"),
- JSON.stringify({
- $schema: "https://opencode.ai/config.json",
- }),
- )
- },
- })
- await Instance.provide({
- directory: tmp.path,
- init: async () => {
- Env.set("AWS_REGION", "eu-west-1")
- Env.set("AWS_PROFILE", "default")
- },
- fn: async () => {
- const providers = await Provider.list()
- expect(providers["amazon-bedrock"]).toBeDefined()
- expect(providers["amazon-bedrock"].options?.region).toBe("eu-west-1")
- },
- })
- })
- test("Bedrock: without explicit region config, uses AWS_REGION env or defaults", async () => {
- await using tmp = await tmpdir({
- init: async (dir) => {
- await Bun.write(
- path.join(dir, "opencode.json"),
- JSON.stringify({
- $schema: "https://opencode.ai/config.json",
- }),
- )
- },
- })
- await Instance.provide({
- directory: tmp.path,
- init: async () => {
- Env.set("AWS_PROFILE", "default")
- // AWS_REGION might be set in the environment, use that or default
- },
- fn: async () => {
- const providers = await Provider.list()
- expect(providers["amazon-bedrock"]).toBeDefined()
- // Should have some region set (either from env or default)
- expect(providers["amazon-bedrock"].options?.region).toBeDefined()
- expect(typeof providers["amazon-bedrock"].options?.region).toBe("string")
- },
- })
- })
- test("Bedrock: uses config region in provider options", async () => {
- await using tmp = await tmpdir({
- init: async (dir) => {
- await Bun.write(
- path.join(dir, "opencode.json"),
- JSON.stringify({
- $schema: "https://opencode.ai/config.json",
- provider: {
- "amazon-bedrock": {
- options: {
- region: "eu-north-1",
- },
- },
- },
- }),
- )
- },
- })
- await Instance.provide({
- directory: tmp.path,
- init: async () => {
- Env.set("AWS_PROFILE", "default")
- },
- fn: async () => {
- const providers = await Provider.list()
- const bedrockProvider = providers["amazon-bedrock"]
- expect(bedrockProvider).toBeDefined()
- expect(bedrockProvider.options?.region).toBe("eu-north-1")
- },
- })
- })
- test("Bedrock: respects config region for different instances", async () => {
- // First instance with EU config
- await using tmp1 = await tmpdir({
- init: async (dir) => {
- await Bun.write(
- path.join(dir, "opencode.json"),
- JSON.stringify({
- $schema: "https://opencode.ai/config.json",
- provider: {
- "amazon-bedrock": {
- options: {
- region: "eu-west-1",
- },
- },
- },
- }),
- )
- },
- })
- await Instance.provide({
- directory: tmp1.path,
- init: async () => {
- Env.set("AWS_PROFILE", "default")
- Env.set("AWS_REGION", "us-east-1")
- },
- fn: async () => {
- const providers1 = await Provider.list()
- expect(providers1["amazon-bedrock"].options?.region).toBe("eu-west-1")
- },
- })
- // Second instance with US config
- await using tmp2 = await tmpdir({
- init: async (dir) => {
- await Bun.write(
- path.join(dir, "opencode.json"),
- JSON.stringify({
- $schema: "https://opencode.ai/config.json",
- provider: {
- "amazon-bedrock": {
- options: {
- region: "us-west-2",
- },
- },
- },
- }),
- )
- },
- })
- await Instance.provide({
- directory: tmp2.path,
- init: async () => {
- Env.set("AWS_PROFILE", "default")
- Env.set("AWS_REGION", "eu-west-1")
- },
- fn: async () => {
- const providers2 = await Provider.list()
- expect(providers2["amazon-bedrock"].options?.region).toBe("us-west-2")
- },
- })
- })
- test("Bedrock: loads when bearer token from auth.json is present", async () => {
- await using tmp = await tmpdir({
- init: async (dir) => {
- await Bun.write(
- path.join(dir, "opencode.json"),
- JSON.stringify({
- $schema: "https://opencode.ai/config.json",
- provider: {
- "amazon-bedrock": {
- options: {
- region: "eu-west-1",
- },
- },
- },
- }),
- )
- },
- })
- // Setup auth.json with bearer token for amazon-bedrock
- const authPath = path.join(Global.Path.data, "auth.json")
- await Bun.write(
- authPath,
- JSON.stringify({
- "amazon-bedrock": {
- type: "api",
- key: "test-bearer-token",
- },
- }),
- )
- await Instance.provide({
- directory: tmp.path,
- init: async () => {
- // Clear env vars so only auth.json should trigger autoload
- Env.set("AWS_PROFILE", "")
- Env.set("AWS_ACCESS_KEY_ID", "")
- Env.set("AWS_BEARER_TOKEN_BEDROCK", "")
- },
- fn: async () => {
- const providers = await Provider.list()
- expect(providers["amazon-bedrock"]).toBeDefined()
- expect(providers["amazon-bedrock"].options?.region).toBe("eu-west-1")
- },
- })
- })
|