feat(learner): package scaffold, auth tables migration, migrations runner
Co-Authored-By: Claude Opus 5.5 <[email protected]>
This commit is contained in:
co-authored by
Claude Opus 5.5
parent
0b117159cd
commit
5a215744e5
@@ -0,0 +1,35 @@
|
||||
import { test } from "bun:test";
|
||||
import { connect, migrate, type Db } from "@stc/db";
|
||||
import { runMigrations } from "../src/server/migrate";
|
||||
|
||||
const PG = process.env.STC_TEST_PG_URL;
|
||||
|
||||
/** Fresh migrated in-memory SQLite (and a fresh Postgres schema when STC_TEST_PG_URL is set), with learner migrations applied. */
|
||||
export function forEachDb(name: string, fn: (db: Db) => Promise<void>, timeout?: number): void {
|
||||
test(`${name} [sqlite]`, async () => {
|
||||
const db = await connect("sqlite://:memory:");
|
||||
try { await migrate(db); await runMigrations(db); await fn(db); } finally { await db.close(); }
|
||||
}, timeout);
|
||||
if (!PG) return;
|
||||
test(`${name} [postgres]`, async () => {
|
||||
const { db, drop } = await pgSchemaDb();
|
||||
try { await migrate(db); await runMigrations(db); await fn(db); } finally { await drop(); }
|
||||
}, timeout);
|
||||
}
|
||||
|
||||
export async function pgSchemaDb(): Promise<{ db: Db; drop(): Promise<void> }> {
|
||||
const schema = `t_${Bun.randomUUIDv7().replaceAll("-", "")}`;
|
||||
const admin = await connect(PG!);
|
||||
await admin.sql.unsafe(`CREATE SCHEMA ${schema}`);
|
||||
const u = new URL(PG!);
|
||||
u.searchParams.set("options", `-c search_path=${schema}`);
|
||||
const db = await connect(u.toString());
|
||||
return {
|
||||
db,
|
||||
async drop() {
|
||||
await db.close();
|
||||
await admin.sql.unsafe(`DROP SCHEMA ${schema} CASCADE`);
|
||||
await admin.close();
|
||||
},
|
||||
};
|
||||
}
|
||||
@@ -0,0 +1,13 @@
|
||||
import { expect } from "bun:test";
|
||||
import { runMigrations } from "../src/server/migrate";
|
||||
import { forEachDb } from "./helpers";
|
||||
|
||||
forEachDb("learner migrations create the auth tables and are idempotent", async (db) => {
|
||||
for (const t of ["auth_user", "auth_session", "auth_account", "auth_verification", "auth_sso_provider", "learner_meta", "learner_group_claims"]) {
|
||||
const rows = await db.sql.unsafe(`SELECT COUNT(*) AS n FROM ${t}`);
|
||||
expect(Number(rows[0].n)).toBe(0);
|
||||
}
|
||||
expect(await runMigrations(db)).toEqual([]);
|
||||
const names = (await db.sql`SELECT name FROM schema_migrations`).map((r: { name: string }) => r.name);
|
||||
expect(names).toContain("0001_learner_auth.sql");
|
||||
});
|
||||
Reference in New Issue
Block a user