| 1 | import { MssqlClient } from "@effect/sql-mssql" |
| 2 | import { MSSQLServerContainer } from "@testcontainers/mssqlserver" |
| 3 | import { Context, Data, Effect, Layer, Redacted } from "effect" |
| 4 | |
| 5 | export class ContainerError extends Data.TaggedError("ContainerError")<{ |
| 6 | cause: unknown |
| 7 | }> {} |
| 8 | |
| 9 | export class MssqlContainer extends Context.Service<MssqlContainer>()("test/MssqlContainer", { |
| 10 | make: Effect.acquireRelease( |
| 11 | Effect.tryPromise({ |
| 12 | try: () => |
| 13 | new MSSQLServerContainer("mcr.microsoft.com/mssql/server:2022-latest") |
| 14 | .acceptLicense() |
| 15 | .start(), |
| 16 | catch: (cause) => new ContainerError({ cause }) |
| 17 | }), |
| 18 | (container) => Effect.promise(() => container.stop()) |
| 19 | ) |
| 20 | }) { |
| 21 | static readonly layer = Layer.effect(this)(this.make) |
| 22 | |
| 23 | static layerClient = Layer.unwrap( |
| 24 | Effect.gen(function*() { |
| 25 | const container = yield* MssqlContainer |
| 26 | return MssqlClient.layer({ |
| 27 | server: container.getHost(), |
| 28 | port: container.getPort(), |
| 29 | database: container.getDatabase(), |
| 30 | username: container.getUsername(), |
| 31 | password: Redacted.make(container.getPassword()), |
| 32 | trustServer: true |
| 33 | }) |
| 34 | }) |
| 35 | ).pipe(Layer.provide(this.layer)) |
| 36 | } |