diff --git a/README.md b/README.md
index ba266ff4..080c1d80 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-[![Github Sponsors](https://img.shields.io/static/v1?label=Sponsor&message=%E2%9D%A4&logo=GitHub&link=https://github.com/sponsors/oskardudycz/)](https://github.com/sponsors/oskardudycz/) [![blog](https://img.shields.io/badge/blog-event--driven.io-brightgreen)](https://event-driven.io/?utm_source=event_sourcing_nodejs) [![blog](https://img.shields.io/badge/%F0%9F%9A%80-Architecture%20Weekly-important)](https://www.architecture-weekly.com/?utm_source=event_sourcing_nodejs) [![LinkedIn](https://img.shields.io/badge/LinkedIn-0077B5?style=for-the-badge&logo=linkedin&logoColor=white)](https://www.linkedin.com/in/oskardudycz/)
+[](https://www.linkedin.com/in/oskardudycz/) [![Subscribe](https://img.shields.io/badge/%F0%9F%9A%80-subscribe!-important)](https://www.architecture-weekly.com/?utm_source=github_architecture_weekly) [![Github Sponsors](https://img.shields.io/static/v1?label=Sponsor&message=%E2%9D%A4&logo=GitHub&link=https://github.com/sponsors/oskardudycz/)](https://github.com/sponsors/oskardudycz/) [![blog](https://img.shields.io/badge/blog-event--driven.io-brightgreen)](https://event-driven.io/?utm_source=architecture_weekly)
# EventSourcing.NodeJS
@@ -1040,11 +1040,11 @@ jobs:
runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@v2
- - name: Use Node.js 14.x
- uses: actions/setup-node@v1
+ - uses: actions/checkout@v4
+ - name: Use Node.js 20.10.x
+ uses: actions/setup-node@v4
with:
- node-version: 14.x
+ node-version: 20.10.x
# install dependencies based on the package log
- run: npm ci
# run linting (ESlint and Prettier)
@@ -1083,12 +1083,12 @@ jobs:
# selected operation systems to run Continuous Integration
os: [windows-latest, ubuntu-latest, macos-latest]
# selected node version to run Continuous Integration
- node-version: [14.x, 15.x]
+ node-version: [18.x, 20.10.x]
steps:
- - uses: actions/checkout@v2
+ - uses: actions/checkout@v4
- name: Use Node.js ${{ matrix.node-version }}
- uses: actions/setup-node@v1
+ uses: actions/setup-node@v4
with:
# use the node version defined in matrix above
node-version: ${{ matrix.node-version }}
@@ -1315,12 +1315,12 @@ jobs:
# selected operation systems to run CI
os: [windows-latest, ubuntu-latest, macos-latest]
# selected node version to run CI
- node-version: [14.x, 15.x]
+ node-version: [18.x, 20.10.x]
steps:
- - uses: actions/checkout@v2
+ - uses: actions/checkout@v4
- name: Use Node.js ${{ matrix.node-version }}
- uses: actions/setup-node@v1
+ uses: actions/setup-node@v4
with:
# use the node version defined in matrix above
node-version: ${{ matrix.node-version }}
@@ -1340,7 +1340,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@v2
+ - uses: actions/checkout@v4
# setup Docker buld action
- name: Set up Docker Buildx
diff --git a/samples/closingTheBooks/package-lock.json b/samples/closingTheBooks/package-lock.json
index dd516912..c584e4fa 100644
--- a/samples/closingTheBooks/package-lock.json
+++ b/samples/closingTheBooks/package-lock.json
@@ -18,6 +18,7 @@
"validator": "13.11.0"
},
"devDependencies": {
+ "@testcontainers/mongodb": "^10.4.0",
"@types/convict": "6.1.6",
"@types/dotenv": "8.2.0",
"@types/express": "4.17.21",
@@ -1481,6 +1482,15 @@
"@sinonjs/commons": "^3.0.0"
}
},
+ "node_modules/@testcontainers/mongodb": {
+ "version": "10.4.0",
+ "resolved": "https://registry.npmjs.org/@testcontainers/mongodb/-/mongodb-10.4.0.tgz",
+ "integrity": "sha512-16LgtbSArrt6DtplOV6MvFOhBL9os+6dnUnrSTr4jHvzG738opi+YdjCFh+ZdBot+7OGReB/lJhPxpUa8asUvQ==",
+ "dev": true,
+ "dependencies": {
+ "testcontainers": "^10.4.0"
+ }
+ },
"node_modules/@tsconfig/node10": {
"version": "1.0.9",
"resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz",
@@ -9172,6 +9182,15 @@
"@sinonjs/commons": "^3.0.0"
}
},
+ "@testcontainers/mongodb": {
+ "version": "10.4.0",
+ "resolved": "https://registry.npmjs.org/@testcontainers/mongodb/-/mongodb-10.4.0.tgz",
+ "integrity": "sha512-16LgtbSArrt6DtplOV6MvFOhBL9os+6dnUnrSTr4jHvzG738opi+YdjCFh+ZdBot+7OGReB/lJhPxpUa8asUvQ==",
+ "dev": true,
+ "requires": {
+ "testcontainers": "^10.4.0"
+ }
+ },
"@tsconfig/node10": {
"version": "1.0.9",
"resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz",
diff --git a/samples/closingTheBooks/package.json b/samples/closingTheBooks/package.json
index 5a8b6c44..be1b44e1 100644
--- a/samples/closingTheBooks/package.json
+++ b/samples/closingTheBooks/package.json
@@ -50,6 +50,7 @@
"validator": "13.11.0"
},
"devDependencies": {
+ "@testcontainers/mongodb": "10.4.0",
"@types/convict": "6.1.6",
"@types/dotenv": "8.2.0",
"@types/express": "4.17.21",
diff --git a/samples/closingTheBooks/src/e2e/fullFlow.e2e.test.ts b/samples/closingTheBooks/src/e2e/fullFlow.e2e.test.ts
index cd4092a1..cbabc459 100644
--- a/samples/closingTheBooks/src/e2e/fullFlow.e2e.test.ts
+++ b/samples/closingTheBooks/src/e2e/fullFlow.e2e.test.ts
@@ -10,7 +10,7 @@ import {
import {
MongoDBContainer,
StartedMongoDBContainer,
-} from '#testing/mongoDB/mongoDBContainer';
+} from '@testcontainers/mongodb';
import { retry } from '#testing/retries';
import app from '../app';
import { getSubscription } from '../getSubscription';
@@ -25,7 +25,7 @@ describe('Full flow', () => {
esdbContainer = await new EventStoreDBContainer().start();
config.eventStoreDB.connectionString = esdbContainer.getConnectionString();
- mongodbContainer = await new MongoDBContainer().start();
+ mongodbContainer = await new MongoDBContainer('mongo:6.0.12').start();
config.mongoDB.connectionString = mongodbContainer.getConnectionString();
console.log(config.mongoDB.connectionString);
diff --git a/samples/closingTheBooks/src/testing/mongoDB/mongoDBContainer.int.test.ts b/samples/closingTheBooks/src/testing/mongoDB/mongoDBContainer.int.test.ts
deleted file mode 100644
index 982b37bb..00000000
--- a/samples/closingTheBooks/src/testing/mongoDB/mongoDBContainer.int.test.ts
+++ /dev/null
@@ -1,32 +0,0 @@
-import { MongoDBContainer, StartedMongoDBContainer } from './mongoDBContainer';
-
-describe('MongoDBContainer', () => {
- jest.setTimeout(180_000);
-
- let container: StartedMongoDBContainer;
-
- beforeAll(async () => {
- container = await new MongoDBContainer().start();
- });
-
- it('should connect to MongoDB and store new document', async () => {
- const client = container.getClient();
-
- try {
- await client.connect();
-
- const insertResult = await client
- .db()
- .collection('test')
- .insertOne({ test: 'test' });
-
- expect(insertResult.acknowledged).toBeTruthy();
- } finally {
- await client.close();
- }
- });
-
- afterAll(async () => {
- await container.stop();
- });
-});
diff --git a/samples/closingTheBooks/src/testing/mongoDB/mongoDBContainer.ts b/samples/closingTheBooks/src/testing/mongoDB/mongoDBContainer.ts
deleted file mode 100644
index 375004f2..00000000
--- a/samples/closingTheBooks/src/testing/mongoDB/mongoDBContainer.ts
+++ /dev/null
@@ -1,53 +0,0 @@
-import { MongoClient } from 'mongodb';
-import {
- GenericContainer,
- StartedTestContainer,
- AbstractStartedContainer,
-} from 'testcontainers';
-
-const MONGODB_IMAGE_NAME = 'mongo';
-const MONGODB_IMAGE_TAG = '6.0.12';
-const MONGODB_PORT = 27017;
-
-// See more in https://hub.docker.com/_/mongo
-export class MongoDBContainer extends GenericContainer {
- constructor({
- image,
- databaseName,
- withoutReuse,
- }: {
- image?: string;
- databaseName?: string;
- withoutReuse?: boolean;
- } = {}) {
- super(image ?? `${MONGODB_IMAGE_NAME}:${MONGODB_IMAGE_TAG}`);
-
- if (databaseName) {
- this.withEnvironment({ MONGO_INITDB_DATABASE: databaseName });
- }
-
- this.withExposedPorts(MONGODB_PORT);
-
- if (!withoutReuse) this.withReuse();
- }
-
- async start(): Promise {
- return new StartedMongoDBContainer(await super.start());
- }
-}
-
-export class StartedMongoDBContainer extends AbstractStartedContainer {
- constructor(container: StartedTestContainer) {
- super(container);
- }
-
- getConnectionString(): string {
- return `mongodb://${this.getHost()}:${this.getMappedPort(
- MONGODB_PORT,
- )}/test`;
- }
-
- getClient(): MongoClient {
- return new MongoClient(this.getConnectionString());
- }
-}
diff --git a/samples/decider/package-lock.json b/samples/decider/package-lock.json
index e01dc89a..e724a317 100644
--- a/samples/decider/package-lock.json
+++ b/samples/decider/package-lock.json
@@ -19,6 +19,7 @@
"mongodb": "6.3.0"
},
"devDependencies": {
+ "@testcontainers/mongodb": "^10.4.0",
"@types/convict": "6.1.6",
"@types/express": "4.17.21",
"@types/jest": "29.5.11",
@@ -2753,6 +2754,15 @@
"node": ">=14.0.0"
}
},
+ "node_modules/@testcontainers/mongodb": {
+ "version": "10.4.0",
+ "resolved": "https://registry.npmjs.org/@testcontainers/mongodb/-/mongodb-10.4.0.tgz",
+ "integrity": "sha512-16LgtbSArrt6DtplOV6MvFOhBL9os+6dnUnrSTr4jHvzG738opi+YdjCFh+ZdBot+7OGReB/lJhPxpUa8asUvQ==",
+ "dev": true,
+ "dependencies": {
+ "testcontainers": "^10.4.0"
+ }
+ },
"node_modules/@tsconfig/node10": {
"version": "1.0.9",
"resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz",
@@ -11404,6 +11414,15 @@
"tslib": "^2.5.0"
}
},
+ "@testcontainers/mongodb": {
+ "version": "10.4.0",
+ "resolved": "https://registry.npmjs.org/@testcontainers/mongodb/-/mongodb-10.4.0.tgz",
+ "integrity": "sha512-16LgtbSArrt6DtplOV6MvFOhBL9os+6dnUnrSTr4jHvzG738opi+YdjCFh+ZdBot+7OGReB/lJhPxpUa8asUvQ==",
+ "dev": true,
+ "requires": {
+ "testcontainers": "^10.4.0"
+ }
+ },
"@tsconfig/node10": {
"version": "1.0.9",
"resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz",
diff --git a/samples/decider/package.json b/samples/decider/package.json
index e083ffb0..8035b80d 100644
--- a/samples/decider/package.json
+++ b/samples/decider/package.json
@@ -45,6 +45,7 @@
"mongodb": "6.3.0"
},
"devDependencies": {
+ "@testcontainers/mongodb": "10.4.0",
"@types/convict": "6.1.6",
"@types/express": "4.17.21",
"@types/jest": "29.5.11",
diff --git a/samples/decider/src/shoppingCarts/clientShoppingHistory/clientShoppingHistory.int.test.ts b/samples/decider/src/shoppingCarts/clientShoppingHistory/clientShoppingHistory.int.test.ts
index d209e018..464b2872 100644
--- a/samples/decider/src/shoppingCarts/clientShoppingHistory/clientShoppingHistory.int.test.ts
+++ b/samples/decider/src/shoppingCarts/clientShoppingHistory/clientShoppingHistory.int.test.ts
@@ -1,4 +1,4 @@
-import { MongoDBContainer, Spec } from '#testing/mongoDB';
+import { MongoDBContainer } from '@testcontainers/mongodb';
import { mongoObjectId } from '#core/mongoDB';
import {
ClientShoppingHistory,
@@ -8,15 +8,16 @@ import {
import { MongoClient } from 'mongodb';
import { ShoppingCartEvent } from '../shoppingCart';
import { PricedProductItem } from '../productItem';
+import { Spec } from '#testing/mongoDB/mongoDbProjectionTests';
describe('Client Shopping History', () => {
let mongo: MongoClient;
let given: Spec;
beforeAll(async () => {
- const mongoContainer = await new MongoDBContainer().start();
+ const mongoContainer = await new MongoDBContainer('mongo:6.0.12').start();
console.log(mongoContainer.getConnectionString());
- mongo = mongoContainer.getClient();
+ mongo = new MongoClient(mongoContainer.getConnectionString());
await mongo.connect();
given = Spec.for(
diff --git a/samples/decider/src/shoppingCarts/shoppingCartDetails/shoppingCartDetails.int.test.ts b/samples/decider/src/shoppingCarts/shoppingCartDetails/shoppingCartDetails.int.test.ts
index 0b48e8be..b2dc5af9 100644
--- a/samples/decider/src/shoppingCarts/shoppingCartDetails/shoppingCartDetails.int.test.ts
+++ b/samples/decider/src/shoppingCarts/shoppingCartDetails/shoppingCartDetails.int.test.ts
@@ -1,4 +1,4 @@
-import { MongoDBContainer, Spec } from '#testing/mongoDB';
+import { MongoDBContainer } from '@testcontainers/mongodb';
import { MongoClient } from 'mongodb';
import { mongoObjectId } from '#core/mongoDB';
import {
@@ -9,15 +9,16 @@ import {
} from './shoppingCartDetails';
import { ShoppingCartEvent } from '../shoppingCart';
import { PricedProductItem } from 'src/gist';
+import { Spec } from '#testing/mongoDB/mongoDbProjectionTests';
describe('Shopping Cart details', () => {
let mongo: MongoClient;
let given: Spec;
beforeAll(async () => {
- const mongoContainer = await new MongoDBContainer().start();
+ const mongoContainer = await new MongoDBContainer('mongo:6.0.12').start();
console.log(mongoContainer.getConnectionString());
- mongo = mongoContainer.getClient();
+ mongo = new MongoClient(mongoContainer.getConnectionString());
await mongo.connect();
given = Spec.for(
diff --git a/samples/decider/src/testing/mongoDB/index.ts b/samples/decider/src/testing/mongoDB/index.ts
deleted file mode 100644
index ed5f3f98..00000000
--- a/samples/decider/src/testing/mongoDB/index.ts
+++ /dev/null
@@ -1,2 +0,0 @@
-export * from './mongoDBContainer';
-export * from './mongoDbProjectionTests';
diff --git a/samples/decider/src/testing/mongoDB/mongoDBContainer.int.test.ts b/samples/decider/src/testing/mongoDB/mongoDBContainer.int.test.ts
deleted file mode 100644
index 214d34bd..00000000
--- a/samples/decider/src/testing/mongoDB/mongoDBContainer.int.test.ts
+++ /dev/null
@@ -1,32 +0,0 @@
-import { MongoDBContainer, StartedMongoDBContainer } from './mongoDBContainer';
-
-describe('MongoDBContainer', () => {
- jest.setTimeout(180_000);
-
- let container: StartedMongoDBContainer;
-
- beforeAll(async () => {
- container = await new MongoDBContainer({ withoutReuse: true }).start();
- });
-
- it('should connect to MongoDB and store new document', async () => {
- const client = container.getClient();
-
- try {
- await client.connect();
-
- const insertResult = await client
- .db()
- .collection('test')
- .insertOne({ test: 'test' });
-
- expect(insertResult.acknowledged).toBeTruthy();
- } finally {
- await client.close();
- }
- });
-
- afterAll(async () => {
- if (container) await container.stop();
- });
-});
diff --git a/samples/decider/src/testing/mongoDB/mongoDBContainer.ts b/samples/decider/src/testing/mongoDB/mongoDBContainer.ts
deleted file mode 100644
index 375004f2..00000000
--- a/samples/decider/src/testing/mongoDB/mongoDBContainer.ts
+++ /dev/null
@@ -1,53 +0,0 @@
-import { MongoClient } from 'mongodb';
-import {
- GenericContainer,
- StartedTestContainer,
- AbstractStartedContainer,
-} from 'testcontainers';
-
-const MONGODB_IMAGE_NAME = 'mongo';
-const MONGODB_IMAGE_TAG = '6.0.12';
-const MONGODB_PORT = 27017;
-
-// See more in https://hub.docker.com/_/mongo
-export class MongoDBContainer extends GenericContainer {
- constructor({
- image,
- databaseName,
- withoutReuse,
- }: {
- image?: string;
- databaseName?: string;
- withoutReuse?: boolean;
- } = {}) {
- super(image ?? `${MONGODB_IMAGE_NAME}:${MONGODB_IMAGE_TAG}`);
-
- if (databaseName) {
- this.withEnvironment({ MONGO_INITDB_DATABASE: databaseName });
- }
-
- this.withExposedPorts(MONGODB_PORT);
-
- if (!withoutReuse) this.withReuse();
- }
-
- async start(): Promise {
- return new StartedMongoDBContainer(await super.start());
- }
-}
-
-export class StartedMongoDBContainer extends AbstractStartedContainer {
- constructor(container: StartedTestContainer) {
- super(container);
- }
-
- getConnectionString(): string {
- return `mongodb://${this.getHost()}:${this.getMappedPort(
- MONGODB_PORT,
- )}/test`;
- }
-
- getClient(): MongoClient {
- return new MongoClient(this.getConnectionString());
- }
-}
diff --git a/samples/optimisticConcurrency/package-lock.json b/samples/optimisticConcurrency/package-lock.json
index 3cb9b9f6..5028a250 100644
--- a/samples/optimisticConcurrency/package-lock.json
+++ b/samples/optimisticConcurrency/package-lock.json
@@ -19,6 +19,7 @@
"validator": "13.11.0"
},
"devDependencies": {
+ "@testcontainers/mongodb": "^10.4.0",
"@types/convict": "6.1.6",
"@types/express": "4.17.21",
"@types/jest": "29.5.11",
@@ -1446,6 +1447,15 @@
"@sinonjs/commons": "^3.0.0"
}
},
+ "node_modules/@testcontainers/mongodb": {
+ "version": "10.4.0",
+ "resolved": "https://registry.npmjs.org/@testcontainers/mongodb/-/mongodb-10.4.0.tgz",
+ "integrity": "sha512-16LgtbSArrt6DtplOV6MvFOhBL9os+6dnUnrSTr4jHvzG738opi+YdjCFh+ZdBot+7OGReB/lJhPxpUa8asUvQ==",
+ "dev": true,
+ "dependencies": {
+ "testcontainers": "^10.4.0"
+ }
+ },
"node_modules/@tsconfig/node10": {
"version": "1.0.9",
"resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz",
@@ -8901,6 +8911,15 @@
"@sinonjs/commons": "^3.0.0"
}
},
+ "@testcontainers/mongodb": {
+ "version": "10.4.0",
+ "resolved": "https://registry.npmjs.org/@testcontainers/mongodb/-/mongodb-10.4.0.tgz",
+ "integrity": "sha512-16LgtbSArrt6DtplOV6MvFOhBL9os+6dnUnrSTr4jHvzG738opi+YdjCFh+ZdBot+7OGReB/lJhPxpUa8asUvQ==",
+ "dev": true,
+ "requires": {
+ "testcontainers": "^10.4.0"
+ }
+ },
"@tsconfig/node10": {
"version": "1.0.9",
"resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz",
diff --git a/samples/optimisticConcurrency/package.json b/samples/optimisticConcurrency/package.json
index 5667932a..0fecddd2 100644
--- a/samples/optimisticConcurrency/package.json
+++ b/samples/optimisticConcurrency/package.json
@@ -46,15 +46,16 @@
"validator": "13.11.0"
},
"devDependencies": {
+ "@testcontainers/mongodb": "10.4.0",
"@types/convict": "6.1.6",
"@types/express": "4.17.21",
"@types/jest": "29.5.11",
"@types/node": "20.10.6",
"@types/supertest": "6.0.2",
"@types/uuid": "9.0.7",
+ "@types/validator": "13.11.7",
"@typescript-eslint/eslint-plugin": "6.17.0",
"@typescript-eslint/parser": "6.17.0",
- "@types/validator": "13.11.7",
"eslint": "8.56.0",
"eslint-config-prettier": "9.1.0",
"eslint-plugin-prettier": "5.1.2",
diff --git a/samples/optimisticConcurrency/src/shoppingCarts/e2e/fullFlow.e2e.test.ts b/samples/optimisticConcurrency/src/shoppingCarts/e2e/fullFlow.e2e.test.ts
index a7d62461..3ef39d37 100644
--- a/samples/optimisticConcurrency/src/shoppingCarts/e2e/fullFlow.e2e.test.ts
+++ b/samples/optimisticConcurrency/src/shoppingCarts/e2e/fullFlow.e2e.test.ts
@@ -9,7 +9,7 @@ import {
import {
MongoDBContainer,
StartedMongoDBContainer,
-} from '#testing/mongoDB/mongoDBContainer';
+} from '@testcontainers/mongodb';
import app from '../../app';
import { getSubscription } from '../../getSubscription';
import { disconnectFromMongoDB } from '#core/mongoDB';
@@ -25,7 +25,7 @@ describe('Full flow', () => {
esdbContainer = await new EventStoreDBContainer().start();
config.eventStoreDB.connectionString = esdbContainer.getConnectionString();
- mongodbContainer = await new MongoDBContainer().start();
+ mongodbContainer = await new MongoDBContainer('mongo:6.0.12').start();
config.mongoDB.connectionString = mongodbContainer.getConnectionString();
console.log(config.mongoDB.connectionString);
diff --git a/samples/optimisticConcurrency/src/testing/mongoDB/mongoDBContainer.int.test.ts b/samples/optimisticConcurrency/src/testing/mongoDB/mongoDBContainer.int.test.ts
deleted file mode 100644
index 982b37bb..00000000
--- a/samples/optimisticConcurrency/src/testing/mongoDB/mongoDBContainer.int.test.ts
+++ /dev/null
@@ -1,32 +0,0 @@
-import { MongoDBContainer, StartedMongoDBContainer } from './mongoDBContainer';
-
-describe('MongoDBContainer', () => {
- jest.setTimeout(180_000);
-
- let container: StartedMongoDBContainer;
-
- beforeAll(async () => {
- container = await new MongoDBContainer().start();
- });
-
- it('should connect to MongoDB and store new document', async () => {
- const client = container.getClient();
-
- try {
- await client.connect();
-
- const insertResult = await client
- .db()
- .collection('test')
- .insertOne({ test: 'test' });
-
- expect(insertResult.acknowledged).toBeTruthy();
- } finally {
- await client.close();
- }
- });
-
- afterAll(async () => {
- await container.stop();
- });
-});
diff --git a/samples/optimisticConcurrency/src/testing/mongoDB/mongoDBContainer.ts b/samples/optimisticConcurrency/src/testing/mongoDB/mongoDBContainer.ts
deleted file mode 100644
index 375004f2..00000000
--- a/samples/optimisticConcurrency/src/testing/mongoDB/mongoDBContainer.ts
+++ /dev/null
@@ -1,53 +0,0 @@
-import { MongoClient } from 'mongodb';
-import {
- GenericContainer,
- StartedTestContainer,
- AbstractStartedContainer,
-} from 'testcontainers';
-
-const MONGODB_IMAGE_NAME = 'mongo';
-const MONGODB_IMAGE_TAG = '6.0.12';
-const MONGODB_PORT = 27017;
-
-// See more in https://hub.docker.com/_/mongo
-export class MongoDBContainer extends GenericContainer {
- constructor({
- image,
- databaseName,
- withoutReuse,
- }: {
- image?: string;
- databaseName?: string;
- withoutReuse?: boolean;
- } = {}) {
- super(image ?? `${MONGODB_IMAGE_NAME}:${MONGODB_IMAGE_TAG}`);
-
- if (databaseName) {
- this.withEnvironment({ MONGO_INITDB_DATABASE: databaseName });
- }
-
- this.withExposedPorts(MONGODB_PORT);
-
- if (!withoutReuse) this.withReuse();
- }
-
- async start(): Promise {
- return new StartedMongoDBContainer(await super.start());
- }
-}
-
-export class StartedMongoDBContainer extends AbstractStartedContainer {
- constructor(container: StartedTestContainer) {
- super(container);
- }
-
- getConnectionString(): string {
- return `mongodb://${this.getHost()}:${this.getMappedPort(
- MONGODB_PORT,
- )}/test`;
- }
-
- getClient(): MongoClient {
- return new MongoClient(this.getConnectionString());
- }
-}
diff --git a/samples/unpeelingOnion/package-lock.json b/samples/unpeelingOnion/package-lock.json
index 526a7d0f..f4cac724 100644
--- a/samples/unpeelingOnion/package-lock.json
+++ b/samples/unpeelingOnion/package-lock.json
@@ -22,6 +22,7 @@
"@databases/migrations-base": "3.0.1",
"@databases/pg-migrations": "5.0.2",
"@databases/pg-typed": "4.4.1",
+ "@testcontainers/mongodb": "^10.4.0",
"@types/convict": "6.1.6",
"@types/express": "4.17.21",
"@types/jest": "29.5.11",
@@ -3293,6 +3294,15 @@
"node": ">=14.0.0"
}
},
+ "node_modules/@testcontainers/mongodb": {
+ "version": "10.4.0",
+ "resolved": "https://registry.npmjs.org/@testcontainers/mongodb/-/mongodb-10.4.0.tgz",
+ "integrity": "sha512-16LgtbSArrt6DtplOV6MvFOhBL9os+6dnUnrSTr4jHvzG738opi+YdjCFh+ZdBot+7OGReB/lJhPxpUa8asUvQ==",
+ "dev": true,
+ "dependencies": {
+ "testcontainers": "^10.4.0"
+ }
+ },
"node_modules/@tsconfig/node10": {
"version": "1.0.9",
"resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz",
@@ -14736,6 +14746,15 @@
"tslib": "^2.5.0"
}
},
+ "@testcontainers/mongodb": {
+ "version": "10.4.0",
+ "resolved": "https://registry.npmjs.org/@testcontainers/mongodb/-/mongodb-10.4.0.tgz",
+ "integrity": "sha512-16LgtbSArrt6DtplOV6MvFOhBL9os+6dnUnrSTr4jHvzG738opi+YdjCFh+ZdBot+7OGReB/lJhPxpUa8asUvQ==",
+ "dev": true,
+ "requires": {
+ "testcontainers": "^10.4.0"
+ }
+ },
"@tsconfig/node10": {
"version": "1.0.9",
"resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz",
diff --git a/samples/unpeelingOnion/package.json b/samples/unpeelingOnion/package.json
index ee159de2..1cd65c6b 100644
--- a/samples/unpeelingOnion/package.json
+++ b/samples/unpeelingOnion/package.json
@@ -55,9 +55,10 @@
"mongodb": "6.3.0"
},
"devDependencies": {
- "@databases/pg-migrations": "5.0.2",
"@databases/migrations-base": "3.0.1",
+ "@databases/pg-migrations": "5.0.2",
"@databases/pg-typed": "4.4.1",
+ "@testcontainers/mongodb": "10.4.0",
"@types/convict": "6.1.6",
"@types/express": "4.17.21",
"@types/jest": "29.5.11",
diff --git a/samples/unpeelingOnion/src/onion/tests/e2e/fullFlow.e2e.test.ts b/samples/unpeelingOnion/src/onion/tests/e2e/fullFlow.e2e.test.ts
index 6f885673..62d83d05 100644
--- a/samples/unpeelingOnion/src/onion/tests/e2e/fullFlow.e2e.test.ts
+++ b/samples/unpeelingOnion/src/onion/tests/e2e/fullFlow.e2e.test.ts
@@ -6,21 +6,22 @@ import { TestResponse } from '#testing/api/testResponse';
import {
MongoDBContainer,
StartedMongoDBContainer,
-} from '#testing/api/mongoDB/mongoDBContainer';
+} from '@testcontainers/mongodb';
import { disconnectFromMongoDB } from '#core/mongodb';
import { Application } from 'express';
import initApp from '../../ecommerce/app';
import { ShoppingCartStatus } from '../../ecommerce/domain/shoppingCarts/shoppingCartStatus';
+import { MongoClient } from 'mongodb';
describe('Full flow', () => {
let app: Application;
let mongodbContainer: StartedMongoDBContainer;
beforeAll(async () => {
- mongodbContainer = await new MongoDBContainer().start();
+ mongodbContainer = await new MongoDBContainer('mongo:6.0.12').start();
config.mongoDB.connectionString = mongodbContainer.getConnectionString();
console.log(config.mongoDB.connectionString);
- app = initApp(mongodbContainer.getClient());
+ app = initApp(new MongoClient(mongodbContainer.getConnectionString()));
});
afterAll(async () => {
diff --git a/samples/unpeelingOnion/src/testing/api/mongoDB/mongoDBContainer.int.test.ts b/samples/unpeelingOnion/src/testing/api/mongoDB/mongoDBContainer.int.test.ts
deleted file mode 100644
index 982b37bb..00000000
--- a/samples/unpeelingOnion/src/testing/api/mongoDB/mongoDBContainer.int.test.ts
+++ /dev/null
@@ -1,32 +0,0 @@
-import { MongoDBContainer, StartedMongoDBContainer } from './mongoDBContainer';
-
-describe('MongoDBContainer', () => {
- jest.setTimeout(180_000);
-
- let container: StartedMongoDBContainer;
-
- beforeAll(async () => {
- container = await new MongoDBContainer().start();
- });
-
- it('should connect to MongoDB and store new document', async () => {
- const client = container.getClient();
-
- try {
- await client.connect();
-
- const insertResult = await client
- .db()
- .collection('test')
- .insertOne({ test: 'test' });
-
- expect(insertResult.acknowledged).toBeTruthy();
- } finally {
- await client.close();
- }
- });
-
- afterAll(async () => {
- await container.stop();
- });
-});
diff --git a/samples/unpeelingOnion/src/testing/api/mongoDB/mongoDBContainer.ts b/samples/unpeelingOnion/src/testing/api/mongoDB/mongoDBContainer.ts
deleted file mode 100644
index 375004f2..00000000
--- a/samples/unpeelingOnion/src/testing/api/mongoDB/mongoDBContainer.ts
+++ /dev/null
@@ -1,53 +0,0 @@
-import { MongoClient } from 'mongodb';
-import {
- GenericContainer,
- StartedTestContainer,
- AbstractStartedContainer,
-} from 'testcontainers';
-
-const MONGODB_IMAGE_NAME = 'mongo';
-const MONGODB_IMAGE_TAG = '6.0.12';
-const MONGODB_PORT = 27017;
-
-// See more in https://hub.docker.com/_/mongo
-export class MongoDBContainer extends GenericContainer {
- constructor({
- image,
- databaseName,
- withoutReuse,
- }: {
- image?: string;
- databaseName?: string;
- withoutReuse?: boolean;
- } = {}) {
- super(image ?? `${MONGODB_IMAGE_NAME}:${MONGODB_IMAGE_TAG}`);
-
- if (databaseName) {
- this.withEnvironment({ MONGO_INITDB_DATABASE: databaseName });
- }
-
- this.withExposedPorts(MONGODB_PORT);
-
- if (!withoutReuse) this.withReuse();
- }
-
- async start(): Promise {
- return new StartedMongoDBContainer(await super.start());
- }
-}
-
-export class StartedMongoDBContainer extends AbstractStartedContainer {
- constructor(container: StartedTestContainer) {
- super(container);
- }
-
- getConnectionString(): string {
- return `mongodb://${this.getHost()}:${this.getMappedPort(
- MONGODB_PORT,
- )}/test`;
- }
-
- getClient(): MongoClient {
- return new MongoClient(this.getConnectionString());
- }
-}
diff --git a/samples/unpeelingOnion/src/unpeeled/tests/e2e/fullFlow.e2e.test.ts b/samples/unpeelingOnion/src/unpeeled/tests/e2e/fullFlow.e2e.test.ts
index cd7f2729..a78c510a 100644
--- a/samples/unpeelingOnion/src/unpeeled/tests/e2e/fullFlow.e2e.test.ts
+++ b/samples/unpeelingOnion/src/unpeeled/tests/e2e/fullFlow.e2e.test.ts
@@ -6,21 +6,22 @@ import { TestResponse } from '#testing/api/testResponse';
import {
MongoDBContainer,
StartedMongoDBContainer,
-} from '#testing/api/mongoDB/mongoDBContainer';
+} from '@testcontainers/mongodb';
import { disconnectFromMongoDB } from '#core/mongodb';
import { Application } from 'express';
import initApp from '../../ecommerce/app';
import { ShoppingCartStatus } from '../../ecommerce/shoppingCarts/shoppingCart';
+import { MongoClient } from 'mongodb';
describe('Full flow', () => {
let app: Application;
let mongodbContainer: StartedMongoDBContainer;
beforeAll(async () => {
- mongodbContainer = await new MongoDBContainer().start();
+ mongodbContainer = await new MongoDBContainer('mongo:6.0.12').start();
config.mongoDB.connectionString = mongodbContainer.getConnectionString();
console.log(config.mongoDB.connectionString);
- app = initApp(mongodbContainer.getClient());
+ app = initApp(new MongoClient(mongodbContainer.getConnectionString()));
});
afterAll(async () => {