128 lines · 4.9 KB · TypeScript
RawDownload
import * as NodeServices from "@effect/platform-node/NodeServices";import { expect, it } from "@effect/vitest";import * as Effect from "effect/Effect";import * as Layer from "effect/Layer"; import * as ServerConfig from "../config.ts";import { SqlitePersistenceMemory } from "../persistence/Layers/Sqlite.ts";import * as EnvironmentAuth from "./EnvironmentAuth.ts";import * as ServerSecretStore from "./ServerSecretStore.ts";import * as SessionStore from "./SessionStore.ts"; const makeServerConfigLayer = (  overrides?: Partial<Pick<ServerConfig.ServerConfig["Service"], "desktopBootstrapToken">>,) =>  Layer.effect(    ServerConfig.ServerConfig,    Effect.gen(function* () {      const config = yield* ServerConfig.ServerConfig;      return {        ...config,        ...overrides,      } satisfies ServerConfig.ServerConfig["Service"];    }),  ).pipe(    Layer.provide(      ServerConfig.layerTest(process.cwd(), {        prefix: "t3-auth-control-plane-test-",      }),    ),  ); const makeEnvironmentAuthLayer = (  overrides?: Partial<Pick<ServerConfig.ServerConfig["Service"], "desktopBootstrapToken">>,) =>  EnvironmentAuth.layer.pipe(    Layer.provideMerge(ServerSecretStore.layer),    Layer.provideMerge(SqlitePersistenceMemory),    Layer.provide(makeServerConfigLayer(overrides)),  ); it.layer(NodeServices.layer)("EnvironmentAuth administrative operations", (it) => {  it.effect("creates, lists, and revokes client pairing links", () =>    Effect.gen(function* () {      const environmentAuth = yield* EnvironmentAuth.EnvironmentAuth;       const created = yield* environmentAuth.createPairingLink({        scopes: ["orchestration:read"],        subject: "one-time-token",        label: "CI phone",      });      const listedBeforeRevoke = yield* environmentAuth.listPairingLinks();      const revoked = yield* environmentAuth.revokePairingLink(created.id);      const listedAfterRevoke = yield* environmentAuth.listPairingLinks();       expect(created.scopes).toEqual(["orchestration:read"]);      expect(created.credential.length).toBeGreaterThan(0);      expect(listedBeforeRevoke).toHaveLength(1);      expect(listedBeforeRevoke[0]?.id).toBe(created.id);      expect(listedBeforeRevoke[0]?.label).toBe("CI phone");      expect(listedBeforeRevoke[0]?.credential).toBe(created.credential);      expect(revoked).toBe(true);      expect(listedAfterRevoke).toHaveLength(0);    }).pipe(Effect.provide(makeEnvironmentAuthLayer())),  );   it.effect("issues bearer access token sessions without exposing raw tokens", () =>    Effect.gen(function* () {      const environmentAuth = yield* EnvironmentAuth.EnvironmentAuth;      const sessionCredentials = yield* SessionStore.SessionStore;       const issued = yield* environmentAuth.issueSession({        label: "deploy-bot",      });      const verified = yield* sessionCredentials.verify(issued.token);      const listedBeforeRevoke = yield* environmentAuth.listSessions();      const revoked = yield* environmentAuth.revokeSession(issued.sessionId);      const listedAfterRevoke = yield* environmentAuth.listSessions();       expect(issued.method).toBe("bearer-access-token");      expect(issued.scopes).toEqual([        "orchestration:read",        "orchestration:operate",        "terminal:operate",        "review:write",        "relay:read",        "access:read",        "access:write",        "relay:write",      ]);      expect(issued.client.deviceType).toBe("bot");      expect(issued.client.label).toBe("deploy-bot");      expect(verified.sessionId).toBe(issued.sessionId);      expect(verified.scopes).toEqual([        "orchestration:read",        "orchestration:operate",        "terminal:operate",        "review:write",        "relay:read",        "access:read",        "access:write",        "relay:write",      ]);      expect(verified.method).toBe("bearer-access-token");      expect(listedBeforeRevoke).toHaveLength(1);      expect(listedBeforeRevoke[0]?.sessionId).toBe(issued.sessionId);      expect("token" in (listedBeforeRevoke[0] ?? {})).toBe(false);      expect(revoked).toBe(true);      expect(listedAfterRevoke).toHaveLength(0);    }).pipe(Effect.provide(makeEnvironmentAuthLayer())),  );   it.effect("surfaces lastConnectedAt through the listed session view", () =>    Effect.gen(function* () {      const environmentAuth = yield* EnvironmentAuth.EnvironmentAuth;      const sessionCredentials = yield* SessionStore.SessionStore;       const issued = yield* environmentAuth.issueSession({        label: "remote-ipad",      });      const beforeConnect = yield* environmentAuth.listSessions();      yield* sessionCredentials.markConnected(issued.sessionId);      const afterConnect = yield* environmentAuth.listSessions();       expect(beforeConnect[0]?.lastConnectedAt).toBeNull();      expect(afterConnect[0]?.lastConnectedAt).not.toBeNull();    }).pipe(Effect.provide(makeEnvironmentAuthLayer())),  );});