1import { MssqlClient } from "@effect/sql-mssql"
2import { assert, it } from "@effect/vitest"
3import { Effect } from "effect"
4import * as Reactivity from "effect/reactivity/Reactivity"
5import type * as Tedious from "tedious"
6import { vi } from "vitest"
7
8vi.mock("tedious", async (importOriginal) => {
9 const original = await importOriginal<typeof Tedious>()
10
11 class MockConnection extends original.Connection {
12 override connect(callback?: (error?: Error) => void) {
13 callback?.()
14 }
15 override close() {}
16 override cancel() {
17 return false
18 }
19 override makeRequest(request: Tedious.Request | Tedious.BulkLoad) {
20 if (!(request instanceof original.Request)) {
21 throw new Error("Unexpected bulk load")
22 }
23 const rows = request.parameters.map((parameter) => [
24 { metadata: { colName: "value" }, value: parameter.value }
25 ])
26 request.callback(null, rows.length, rows)
27 }
28 }
29
30 return { ...original, Connection: MockConnection }
31})
32
33it.effect("binds an interpolated Uint8Array as VarBinary", () =>
34 Effect.gen(function*() {
35 const client = yield* MssqlClient.make({
36 server: "mock.invalid",
37 minConnections: 0,
38 maxConnections: 1
39 })
40 const rows = yield* client<{ value: Uint8Array }>`SELECT ${new Uint8Array([0, 128, 255])} AS value`
41
42 assert.deepStrictEqual(Array.from(rows[0].value), [0, 128, 255])
43 }).pipe(Effect.provide(Reactivity.layer)))