169 lines
5.3 KiB
TypeScript
169 lines
5.3 KiB
TypeScript
import { assert, describe, it } from "@effect/vitest"
|
|
import * as Cause from "effect/Cause"
|
|
import * as Effect from "effect/Effect"
|
|
import * as Option from "effect/Option"
|
|
import * as Schema from "effect/Schema"
|
|
import * as SqlSchema from "effect/unstable/sql/SqlSchema"
|
|
|
|
describe("SqlSchema", () => {
|
|
describe("findAll", () => {
|
|
it.effect("returns decoded results", () =>
|
|
Effect.gen(function*() {
|
|
const query = SqlSchema.findAll({
|
|
Request: Schema.NumberFromString,
|
|
Result: Schema.Struct({ value: Schema.String }),
|
|
execute: (request) => Effect.succeed([{ value: `id:${request}` }])
|
|
})
|
|
|
|
const result = yield* query(1)
|
|
assert.deepStrictEqual(result, [{ value: "id:1" }])
|
|
}))
|
|
|
|
it.effect("returns empty array when no rows", () =>
|
|
Effect.gen(function*() {
|
|
const query = SqlSchema.findAll({
|
|
Request: Schema.String,
|
|
Result: Schema.String,
|
|
execute: () => Effect.succeed([])
|
|
})
|
|
|
|
const result = yield* query("test")
|
|
assert.deepStrictEqual(result, [])
|
|
}))
|
|
|
|
it.effect("fails when a row cannot be decoded", () =>
|
|
Effect.gen(function*() {
|
|
const query = SqlSchema.findAll({
|
|
Request: Schema.String,
|
|
Result: Schema.Struct({ id: Schema.Number }),
|
|
execute: () => Effect.succeed([{ id: "not-a-number" }])
|
|
})
|
|
|
|
const error = yield* Effect.flip(query("ignored"))
|
|
assert.isTrue(Schema.isSchemaError(error))
|
|
}))
|
|
})
|
|
|
|
describe("findNonEmpty", () => {
|
|
it.effect("returns non-empty decoded results", () =>
|
|
Effect.gen(function*() {
|
|
const query = SqlSchema.findNonEmpty({
|
|
Request: Schema.NumberFromString,
|
|
Result: Schema.Struct({ value: Schema.String }),
|
|
execute: (request) => Effect.succeed([{ value: `id:${request}` }])
|
|
})
|
|
|
|
const result = yield* query(1)
|
|
assert.deepStrictEqual(result, [{ value: "id:1" }])
|
|
}))
|
|
|
|
it.effect("fails with NoSuchElementError when no rows", () =>
|
|
Effect.gen(function*() {
|
|
const query = SqlSchema.findNonEmpty({
|
|
Request: Schema.String,
|
|
Result: Schema.String,
|
|
execute: () => Effect.succeed([])
|
|
})
|
|
|
|
const error = yield* Effect.flip(query("test"))
|
|
assert.isTrue(Cause.isNoSuchElementError(error))
|
|
}))
|
|
})
|
|
|
|
describe("void", () => {
|
|
it.effect("encodes request and discards result", () =>
|
|
Effect.gen(function*() {
|
|
let captured: string | undefined
|
|
const query = SqlSchema.void({
|
|
Request: Schema.NumberFromString,
|
|
execute: (request) => {
|
|
captured = request
|
|
return Effect.succeed(undefined)
|
|
}
|
|
})
|
|
|
|
yield* query(42)
|
|
assert.strictEqual(captured, "42")
|
|
}))
|
|
})
|
|
|
|
describe("findOne", () => {
|
|
it.effect("returns the first decoded row", () =>
|
|
Effect.gen(function*() {
|
|
const query = SqlSchema.findOne({
|
|
Request: Schema.String,
|
|
Result: Schema.NumberFromString,
|
|
execute: () => Effect.succeed(["1", "2"])
|
|
})
|
|
|
|
const result = yield* query("ignored")
|
|
assert.strictEqual(result, 1)
|
|
}))
|
|
|
|
it.effect("fails with NoSuchElementError when no rows are returned", () =>
|
|
Effect.gen(function*() {
|
|
const query = SqlSchema.findOne({
|
|
Request: Schema.String,
|
|
Result: Schema.String,
|
|
execute: () => Effect.succeed([])
|
|
})
|
|
|
|
const error = yield* Effect.flip(query("ignored"))
|
|
assert.isTrue(Cause.isNoSuchElementError(error))
|
|
}))
|
|
|
|
it.effect("fails when the first row cannot be decoded", () =>
|
|
Effect.gen(function*() {
|
|
const query = SqlSchema.findOne({
|
|
Request: Schema.String,
|
|
Result: Schema.Struct({ id: Schema.Number }),
|
|
execute: () => Effect.succeed([{ id: "not-a-number" }])
|
|
})
|
|
|
|
const error = yield* Effect.flip(query("ignored"))
|
|
assert.isTrue(Schema.isSchemaError(error))
|
|
}))
|
|
})
|
|
|
|
describe("findOneOption", () => {
|
|
it.effect("returns Option.some when a row exists", () =>
|
|
Effect.gen(function*() {
|
|
const query = SqlSchema.findOneOption({
|
|
Request: Schema.NumberFromString,
|
|
Result: Schema.Struct({ value: Schema.String }),
|
|
execute: (request) => Effect.succeed([{ value: `id:${request}` }])
|
|
})
|
|
|
|
const result = yield* query(1)
|
|
assert.isTrue(Option.isSome(result))
|
|
if (Option.isSome(result)) {
|
|
assert.deepStrictEqual(result.value, { value: "id:1" })
|
|
}
|
|
}))
|
|
|
|
it.effect("returns Option.none when no rows are returned", () =>
|
|
Effect.gen(function*() {
|
|
const query = SqlSchema.findOneOption({
|
|
Request: Schema.NumberFromString,
|
|
Result: Schema.String,
|
|
execute: () => Effect.succeed([])
|
|
})
|
|
|
|
const result = yield* query(1)
|
|
assert.isTrue(Option.isNone(result))
|
|
}))
|
|
|
|
it.effect("fails when the first row cannot be decoded", () =>
|
|
Effect.gen(function*() {
|
|
const query = SqlSchema.findOneOption({
|
|
Request: Schema.String,
|
|
Result: Schema.Struct({ id: Schema.Number }),
|
|
execute: () => Effect.succeed([{ id: "not-a-number" }])
|
|
})
|
|
|
|
const error = yield* Effect.flip(query("ignored"))
|
|
assert.isTrue(Schema.isSchemaError(error))
|
|
}))
|
|
})
|
|
})
|