56 lines · 1.9 KB · TypeScript
RawDownload
import { assert, it } from "@effect/vitest";import * as Effect from "effect/Effect";import * as Layer from "effect/Layer";import * as SqlClient from "effect/unstable/sql/SqlClient"; import * as SqliteClient from "./nodeSqliteClient.ts"; const layer = it.layer(SqliteClient.layerMemory()); layer("NodeSqliteClient", (it) => {  it.effect("runs prepared queries and returns positional values", () =>    Effect.gen(function* () {      const sql = yield* SqlClient.SqlClient;       yield* sql`CREATE TABLE entries(id INTEGER PRIMARY KEY, name TEXT NOT NULL)`;      yield* sql`INSERT INTO entries(name) VALUES (${"alpha"}), (${"beta"})`;       const rows = yield* sql<{ readonly id: number; readonly name: string }>`      SELECT id, name FROM entries ORDER BY id    `;      assert.equal(rows.length, 2);      assert.equal(rows[0]?.name, "alpha");      assert.equal(rows[1]?.name, "beta");       const values = yield* sql`SELECT id, name FROM entries ORDER BY id`.values;      assert.equal(values.length, 2);      assert.equal(values[0]?.[1], "alpha");      assert.equal(values[1]?.[1], "beta");       const unpreparedValues = yield* sql`SELECT id, name FROM entries ORDER BY id`        .valuesUnprepared;      assert.deepEqual(unpreparedValues, values);    }),  );   it.effect("returns a typed failure when an unprepared statement cannot be prepared", () =>    Effect.gen(function* () {      const sql = yield* SqlClient.SqlClient;      const error = yield* Effect.flip(sql.unsafe("SELECT FROM").unprepared);       assert.equal(error._tag, "SqlError");      assert.equal(error.reason.operation, "prepare");    }),  );}); it.effect("returns a typed failure when the database cannot be opened", () =>  Effect.gen(function* () {    const error = yield* Effect.flip(      Layer.build(SqliteClient.layer({ filename: "\0" })).pipe(Effect.scoped),    );     assert.equal(error._tag, "SqlError");    assert.equal(error.reason.operation, "open");  }),);