diff --git a/__tests__/elasticsearch/elastic-search-extension.t.ts b/__tests__/elasticsearch/elastic-search-extension.t.ts index ee20da6..b549734 100644 --- a/__tests__/elasticsearch/elastic-search-extension.t.ts +++ b/__tests__/elasticsearch/elastic-search-extension.t.ts @@ -1,5 +1,5 @@ -import {afterEach, describe, expect, it} from "@jest/globals"; -import {ElasticSearchExtension} from "../../src"; +import { afterEach, describe, expect, it } from "@jest/globals"; +import { ElasticSearchExtension } from "../../src"; describe("ElasticSearchExtension", () => { afterEach(async () => { diff --git a/__tests__/minio/minio-extension.t.ts b/__tests__/minio/minio-extension.t.ts new file mode 100644 index 0000000..d42e95a --- /dev/null +++ b/__tests__/minio/minio-extension.t.ts @@ -0,0 +1,64 @@ +import { afterEach, describe, expect, it } from "@jest/globals"; +import { MinioExtension } from "../../src"; + +describe("MinioExtension", () => { + afterEach(async () => { + if (global.MINIO_CONTAINER) { + await global.MINIO_CONTAINER.stop(); + global.MINIO_CONTAINER = undefined; + } + }); + + describe("startMinioContainer", () => { + it("should start the minio container", async () => { + await MinioExtension.startMinioSearchContainer( + "minioadmin", + "keyboard cat", + ); + + expect(global.MINIO_CONTAINER).toBeDefined(); + + await global.MINIO_CONTAINER.stop(); + }, 60_000); + }); + + describe("stopMinioContainer", () => { + it("should stop the minio container", async () => { + await MinioExtension.startMinioSearchContainer( + "minioadmin", + "keyboard cat", + ); + await MinioExtension.stopMinioSearchContainer(); + + expect(global.MINIO_CONTAINER).toBeUndefined(); + }, 60_000); + + it("should throw error when container is not previously started", () => { + expect(MinioExtension.stopMinioSearchContainer()).rejects.toEqual( + Error( + "IllegalStateException: Minio container has not been previously started", + ), + ); + + expect(global.MINIO_CONTAINER).toBeUndefined(); + }); + }); + + describe("getMinioPort", () => { + it("should return the mapped port for the started container", async () => { + await MinioExtension.startMinioSearchContainer( + "minioadmin", + "keyboard cat", + ); + + const port = MinioExtension.getMinioPort(); + expect(port).toBeGreaterThan(0); + }, 60_000); + + it("should throw error when container is not previously started", () => { + expect(() => MinioExtension.getMinioPort()).toThrow( + "IllegalStateException: Minio container has not been previously started", + ); + }); + }); +}); diff --git a/__tests__/mongo/mongo-extension.t.ts b/__tests__/mongo/mongo-extension.t.ts index 0ff98bf..f661836 100644 --- a/__tests__/mongo/mongo-extension.t.ts +++ b/__tests__/mongo/mongo-extension.t.ts @@ -1,5 +1,5 @@ -import {afterEach, describe, expect, it} from "@jest/globals"; -import {MongoExtension} from "../../src"; +import { afterEach, describe, expect, it } from "@jest/globals"; +import { MongoExtension } from "../../src"; describe("MongoExtension", () => { afterEach(async () => { diff --git a/__tests__/postgres/postgres-extension.t.ts b/__tests__/postgres/postgres-extension.t.ts index 22c82d7..f1351a5 100644 --- a/__tests__/postgres/postgres-extension.t.ts +++ b/__tests__/postgres/postgres-extension.t.ts @@ -1,6 +1,6 @@ -import {afterEach, describe, expect, it} from "@jest/globals"; -import {PostgresExtension} from "../../src"; -import {Client} from "pg"; +import { afterEach, describe, expect, it } from "@jest/globals"; +import { PostgresExtension } from "../../src"; +import { Client } from "pg"; describe("PostgresExtension", () => { afterEach(async () => { diff --git a/src/elasticsearch/elastic-search-extension.ts b/src/elasticsearch/elastic-search-extension.ts index 2864013..f8a0bd5 100644 --- a/src/elasticsearch/elastic-search-extension.ts +++ b/src/elasticsearch/elastic-search-extension.ts @@ -1,5 +1,5 @@ -import {KiwiPreconditions} from "@kiwiproject/kiwi-js"; -import {ElasticsearchContainer} from "@testcontainers/elasticsearch"; +import { KiwiPreconditions } from "@kiwiproject/kiwi-js"; +import { ElasticsearchContainer } from "@testcontainers/elasticsearch"; async function startElasticSearchContainer() { global.ELASTIC_SEARCH_CONTAINER = await new ElasticsearchContainer( diff --git a/src/index.ts b/src/index.ts index 05c598a..30e8f02 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,3 +1,4 @@ export { MongoExtension } from "./mongo/mongo-extension"; export { PostgresExtension } from "./postgres/postgres-extension"; export { ElasticSearchExtension } from "./elasticsearch/elastic-search-extension"; +export { MinioExtension } from "./minio/minio-extension"; diff --git a/src/minio/minio-extension.ts b/src/minio/minio-extension.ts new file mode 100644 index 0000000..bf98f7c --- /dev/null +++ b/src/minio/minio-extension.ts @@ -0,0 +1,44 @@ +import { KiwiPreconditions } from "@kiwiproject/kiwi-js"; +import { GenericContainer, Wait } from "testcontainers"; + +async function startMinioSearchContainer(accessKey: string, secretKey: string) { + global.MINIO_CONTAINER = await new GenericContainer( + "quay.io/minio/minio:latest", + ) + .withEnvironment({ + MINIO_BROWSER: "off", + MINIO_ROOT_USER: accessKey, + MINIO_ROOT_PASSWORD: secretKey, + }) + .withExposedPorts(9000) + .withWaitStrategy( + Wait.forAll([Wait.forListeningPorts(), Wait.forLogMessage(/1 Online/)]), + ) + .withTmpFs({ "/data": "rw,noexec,nosuid" }) + .withCommand(["server", "/data"]) + .start(); +} + +async function stopMinioSearchContainer() { + KiwiPreconditions.checkState( + global.MINIO_CONTAINER !== undefined, + "Minio container has not been previously started", + ); + await global.MINIO_CONTAINER.stop(); + global.MINIO_CONTAINER = undefined; +} + +function getMinioPort(): number { + KiwiPreconditions.checkState( + global.MINIO_CONTAINER !== undefined, + "Minio container has not been previously started", + ); + + return global.MINIO_CONTAINER.getMappedPort(9000); +} + +export const MinioExtension = { + startMinioSearchContainer, + stopMinioSearchContainer, + getMinioPort, +}; diff --git a/src/mongo/mongo-extension.ts b/src/mongo/mongo-extension.ts index e76084f..cf8aff5 100644 --- a/src/mongo/mongo-extension.ts +++ b/src/mongo/mongo-extension.ts @@ -1,5 +1,5 @@ -import {KiwiPreconditions} from "@kiwiproject/kiwi-js"; -import {GenericContainer} from "testcontainers"; +import { KiwiPreconditions } from "@kiwiproject/kiwi-js"; +import { GenericContainer } from "testcontainers"; async function startMongoContainer() { global.MONGO_CONTAINER = await new GenericContainer("mongo") diff --git a/src/postgres/postgres-extension.ts b/src/postgres/postgres-extension.ts index 5e01ca3..45c3b71 100644 --- a/src/postgres/postgres-extension.ts +++ b/src/postgres/postgres-extension.ts @@ -1,6 +1,6 @@ -import {KiwiPreconditions} from "@kiwiproject/kiwi-js"; -import {PostgreSqlContainer} from "@testcontainers/postgresql"; -import {Client} from "pg"; +import { KiwiPreconditions } from "@kiwiproject/kiwi-js"; +import { PostgreSqlContainer } from "@testcontainers/postgresql"; +import { Client } from "pg"; async function startPostgresContainer() { global.POSTGRES_CONTAINER = await new PostgreSqlContainer().start();