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

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
  )
}
Was this page helpful?