73 lines
2.2 KiB
TypeScript
73 lines
2.2 KiB
TypeScript
import { afterEach, describe, expect, test } from "bun:test"
|
|
import { Effect, ManagedRuntime } from "effect"
|
|
import { Database } from "@/storage/db"
|
|
import { DatabaseEffect } from "@/storage/db-effect"
|
|
import { resetDatabase } from "../fixture/db"
|
|
|
|
afterEach(async () => {
|
|
await resetDatabase()
|
|
})
|
|
|
|
describe("DatabaseEffect.layer", () => {
|
|
test("yields a working Service that round-trips a query", async () => {
|
|
const rt = ManagedRuntime.make(DatabaseEffect.layer)
|
|
try {
|
|
const value = await rt.runPromise(
|
|
Effect.gen(function* () {
|
|
const db = yield* DatabaseEffect.Service
|
|
return db.$client.prepare("SELECT 42 as n").get() as { n: number }
|
|
}),
|
|
)
|
|
expect(value).toEqual({ n: 42 })
|
|
} finally {
|
|
await rt.dispose()
|
|
}
|
|
})
|
|
|
|
test("service resolves a fresh handle after Database.close", async () => {
|
|
const rt = ManagedRuntime.make(DatabaseEffect.layer)
|
|
const first = await rt.runPromise(Effect.sync(() => Database.Client().$client))
|
|
expect(first.prepare("SELECT 1 as n").get()).toEqual({ n: 1 })
|
|
|
|
Database.close()
|
|
|
|
try {
|
|
const second = await rt.runPromise(
|
|
Effect.gen(function* () {
|
|
const db = yield* DatabaseEffect.Service
|
|
return db.$client
|
|
}),
|
|
)
|
|
expect(second).not.toBe(first)
|
|
expect(second.prepare("SELECT 1 as n").get()).toEqual({ n: 1 })
|
|
} finally {
|
|
await rt.dispose()
|
|
}
|
|
})
|
|
|
|
test("a runtime kept alive over Database.close uses the refreshed handle", async () => {
|
|
const rt = ManagedRuntime.make(DatabaseEffect.layer)
|
|
const captured = await rt.runPromise(
|
|
Effect.gen(function* () {
|
|
const db = yield* DatabaseEffect.Service
|
|
return db.$client
|
|
}),
|
|
)
|
|
expect(captured.prepare("SELECT 1 as n").get()).toEqual({ n: 1 })
|
|
|
|
Database.close()
|
|
|
|
try {
|
|
const fresh = await rt.runPromise(
|
|
Effect.gen(function* () {
|
|
const db = yield* DatabaseEffect.Service
|
|
return db.$client
|
|
}),
|
|
)
|
|
expect(fresh).not.toBe(captured)
|
|
expect(fresh.prepare("SELECT 1 as n").get()).toEqual({ n: 1 })
|
|
} finally {
|
|
await rt.dispose()
|
|
}
|
|
})
|
|
})
|