From abd2ed441d36c18f3b8d03890595bfea2a14f508 Mon Sep 17 00:00:00 2001 From: Nikola Irinchev Date: Thu, 24 Apr 2025 12:48:53 +0200 Subject: [PATCH] chore: fix tests --- tests/integration/helpers.ts | 76 +------------------ .../mongodb/create/createCollection.test.ts | 4 +- .../tools/mongodb/create/createIndex.test.ts | 4 +- .../tools/mongodb/create/insertMany.test.ts | 4 +- .../tools/mongodb/delete/deleteMany.test.ts | 4 +- .../mongodb/delete/dropCollection.test.ts | 4 +- .../tools/mongodb/delete/dropDatabase.test.ts | 4 +- .../mongodb/metadata/collectionSchema.test.ts | 4 +- .../metadata/collectionStorageSize.test.ts | 4 +- .../tools/mongodb/metadata/connect.test.ts | 2 +- .../mongodb/metadata/listCollections.test.ts | 4 +- .../mongodb/metadata/listDatabases.test.ts | 10 +-- .../tools/mongodb/mongodbHelpers.ts | 48 +++++++++++- .../tools/mongodb/read/count.test.ts | 4 +- 14 files changed, 62 insertions(+), 114 deletions(-) diff --git a/tests/integration/helpers.ts b/tests/integration/helpers.ts index 895970a6..243f6a7b 100644 --- a/tests/integration/helpers.ts +++ b/tests/integration/helpers.ts @@ -1,15 +1,12 @@ import { Client } from "@modelcontextprotocol/sdk/client/index.js"; import { InMemoryTransport } from "./inMemoryTransport.js"; import { Server } from "../../src/server.js"; -import runner, { MongoCluster } from "mongodb-runner"; -import path from "path"; -import fs from "fs/promises"; -import { MongoClient, ObjectId } from "mongodb"; -import { toIncludeAllMembers } from "jest-extended"; +import { ObjectId } from "mongodb"; import { config, UserConfig } from "../../src/config.js"; import { McpError } from "@modelcontextprotocol/sdk/types.js"; import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js"; import { Session } from "../../src/session.js"; +import { toIncludeAllMembers } from "jest-extended"; interface ParameterInfo { name: string; @@ -98,31 +95,9 @@ export function setupIntegrationTest(userConfig: UserConfig = config): Integrati return mcpServer; }; - const getConnectionString = () => { - if (!mongoCluster) { - throw new Error("beforeAll() hook not ran yet"); - } - - return mongoCluster.connectionString; - }; - return { mcpClient: getMcpClient, mcpServer: getMcpServer, - mongoClient: () => { - if (!mongoClient) { - mongoClient = new MongoClient(getConnectionString()); - } - return mongoClient; - }, - connectionString: getConnectionString, - connectMcpClient: async () => { - await getMcpClient().callTool({ - name: "connect", - arguments: { options: [{ connectionString: getConnectionString() }] }, - }); - }, - randomDbName: () => randomDbName, }; } @@ -199,52 +174,6 @@ export function validateToolMetadata( }); } -export function validateAutoConnectBehavior( - integration: IntegrationTest, - name: string, - validation: () => { - args: { [x: string]: unknown }; - expectedResponse?: string; - validate?: (content: unknown) => void; - }, - beforeEachImpl?: () => Promise -): void { - describe("when not connected", () => { - if (beforeEachImpl) { - beforeEach(() => beforeEachImpl()); - } - - it("connects automatically if connection string is configured", async () => { - config.connectionString = integration.connectionString(); - - const validationInfo = validation(); - - const response = await integration.mcpClient().callTool({ - name, - arguments: validationInfo.args, - }); - - if (validationInfo.expectedResponse) { - const content = getResponseContent(response.content); - expect(content).toContain(validationInfo.expectedResponse); - } - - if (validationInfo.validate) { - validationInfo.validate(response.content); - } - }); - - it("throws an error if connection string is not configured", async () => { - const response = await integration.mcpClient().callTool({ - name, - arguments: validation().args, - }); - const content = getResponseContent(response.content); - expect(content).toContain("You need to connect to a MongoDB instance before you can access its data."); - }); - }); -} - export function validateThrowsForInvalidArguments( integration: IntegrationTest, name: string, @@ -253,7 +182,6 @@ export function validateThrowsForInvalidArguments( describe("with invalid arguments", () => { for (const arg of args) { it(`throws a schema error for: ${JSON.stringify(arg)}`, async () => { - await integration.connectMcpClient(); try { await integration.mcpClient().callTool({ name, arguments: arg }); expect.fail("Expected an error to be thrown"); diff --git a/tests/integration/tools/mongodb/create/createCollection.test.ts b/tests/integration/tools/mongodb/create/createCollection.test.ts index 3fd5723f..c720dbe1 100644 --- a/tests/integration/tools/mongodb/create/createCollection.test.ts +++ b/tests/integration/tools/mongodb/create/createCollection.test.ts @@ -1,11 +1,9 @@ -import { describeWithMongoDB } from "../mongodbHelpers.js"; +import { describeWithMongoDB, validateAutoConnectBehavior } from "../mongodbHelpers.js"; import { getResponseContent, dbOperationParameters, - setupIntegrationTest, validateToolMetadata, - validateAutoConnectBehavior, validateThrowsForInvalidArguments, dbOperationInvalidArgTests, } from "../../../helpers.js"; diff --git a/tests/integration/tools/mongodb/create/createIndex.test.ts b/tests/integration/tools/mongodb/create/createIndex.test.ts index 1112b876..83687f3d 100644 --- a/tests/integration/tools/mongodb/create/createIndex.test.ts +++ b/tests/integration/tools/mongodb/create/createIndex.test.ts @@ -1,11 +1,9 @@ -import { describeWithMongoDB } from "../mongodbHelpers.js"; +import { describeWithMongoDB, validateAutoConnectBehavior } from "../mongodbHelpers.js"; import { getResponseContent, dbOperationParameters, - setupIntegrationTest, validateToolMetadata, - validateAutoConnectBehavior, validateThrowsForInvalidArguments, } from "../../../helpers.js"; import { IndexDirection } from "mongodb"; diff --git a/tests/integration/tools/mongodb/create/insertMany.test.ts b/tests/integration/tools/mongodb/create/insertMany.test.ts index 197b245e..e05b3563 100644 --- a/tests/integration/tools/mongodb/create/insertMany.test.ts +++ b/tests/integration/tools/mongodb/create/insertMany.test.ts @@ -1,11 +1,9 @@ -import { describeWithMongoDB } from "../mongodbHelpers.js"; +import { describeWithMongoDB, validateAutoConnectBehavior } from "../mongodbHelpers.js"; import { getResponseContent, dbOperationParameters, - setupIntegrationTest, validateToolMetadata, - validateAutoConnectBehavior, validateThrowsForInvalidArguments, } from "../../../helpers.js"; diff --git a/tests/integration/tools/mongodb/delete/deleteMany.test.ts b/tests/integration/tools/mongodb/delete/deleteMany.test.ts index 05f8a417..5f8e096b 100644 --- a/tests/integration/tools/mongodb/delete/deleteMany.test.ts +++ b/tests/integration/tools/mongodb/delete/deleteMany.test.ts @@ -1,11 +1,9 @@ -import { describeWithMongoDB } from "../mongodbHelpers.js"; +import { describeWithMongoDB, validateAutoConnectBehavior } from "../mongodbHelpers.js"; import { getResponseContent, dbOperationParameters, - setupIntegrationTest, validateToolMetadata, - validateAutoConnectBehavior, validateThrowsForInvalidArguments, } from "../../../helpers.js"; diff --git a/tests/integration/tools/mongodb/delete/dropCollection.test.ts b/tests/integration/tools/mongodb/delete/dropCollection.test.ts index 884e1c13..764f58e5 100644 --- a/tests/integration/tools/mongodb/delete/dropCollection.test.ts +++ b/tests/integration/tools/mongodb/delete/dropCollection.test.ts @@ -1,11 +1,9 @@ -import { describeWithMongoDB } from "../mongodbHelpers.js"; +import { describeWithMongoDB, validateAutoConnectBehavior } from "../mongodbHelpers.js"; import { getResponseContent, dbOperationParameters, - setupIntegrationTest, validateToolMetadata, - validateAutoConnectBehavior, validateThrowsForInvalidArguments, dbOperationInvalidArgTests, } from "../../../helpers.js"; diff --git a/tests/integration/tools/mongodb/delete/dropDatabase.test.ts b/tests/integration/tools/mongodb/delete/dropDatabase.test.ts index e6ec15f2..a7fb7d92 100644 --- a/tests/integration/tools/mongodb/delete/dropDatabase.test.ts +++ b/tests/integration/tools/mongodb/delete/dropDatabase.test.ts @@ -1,11 +1,9 @@ -import { describeWithMongoDB } from "../mongodbHelpers.js"; +import { describeWithMongoDB, validateAutoConnectBehavior } from "../mongodbHelpers.js"; import { getResponseContent, dbOperationParameters, - setupIntegrationTest, validateToolMetadata, - validateAutoConnectBehavior, validateThrowsForInvalidArguments, dbOperationInvalidArgTests, } from "../../../helpers.js"; diff --git a/tests/integration/tools/mongodb/metadata/collectionSchema.test.ts b/tests/integration/tools/mongodb/metadata/collectionSchema.test.ts index 9e48cca4..b9d14160 100644 --- a/tests/integration/tools/mongodb/metadata/collectionSchema.test.ts +++ b/tests/integration/tools/mongodb/metadata/collectionSchema.test.ts @@ -1,12 +1,10 @@ -import { describeWithMongoDB } from "../mongodbHelpers.js"; +import { describeWithMongoDB, validateAutoConnectBehavior } from "../mongodbHelpers.js"; import { getResponseElements, getResponseContent, - setupIntegrationTest, dbOperationParameters, validateToolMetadata, - validateAutoConnectBehavior, validateThrowsForInvalidArguments, dbOperationInvalidArgTests, } from "../../../helpers.js"; diff --git a/tests/integration/tools/mongodb/metadata/collectionStorageSize.test.ts b/tests/integration/tools/mongodb/metadata/collectionStorageSize.test.ts index 4428f145..bc7c35ca 100644 --- a/tests/integration/tools/mongodb/metadata/collectionStorageSize.test.ts +++ b/tests/integration/tools/mongodb/metadata/collectionStorageSize.test.ts @@ -1,11 +1,9 @@ -import { describeWithMongoDB } from "../mongodbHelpers.js"; +import { describeWithMongoDB, validateAutoConnectBehavior } from "../mongodbHelpers.js"; import { getResponseContent, - setupIntegrationTest, dbOperationParameters, validateToolMetadata, - validateAutoConnectBehavior, dbOperationInvalidArgTests, validateThrowsForInvalidArguments, } from "../../../helpers.js"; diff --git a/tests/integration/tools/mongodb/metadata/connect.test.ts b/tests/integration/tools/mongodb/metadata/connect.test.ts index a13f5f98..017c6779 100644 --- a/tests/integration/tools/mongodb/metadata/connect.test.ts +++ b/tests/integration/tools/mongodb/metadata/connect.test.ts @@ -1,6 +1,6 @@ import { describeWithMongoDB } from "../mongodbHelpers.js"; -import { getResponseContent, setupIntegrationTest, validateToolMetadata } from "../../../helpers.js"; +import { getResponseContent, validateToolMetadata } from "../../../helpers.js"; import { config } from "../../../../../src/config.js"; diff --git a/tests/integration/tools/mongodb/metadata/listCollections.test.ts b/tests/integration/tools/mongodb/metadata/listCollections.test.ts index cfb67d4d..15904874 100644 --- a/tests/integration/tools/mongodb/metadata/listCollections.test.ts +++ b/tests/integration/tools/mongodb/metadata/listCollections.test.ts @@ -1,11 +1,9 @@ -import { describeWithMongoDB } from "../mongodbHelpers.js"; +import { describeWithMongoDB, validateAutoConnectBehavior } from "../mongodbHelpers.js"; import { getResponseElements, getResponseContent, - setupIntegrationTest, validateToolMetadata, - validateAutoConnectBehavior, validateThrowsForInvalidArguments, dbOperationInvalidArgTests, } from "../../../helpers.js"; diff --git a/tests/integration/tools/mongodb/metadata/listDatabases.test.ts b/tests/integration/tools/mongodb/metadata/listDatabases.test.ts index 12d2870e..27984249 100644 --- a/tests/integration/tools/mongodb/metadata/listDatabases.test.ts +++ b/tests/integration/tools/mongodb/metadata/listDatabases.test.ts @@ -1,12 +1,6 @@ -import { describeWithMongoDB } from "../mongodbHelpers.js"; +import { describeWithMongoDB, validateAutoConnectBehavior } from "../mongodbHelpers.js"; -import { - getResponseElements, - getParameters, - setupIntegrationTest, - validateAutoConnectBehavior, -} from "../../../helpers.js"; -import { toIncludeSameMembers } from "jest-extended"; +import { getResponseElements, getParameters } from "../../../helpers.js"; describeWithMongoDB("listDatabases tool", (integration) => { const defaultDatabases = ["admin", "config", "local"]; diff --git a/tests/integration/tools/mongodb/mongodbHelpers.ts b/tests/integration/tools/mongodb/mongodbHelpers.ts index 69814f57..44584339 100644 --- a/tests/integration/tools/mongodb/mongodbHelpers.ts +++ b/tests/integration/tools/mongodb/mongodbHelpers.ts @@ -2,7 +2,7 @@ import runner, { MongoCluster } from "mongodb-runner"; import path from "path"; import fs from "fs/promises"; import { MongoClient, ObjectId } from "mongodb"; -import { IntegrationTest, setupIntegrationTest } from "../../helpers.js"; +import { getResponseContent, IntegrationTest, setupIntegrationTest } from "../../helpers.js"; import { UserConfig, config } from "../../../../src/config.js"; interface MongoDBIntegrationTest { @@ -111,3 +111,49 @@ export function setupMongoDBIntegrationTest( randomDbName: () => randomDbName, }; } + +export function validateAutoConnectBehavior( + integration: IntegrationTest & MongoDBIntegrationTest, + name: string, + validation: () => { + args: { [x: string]: unknown }; + expectedResponse?: string; + validate?: (content: unknown) => void; + }, + beforeEachImpl?: () => Promise +): void { + describe("when not connected", () => { + if (beforeEachImpl) { + beforeEach(() => beforeEachImpl()); + } + + it("connects automatically if connection string is configured", async () => { + config.connectionString = integration.connectionString(); + + const validationInfo = validation(); + + const response = await integration.mcpClient().callTool({ + name, + arguments: validationInfo.args, + }); + + if (validationInfo.expectedResponse) { + const content = getResponseContent(response.content); + expect(content).toContain(validationInfo.expectedResponse); + } + + if (validationInfo.validate) { + validationInfo.validate(response.content); + } + }); + + it("throws an error if connection string is not configured", async () => { + const response = await integration.mcpClient().callTool({ + name, + arguments: validation().args, + }); + const content = getResponseContent(response.content); + expect(content).toContain("You need to connect to a MongoDB instance before you can access its data."); + }); + }); +} diff --git a/tests/integration/tools/mongodb/read/count.test.ts b/tests/integration/tools/mongodb/read/count.test.ts index 4a6fcb69..48d31077 100644 --- a/tests/integration/tools/mongodb/read/count.test.ts +++ b/tests/integration/tools/mongodb/read/count.test.ts @@ -1,11 +1,9 @@ -import { describeWithMongoDB } from "../mongodbHelpers.js"; +import { describeWithMongoDB, validateAutoConnectBehavior } from "../mongodbHelpers.js"; import { getResponseContent, dbOperationParameters, - setupIntegrationTest, validateToolMetadata, - validateAutoConnectBehavior, validateThrowsForInvalidArguments, } from "../../../helpers.js";