Providing configuration for tests
Hi, I'm using testcontainers to create a minio instance for testing the need to pass the bucket name to the test.
I'm trying to do something like this but it doesn't work
I'm trying to do something like this but it doesn't work
import { S3Client } from "@aws-sdk/client-s3"
import { S3, S3Service } from "@effect-aws/client-s3"
import { MinioContainer } from "@testcontainers/minio"
import * as ConfigProvider from "effect/ConfigProvider"
import * as Effect from "effect/Effect"
import * as Layer from "effect/Layer"
export class FilesContainer extends Effect.Service<FilesContainer>()("FilesContainer", {
scoped: Effect.acquireRelease(
Effect.promise(() => new MinioContainer("minio/minio:latest").withUsername("minioadmin").withPassword("minioadmin").start()),
(container) => Effect.promise(() => container.stop())
),
}) {
static readonly Live = Layer.effectDiscard(
Effect.gen(function* () {
const s3 = yield* S3
yield* s3.createBucket({ Bucket: "test-bucket" })
return Layer.setConfigProvider(ConfigProvider.fromMap(new Map([["AWS_BUCKET_NAME", "test-bucket"]])))
})
).pipe(
Layer.provideMerge(
Layer.unwrapEffect(
Effect.gen(function* () {
const container = yield* FilesContainer
return S3Service.baseLayer(
() =>
new S3Client({
endpoint: container.getConnectionUrl(),
region: "us-east-1",
requestChecksumCalculation: "WHEN_REQUIRED",
responseChecksumValidation: "WHEN_REQUIRED",
forcePathStyle: true,
credentials: {
accessKeyId: container.getUsername(),
secretAccessKey: container.getPassword(),
},
})
)
})
)
),
Layer.provide(FilesContainer.Default),
Layer.orDie
)
}import { S3Client } from "@aws-sdk/client-s3"
import { S3, S3Service } from "@effect-aws/client-s3"
import { MinioContainer } from "@testcontainers/minio"
import * as ConfigProvider from "effect/ConfigProvider"
import * as Effect from "effect/Effect"
import * as Layer from "effect/Layer"
export class FilesContainer extends Effect.Service<FilesContainer>()("FilesContainer", {
scoped: Effect.acquireRelease(
Effect.promise(() => new MinioContainer("minio/minio:latest").withUsername("minioadmin").withPassword("minioadmin").start()),
(container) => Effect.promise(() => container.stop())
),
}) {
static readonly Live = Layer.effectDiscard(
Effect.gen(function* () {
const s3 = yield* S3
yield* s3.createBucket({ Bucket: "test-bucket" })
return Layer.setConfigProvider(ConfigProvider.fromMap(new Map([["AWS_BUCKET_NAME", "test-bucket"]])))
})
).pipe(
Layer.provideMerge(
Layer.unwrapEffect(
Effect.gen(function* () {
const container = yield* FilesContainer
return S3Service.baseLayer(
() =>
new S3Client({
endpoint: container.getConnectionUrl(),
region: "us-east-1",
requestChecksumCalculation: "WHEN_REQUIRED",
responseChecksumValidation: "WHEN_REQUIRED",
forcePathStyle: true,
credentials: {
accessKeyId: container.getUsername(),
secretAccessKey: container.getPassword(),
},
})
)
})
)
),
Layer.provide(FilesContainer.Default),
Layer.orDie
)
}