import { NodeFileSystem } from "@effect/platform-node" import { SqliteClient } from "@effect/sql-sqlite-node" import { assert, describe, it } from "@effect/vitest" import { Effect, FileSystem } from "effect" import { Reactivity } from "effect/unstable/reactivity" const makeClient = Effect.gen(function*() { const fs = yield* FileSystem.FileSystem const dir = yield* fs.makeTempDirectoryScoped() return yield* SqliteClient.make({ filename: dir + "/test.db" }) }).pipe(Effect.provide([NodeFileSystem.layer, Reactivity.layer])) describe("Client", () => { it.effect("should work", () => Effect.gen(function*() { const sql = yield* makeClient let response response = yield* sql`CREATE TABLE test (id INTEGER PRIMARY KEY, name TEXT)` assert.deepStrictEqual(response, []) response = yield* sql`INSERT INTO test (name) VALUES ('hello')` assert.deepStrictEqual(response, []) response = yield* sql`SELECT * FROM test` assert.deepStrictEqual(response, [{ id: 1, name: "hello" }]) response = yield* sql`SELECT * FROM test`.valuesUnprepared assert.deepStrictEqual(response, [[1, "hello"]]) response = yield* sql`INSERT INTO test (name) VALUES ('world')`.pipe(sql.withTransaction) assert.deepStrictEqual(response, []) response = yield* sql`SELECT * FROM test` assert.deepStrictEqual(response, [ { id: 1, name: "hello" }, { id: 2, name: "world" } ]) })) it.effect("should work with raw", () => Effect.gen(function*() { const sql = yield* makeClient let response response = yield* sql`CREATE TABLE test (id INTEGER PRIMARY KEY, name TEXT)`.raw assert.deepStrictEqual(response, { changes: 0, lastInsertRowid: 0 }) response = yield* sql`INSERT INTO test (name) VALUES ('hello')`.raw assert.deepStrictEqual(response, { changes: 1, lastInsertRowid: 1 }) response = yield* sql`SELECT * FROM test`.raw assert.deepStrictEqual(response, [{ id: 1, name: "hello" }]) response = yield* sql`INSERT INTO test (name) VALUES ('world')`.raw.pipe(sql.withTransaction) assert.deepStrictEqual(response, { changes: 1, lastInsertRowid: 2 }) response = yield* sql`SELECT * FROM test` assert.deepStrictEqual(response, [ { id: 1, name: "hello" }, { id: 2, name: "world" } ]) })) it.effect("withTransaction", () => Effect.gen(function*() { const sql = yield* makeClient yield* sql`CREATE TABLE test (id INTEGER PRIMARY KEY, name TEXT)` yield* sql.withTransaction(sql`INSERT INTO test (name) VALUES ('hello')`) const rows = yield* sql`SELECT * FROM test` assert.deepStrictEqual(rows, [{ id: 1, name: "hello" }]) })) it.effect("withTransaction rollback", () => Effect.gen(function*() { const sql = yield* makeClient yield* sql`CREATE TABLE test (id INTEGER PRIMARY KEY, name TEXT)` yield* sql`INSERT INTO test (name) VALUES ('hello')`.pipe( Effect.andThen(Effect.fail("boom")), sql.withTransaction, Effect.ignore ) const rows = yield* sql`SELECT * FROM test` assert.deepStrictEqual(rows, []) })) it.effect("supports backup and export", () => Effect.gen(function*() { const sql = yield* makeClient yield* sql`CREATE TABLE test (id INTEGER PRIMARY KEY, name TEXT)` yield* sql`INSERT INTO test (name) VALUES ('hello')` const metadata = yield* sql.backup(sql.config.filename + ".backup") assert(metadata.totalPages > 0) assert.strictEqual(metadata.remainingPages, 0) })) })