The cross-spawn-spawner module has been moved from src/effect/ to src/ to simplify the core package structure. The src/types.d.ts file which contained unused type declarations has also been removed. All imports throughout the codebase have been updated to reflect the new location. This change reduces the package's internal complexity by flattening the module hierarchy and removing dead code, making future maintenance easier.
87 lines
2.7 KiB
TypeScript
87 lines
2.7 KiB
TypeScript
import { describe, expect } from "bun:test"
|
|
import { Effect, Layer } from "effect"
|
|
import { Auth } from "../../src/auth"
|
|
import { CrossSpawnSpawner } from "@opencode-ai/core/cross-spawn-spawner"
|
|
import { provideTmpdirInstance } from "../fixture/fixture"
|
|
import { testEffect } from "../lib/effect"
|
|
|
|
const node = CrossSpawnSpawner.defaultLayer
|
|
|
|
const it = testEffect(Layer.mergeAll(Auth.defaultLayer, node))
|
|
|
|
describe("Auth", () => {
|
|
it.live("set normalizes trailing slashes in keys", () =>
|
|
provideTmpdirInstance(() =>
|
|
Effect.gen(function* () {
|
|
const auth = yield* Auth.Service
|
|
yield* auth.set("https://example.com/", {
|
|
type: "wellknown",
|
|
key: "TOKEN",
|
|
token: "abc",
|
|
})
|
|
const data = yield* auth.all()
|
|
expect(data["https://example.com"]).toBeDefined()
|
|
expect(data["https://example.com/"]).toBeUndefined()
|
|
}),
|
|
),
|
|
)
|
|
|
|
it.live("set cleans up pre-existing trailing-slash entry", () =>
|
|
provideTmpdirInstance(() =>
|
|
Effect.gen(function* () {
|
|
const auth = yield* Auth.Service
|
|
yield* auth.set("https://example.com/", {
|
|
type: "wellknown",
|
|
key: "TOKEN",
|
|
token: "old",
|
|
})
|
|
yield* auth.set("https://example.com", {
|
|
type: "wellknown",
|
|
key: "TOKEN",
|
|
token: "new",
|
|
})
|
|
const data = yield* auth.all()
|
|
const keys = Object.keys(data).filter((key) => key.includes("example.com"))
|
|
expect(keys).toEqual(["https://example.com"])
|
|
const entry = data["https://example.com"]!
|
|
expect(entry.type).toBe("wellknown")
|
|
if (entry.type === "wellknown") expect(entry.token).toBe("new")
|
|
}),
|
|
),
|
|
)
|
|
|
|
it.live("remove deletes both trailing-slash and normalized keys", () =>
|
|
provideTmpdirInstance(() =>
|
|
Effect.gen(function* () {
|
|
const auth = yield* Auth.Service
|
|
yield* auth.set("https://example.com", {
|
|
type: "wellknown",
|
|
key: "TOKEN",
|
|
token: "abc",
|
|
})
|
|
yield* auth.remove("https://example.com/")
|
|
const data = yield* auth.all()
|
|
expect(data["https://example.com"]).toBeUndefined()
|
|
expect(data["https://example.com/"]).toBeUndefined()
|
|
}),
|
|
),
|
|
)
|
|
|
|
it.live("set and remove are no-ops on keys without trailing slashes", () =>
|
|
provideTmpdirInstance(() =>
|
|
Effect.gen(function* () {
|
|
const auth = yield* Auth.Service
|
|
yield* auth.set("anthropic", {
|
|
type: "api",
|
|
key: "sk-test",
|
|
})
|
|
const data = yield* auth.all()
|
|
expect(data["anthropic"]).toBeDefined()
|
|
yield* auth.remove("anthropic")
|
|
const after = yield* auth.all()
|
|
expect(after["anthropic"]).toBeUndefined()
|
|
}),
|
|
),
|
|
)
|
|
})
|