import { assert, it } from "@effect/vitest"; import * as Effect from "effect/Effect"; import * as Layer from "effect/Layer"; import * as SqlClient from "effect/unstable/sql/SqlClient"; import { runMigrations } from "../Migrations.ts"; import * as NodeSqliteClient from "@t3tools/shared/nodeSqliteClient"; const layer = it.layer(Layer.mergeAll(NodeSqliteClient.layerMemory())); layer("031_AuthAuthorizationScopes", (it) => { it.effect("invalidates role-based auth records and installs scoped auth tables", () => Effect.gen(function* () { const sql = yield* SqlClient.SqlClient; yield* runMigrations({ toMigrationInclusive: 30 }); yield* sql` INSERT INTO auth_pairing_links ( id, credential, method, role, subject, created_at, expires_at ) VALUES ( 'link-owner', 'bootstrap-owner', 'desktop-bootstrap', 'owner', 'desktop', '2026-05-29T00:00:00.000Z', '2026-05-29T01:00:00.000Z' ) `; yield* sql` INSERT INTO auth_sessions ( session_id, subject, role, method, issued_at, expires_at ) VALUES ( 'session-owner', 'desktop', 'owner', 'browser-session-cookie', '2026-05-29T00:00:00.000Z', '2026-05-29T01:00:00.000Z' ) `; yield* runMigrations({ toMigrationInclusive: 31 }); const pairingColumns = yield* sql<{ readonly name: string }>` PRAGMA table_info(auth_pairing_links) `; const sessionColumns = yield* sql<{ readonly name: string }>` PRAGMA table_info(auth_sessions) `; const pairingRows = yield* sql<{ readonly id: string }>` SELECT id FROM auth_pairing_links `; const sessionRows = yield* sql<{ readonly sessionId: string }>` SELECT session_id AS "sessionId" FROM auth_sessions `; assert.isTrue(pairingColumns.some((column) => column.name === "scopes")); assert.isFalse(pairingColumns.some((column) => column.name === "role")); assert.isTrue(sessionColumns.some((column) => column.name === "scopes")); assert.isFalse(sessionColumns.some((column) => column.name === "role")); assert.deepStrictEqual(pairingRows, []); assert.deepStrictEqual(sessionRows, []); }), ); });