Skip to content
Source
Sign inSign up
Open History to see the last commit

Client.integration.test.ts

61 lines2.5 KB

1import { assert, describe, it } from "@effect/vitest"
2import { Effect, Layer, Logger } from "effect"
3import { SqlClient, Statement } from "effect/sql"
4import { MysqlContainer } from "./utils.ts"
5​
6const SqlLogger = Layer.succeed(Statement.CurrentTransformer)((statement) => {
7 const [query, params] = statement.compile()
8 return Effect.log("executing sql").pipe(
9 Effect.annotateLogs({ query, params }),
10 Effect.as(statement)
11 )
12})
13​
14describe("sql", () => {
15 it.effect("releases completed nested savepoints", () =>
16 Effect.gen(function*() {
17 const sql = yield* SqlClient.SqlClient
18 yield* sql`CREATE TABLE savepoint_release (value INTEGER)`
19 yield* sql.withTransaction(Effect.gen(function*() {
20 for (const rollback of [false, true]) {
21 yield* sql.withTransaction(
22 sql`INSERT INTO savepoint_release VALUES (1)`.pipe(
23 Effect.andThen(rollback ? Effect.fail("rollback") : Effect.void)
24 )
25 ).pipe(Effect.ignore)
26 const error = yield* sql`RELEASE SAVEPOINT effect_sql_1`.unprepared.pipe(Effect.flip)
27 assert.strictEqual(error._tag, "SqlError")
28 }
29 }))
30 assert.deepStrictEqual(yield* sql`SELECT value FROM savepoint_release`, [{ value: 1 }])
31 }).pipe(Effect.provide(MysqlContainer.layerClient)), { timeout: 60_000 })
32​
33 it.effect("in helper with an empty list", () =>
34 Effect.gen(function*() {
35 const sql = yield* SqlClient.SqlClient
36 yield* sql`CREATE TABLE empty_in (id INTEGER)`
37 yield* sql`INSERT INTO empty_in VALUES (1)`
38 assert.deepStrictEqual(yield* sql`SELECT id FROM empty_in WHERE id IN ${sql.in([])}`, [])
39 assert.deepStrictEqual(yield* sql`SELECT id FROM empty_in WHERE id NOT IN ${sql.in([])}`, [{ id: 1 }])
40 }).pipe(Effect.provide(MysqlContainer.layerClient)), { timeout: 60_000 })
41​
42 it.effect("tranformers", () =>
43 Effect.gen(function*() {
44 const logs: Array<unknown> = []
45 const sql = yield* SqlClient.SqlClient
46 const result = yield* sql<{ result: number }>`SELECT 1 + 1 AS result`.pipe(
47 Effect.provide(Logger.layer([
48 Logger.make((log) => {
49 logs.push(log.message)
50 })
51 ]))
52 )
53 assert.deepStrictEqual(result, [{ result: 2 }])
54 assert.deepStrictEqual(logs, [["executing sql"]])
55 }).pipe(
56 Effect.provide(MysqlContainer.layerClient.pipe(
57 Layer.provideMerge(SqlLogger)
58 )),
59 Effect.catchTag("ContainerError", () => Effect.void)
60 ), { timeout: 60_000 })
61})