| 1 | import { MssqlClient } from "@effect/sql-mssql" |
| 2 | import { assert, it } from "@effect/vitest" |
| 3 | import { Effect } from "effect" |
| 4 | import * as Reactivity from "effect/reactivity/Reactivity" |
| 5 | import type * as Tedious from "tedious" |
| 6 | import { vi } from "vitest" |
| 7 | |
| 8 | vi.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 | |
| 33 | it.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))) |