|
|
@@ -0,0 +1,236 @@
|
|
|
+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")
|
|
|
+ },
|
|
|
+ })
|
|
|
+})
|