feat: integrate bounded external auth sessions

This commit is contained in:
donghyeon-ka
2026-07-25 20:54:18 +09:00
parent 37ca2c3172
commit 44414c5244
4 changed files with 197 additions and 0 deletions
+44
View File
@@ -0,0 +1,44 @@
import { describe, expect, it, vi } from "vitest";
import {
createAnonymousSessionAdapter,
createExternalAuthSessionAdapter,
} from "../../src/adapters/auth/external-session-adapter.js";
describe("external AuthSessionPort adapter", () => {
it("attaches opaque credentials without exposing a token-shaped session", async () => {
const adapter = createExternalAuthSessionAdapter({
readState: () => "authenticated",
attachCredential: async (request) => {
const headers = new Headers(request.headers);
headers.set("X-Session-Attached", "true");
return new Request(request, { headers });
},
recoverSession: async () => "restored",
notifyUnauthenticated: vi.fn(),
});
const request = await adapter.attach(new Request("https://api.test/resource"));
expect(request.headers.get("X-Session-Attached")).toBe("true");
expect(adapter.getState()).toBe("authenticated");
expect(adapter).not.toHaveProperty("accessToken");
expect(adapter).not.toHaveProperty("refreshToken");
});
it("fails invalid recovery states closed", async () => {
const adapter = createExternalAuthSessionAdapter({
readState: () => "authenticated",
attachCredential: async (request) => request,
recoverSession: async () => "unexpected",
notifyUnauthenticated: vi.fn(),
});
await expect(adapter.recover()).rejects.toThrow("invalid recovery state");
});
it("provides a safe anonymous adapter", async () => {
const adapter = createAnonymousSessionAdapter();
expect(adapter.getState()).toBe("unauthenticated");
await expect(adapter.recover()).resolves.toBe("no-session");
});
});