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 () => {