1import { PgliteClient } from "@effect/sql-pglite"
2import { assert, describe, layer } from "@effect/vitest"
3import { Effect } from "effect"
4import { PersistedQueue } from "effect/persistence"
5import { SqlClient } from "effect/sql"
6
7const ClientLayer = PgliteClient.layer({})
8
9describe("PersistedQueue SQL migrations", () => {
10 layer(ClientLayer, { timeout: "30 seconds" })((it) => {
11 it.effect("runs fresh-install migrations once", () =>
12 Effect.gen(function*() {
13 const sql = (yield* SqlClient.SqlClient).withoutTransforms()
14 const tableName = "persisted_queue_migration_test"
15
16 yield* PersistedQueue.makeStoreSql({ tableName })
17 yield* PersistedQueue.makeStoreSql({ tableName })
18
19 const migrations = yield* sql<{
20 readonly migration_id: number
21 readonly name: string
22 }>`SELECT migration_id, name FROM ${sql(`${tableName}_migrations`)} ORDER BY migration_id`
23 assert.deepStrictEqual(migrations, [
24 { migration_id: 1, name: "create_table" },
25 { migration_id: 2, name: "upgrade_schema" }
26 ])
27
28 const indexes = yield* sql<{ readonly indexname: string }>`
29 SELECT indexname FROM pg_indexes
30 WHERE tablename = ${tableName}
31 ORDER BY indexname
32 `
33 assert.deepStrictEqual(indexes.map((row) => row.indexname), [
34 `idx_${tableName}_id`,
35 `idx_${tableName}_take`,
36 `idx_${tableName}_update`,
37 `${tableName}_pkey`
38 ])
39 }))
40 })
41})