From 374de60239003dc11c6b80fae316b88bef513b0f Mon Sep 17 00:00:00 2001 From: Daniel Perez Alvarez Date: Thu, 17 Oct 2024 16:13:27 -0400 Subject: [PATCH] feat: add new entrypoint for mongodb ReplicaSet --- README.md | 24 ++++++++++++++++++++++-- package.json | 5 +++++ src/globalSetupReplSet.ts | 36 ++++++++++++++++++++++++++++++++++++ 3 files changed, 63 insertions(+), 2 deletions(-) create mode 100644 src/globalSetupReplSet.ts diff --git a/README.md b/README.md index f4b23a6..b5b363f 100644 --- a/README.md +++ b/README.md @@ -40,7 +40,6 @@ export default defineConfig({ // optional configuration mongodbMemoryServer: { // these options are passed to MongoMemoryServer.create(), see https://typegoose.github.io/mongodb-memory-server/docs/guides/quick-start-guide#normal-server - // replSet: { count: 4 } }, }, }, @@ -90,7 +89,6 @@ export default defineConfig({ // optional configuration mongodbMemoryServer: { // these options are passed to MongoMemoryServer.create(), see https://typegoose.github.io/mongodb-memory-server/docs/guides/quick-start-guide#normal-server - // replSet: { count: 4 } }, }, }, @@ -119,6 +117,28 @@ test("my test", async ({ connection }) => { - `connection` is the `Connection` instance returned by `mongoose.createConnection`. See https://mongoosejs.com/docs/api/connection.html +## Using ReplSet + +See https://typegoose.github.io/mongodb-memory-server/docs/guides/quick-start-guide#replicaset + +`vitest.config.mjs`: + +```js +import { defineConfig } from "vitest/config"; + +export default defineConfig({ + test: { + globalSetup: ["vitest-mms/globalSetupReplSet"], + setupFiles: ["vitest-mms/mongodb/setupFile"], + vitestMms: { + mongodbMemoryServer: { + replSet: { count: 4 }, + }, + }, + }, +}); +``` + ## Alternative using a extended test context If you want to avoid the overhead of vitest-mms on every test and instead just want to use it for a subset of your tests, you can use `vitest-mms/*/test` instead: diff --git a/package.json b/package.json index d028e51..1c75aa9 100644 --- a/package.json +++ b/package.json @@ -9,6 +9,11 @@ "require": "./dist/globalSetup.cjs", "import": "./dist/globalSetup.mjs" }, + "./globalSetupReplSet": { + "types": "./dist/globalSetupReplSet.d.ts", + "require": "./dist/globalSetupReplSet.cjs", + "import": "./dist/globalSetupReplSet.mjs" + }, "./mongodb/setupFile": { "types": "./dist/mongodb/setupFile.d.ts", "require": "./dist/mongodb/setupFile.cjs", diff --git a/src/globalSetupReplSet.ts b/src/globalSetupReplSet.ts new file mode 100644 index 0000000..50a1d3b --- /dev/null +++ b/src/globalSetupReplSet.ts @@ -0,0 +1,36 @@ +import type { GlobalSetupContext } from "vitest/node"; + +import { MongoMemoryReplSet } from "mongodb-memory-server"; + +export type { ProvidedContext } from "vitest"; +export type { ResolvedConfig } from "vitest/node"; + +declare module "vitest" { + export interface ProvidedContext { + MONGO_URI: string; + } +} + +type MongoMemoryServerOpts = Parameters[0]; + +declare module "vitest/node" { + export interface ResolvedConfig { + vitestMms?: { + mongodbMemoryServerOptions: MongoMemoryServerOpts; + }; + } +} + +export default async function setup({ provide, config }: GlobalSetupContext) { + const mongod = await MongoMemoryReplSet.create( + config.vitestMms?.mongodbMemoryServerOptions, + ); + + const uri = mongod.getUri(); + + provide("MONGO_URI", uri); + + return async () => { + await mongod.stop(); + }; +}