46 lines
1.5 KiB
TypeScript
46 lines
1.5 KiB
TypeScript
import { PgliteClient, PgliteMigrator } from "@effect/sql-pglite"
|
|
import { assert, describe, layer } from "@effect/vitest"
|
|
import { Effect, Layer } from "effect"
|
|
import { SqlClient } from "effect/unstable/sql/SqlClient"
|
|
|
|
const ClientLayer = PgliteClient.layer({})
|
|
|
|
const loader = Effect.succeed([
|
|
[
|
|
1,
|
|
"init",
|
|
Effect.succeed(Effect.gen(function*() {
|
|
const sql = yield* SqlClient
|
|
yield* sql`CREATE TABLE migrator_test (id SERIAL PRIMARY KEY, value TEXT)`
|
|
}))
|
|
] as const,
|
|
[
|
|
2,
|
|
"insert",
|
|
Effect.succeed(Effect.gen(function*() {
|
|
const sql = yield* SqlClient
|
|
yield* sql`INSERT INTO migrator_test (value) VALUES ('hello')`
|
|
}))
|
|
] as const
|
|
])
|
|
|
|
const MigratorLayer = PgliteMigrator.layer({ loader }).pipe(Layer.provide(ClientLayer))
|
|
|
|
describe("PgliteMigrator", () => {
|
|
layer(Layer.merge(ClientLayer, MigratorLayer), { timeout: "30 seconds" })((it) => {
|
|
it.effect("runs migrations and records them", () =>
|
|
Effect.gen(function*() {
|
|
const sql = yield* PgliteClient.PgliteClient
|
|
const rows = yield* sql<{ value: string }>`SELECT value FROM migrator_test`
|
|
assert.deepStrictEqual(rows, [{ value: "hello" }])
|
|
const migrations = yield* sql<
|
|
{ migration_id: number; name: string }
|
|
>`SELECT migration_id, name FROM effect_sql_migrations ORDER BY migration_id`
|
|
assert.deepStrictEqual(
|
|
migrations.map((m) => [m.migration_id, m.name]),
|
|
[[1, "init"], [2, "insert"]]
|
|
)
|
|
}))
|
|
})
|
|
})
|