Skip to content

Commit 55618a6

Browse files
authored
chore: fix tests (#112)
1 parent e40c492 commit 55618a6

14 files changed

+62
-114
lines changed

tests/integration/helpers.ts

+2-74
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,12 @@
11
import { Client } from "@modelcontextprotocol/sdk/client/index.js";
22
import { InMemoryTransport } from "./inMemoryTransport.js";
33
import { Server } from "../../src/server.js";
4-
import runner, { MongoCluster } from "mongodb-runner";
5-
import path from "path";
6-
import fs from "fs/promises";
7-
import { MongoClient, ObjectId } from "mongodb";
8-
import { toIncludeAllMembers } from "jest-extended";
4+
import { ObjectId } from "mongodb";
95
import { config, UserConfig } from "../../src/config.js";
106
import { McpError } from "@modelcontextprotocol/sdk/types.js";
117
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
128
import { Session } from "../../src/session.js";
9+
import { toIncludeAllMembers } from "jest-extended";
1310

1411
interface ParameterInfo {
1512
name: string;
@@ -98,31 +95,9 @@ export function setupIntegrationTest(userConfig: UserConfig = config): Integrati
9895
return mcpServer;
9996
};
10097

101-
const getConnectionString = () => {
102-
if (!mongoCluster) {
103-
throw new Error("beforeAll() hook not ran yet");
104-
}
105-
106-
return mongoCluster.connectionString;
107-
};
108-
10998
return {
11099
mcpClient: getMcpClient,
111100
mcpServer: getMcpServer,
112-
mongoClient: () => {
113-
if (!mongoClient) {
114-
mongoClient = new MongoClient(getConnectionString());
115-
}
116-
return mongoClient;
117-
},
118-
connectionString: getConnectionString,
119-
connectMcpClient: async () => {
120-
await getMcpClient().callTool({
121-
name: "connect",
122-
arguments: { options: [{ connectionString: getConnectionString() }] },
123-
});
124-
},
125-
randomDbName: () => randomDbName,
126101
};
127102
}
128103

@@ -199,52 +174,6 @@ export function validateToolMetadata(
199174
});
200175
}
201176

202-
export function validateAutoConnectBehavior(
203-
integration: IntegrationTest,
204-
name: string,
205-
validation: () => {
206-
args: { [x: string]: unknown };
207-
expectedResponse?: string;
208-
validate?: (content: unknown) => void;
209-
},
210-
beforeEachImpl?: () => Promise<void>
211-
): void {
212-
describe("when not connected", () => {
213-
if (beforeEachImpl) {
214-
beforeEach(() => beforeEachImpl());
215-
}
216-
217-
it("connects automatically if connection string is configured", async () => {
218-
config.connectionString = integration.connectionString();
219-
220-
const validationInfo = validation();
221-
222-
const response = await integration.mcpClient().callTool({
223-
name,
224-
arguments: validationInfo.args,
225-
});
226-
227-
if (validationInfo.expectedResponse) {
228-
const content = getResponseContent(response.content);
229-
expect(content).toContain(validationInfo.expectedResponse);
230-
}
231-
232-
if (validationInfo.validate) {
233-
validationInfo.validate(response.content);
234-
}
235-
});
236-
237-
it("throws an error if connection string is not configured", async () => {
238-
const response = await integration.mcpClient().callTool({
239-
name,
240-
arguments: validation().args,
241-
});
242-
const content = getResponseContent(response.content);
243-
expect(content).toContain("You need to connect to a MongoDB instance before you can access its data.");
244-
});
245-
});
246-
}
247-
248177
export function validateThrowsForInvalidArguments(
249178
integration: IntegrationTest,
250179
name: string,
@@ -253,7 +182,6 @@ export function validateThrowsForInvalidArguments(
253182
describe("with invalid arguments", () => {
254183
for (const arg of args) {
255184
it(`throws a schema error for: ${JSON.stringify(arg)}`, async () => {
256-
await integration.connectMcpClient();
257185
try {
258186
await integration.mcpClient().callTool({ name, arguments: arg });
259187
expect.fail("Expected an error to be thrown");

tests/integration/tools/mongodb/create/createCollection.test.ts

+1-3
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,9 @@
1-
import { describeWithMongoDB } from "../mongodbHelpers.js";
1+
import { describeWithMongoDB, validateAutoConnectBehavior } from "../mongodbHelpers.js";
22

33
import {
44
getResponseContent,
55
dbOperationParameters,
6-
setupIntegrationTest,
76
validateToolMetadata,
8-
validateAutoConnectBehavior,
97
validateThrowsForInvalidArguments,
108
dbOperationInvalidArgTests,
119
} from "../../../helpers.js";

tests/integration/tools/mongodb/create/createIndex.test.ts

+1-3
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,9 @@
1-
import { describeWithMongoDB } from "../mongodbHelpers.js";
1+
import { describeWithMongoDB, validateAutoConnectBehavior } from "../mongodbHelpers.js";
22

33
import {
44
getResponseContent,
55
dbOperationParameters,
6-
setupIntegrationTest,
76
validateToolMetadata,
8-
validateAutoConnectBehavior,
97
validateThrowsForInvalidArguments,
108
} from "../../../helpers.js";
119
import { IndexDirection } from "mongodb";

tests/integration/tools/mongodb/create/insertMany.test.ts

+1-3
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,9 @@
1-
import { describeWithMongoDB } from "../mongodbHelpers.js";
1+
import { describeWithMongoDB, validateAutoConnectBehavior } from "../mongodbHelpers.js";
22

33
import {
44
getResponseContent,
55
dbOperationParameters,
6-
setupIntegrationTest,
76
validateToolMetadata,
8-
validateAutoConnectBehavior,
97
validateThrowsForInvalidArguments,
108
} from "../../../helpers.js";
119

tests/integration/tools/mongodb/delete/deleteMany.test.ts

+1-3
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,9 @@
1-
import { describeWithMongoDB } from "../mongodbHelpers.js";
1+
import { describeWithMongoDB, validateAutoConnectBehavior } from "../mongodbHelpers.js";
22

33
import {
44
getResponseContent,
55
dbOperationParameters,
6-
setupIntegrationTest,
76
validateToolMetadata,
8-
validateAutoConnectBehavior,
97
validateThrowsForInvalidArguments,
108
} from "../../../helpers.js";
119

tests/integration/tools/mongodb/delete/dropCollection.test.ts

+1-3
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,9 @@
1-
import { describeWithMongoDB } from "../mongodbHelpers.js";
1+
import { describeWithMongoDB, validateAutoConnectBehavior } from "../mongodbHelpers.js";
22

33
import {
44
getResponseContent,
55
dbOperationParameters,
6-
setupIntegrationTest,
76
validateToolMetadata,
8-
validateAutoConnectBehavior,
97
validateThrowsForInvalidArguments,
108
dbOperationInvalidArgTests,
119
} from "../../../helpers.js";

tests/integration/tools/mongodb/delete/dropDatabase.test.ts

+1-3
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,9 @@
1-
import { describeWithMongoDB } from "../mongodbHelpers.js";
1+
import { describeWithMongoDB, validateAutoConnectBehavior } from "../mongodbHelpers.js";
22

33
import {
44
getResponseContent,
55
dbOperationParameters,
6-
setupIntegrationTest,
76
validateToolMetadata,
8-
validateAutoConnectBehavior,
97
validateThrowsForInvalidArguments,
108
dbOperationInvalidArgTests,
119
} from "../../../helpers.js";

tests/integration/tools/mongodb/metadata/collectionSchema.test.ts

+1-3
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,10 @@
1-
import { describeWithMongoDB } from "../mongodbHelpers.js";
1+
import { describeWithMongoDB, validateAutoConnectBehavior } from "../mongodbHelpers.js";
22

33
import {
44
getResponseElements,
55
getResponseContent,
6-
setupIntegrationTest,
76
dbOperationParameters,
87
validateToolMetadata,
9-
validateAutoConnectBehavior,
108
validateThrowsForInvalidArguments,
119
dbOperationInvalidArgTests,
1210
} from "../../../helpers.js";

tests/integration/tools/mongodb/metadata/collectionStorageSize.test.ts

+1-3
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,9 @@
1-
import { describeWithMongoDB } from "../mongodbHelpers.js";
1+
import { describeWithMongoDB, validateAutoConnectBehavior } from "../mongodbHelpers.js";
22

33
import {
44
getResponseContent,
5-
setupIntegrationTest,
65
dbOperationParameters,
76
validateToolMetadata,
8-
validateAutoConnectBehavior,
97
dbOperationInvalidArgTests,
108
validateThrowsForInvalidArguments,
119
} from "../../../helpers.js";

tests/integration/tools/mongodb/metadata/connect.test.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { describeWithMongoDB } from "../mongodbHelpers.js";
22

3-
import { getResponseContent, setupIntegrationTest, validateToolMetadata } from "../../../helpers.js";
3+
import { getResponseContent, validateToolMetadata } from "../../../helpers.js";
44

55
import { config } from "../../../../../src/config.js";
66

tests/integration/tools/mongodb/metadata/listCollections.test.ts

+1-3
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,9 @@
1-
import { describeWithMongoDB } from "../mongodbHelpers.js";
1+
import { describeWithMongoDB, validateAutoConnectBehavior } from "../mongodbHelpers.js";
22

33
import {
44
getResponseElements,
55
getResponseContent,
6-
setupIntegrationTest,
76
validateToolMetadata,
8-
validateAutoConnectBehavior,
97
validateThrowsForInvalidArguments,
108
dbOperationInvalidArgTests,
119
} from "../../../helpers.js";

tests/integration/tools/mongodb/metadata/listDatabases.test.ts

+2-8
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,6 @@
1-
import { describeWithMongoDB } from "../mongodbHelpers.js";
1+
import { describeWithMongoDB, validateAutoConnectBehavior } from "../mongodbHelpers.js";
22

3-
import {
4-
getResponseElements,
5-
getParameters,
6-
setupIntegrationTest,
7-
validateAutoConnectBehavior,
8-
} from "../../../helpers.js";
9-
import { toIncludeSameMembers } from "jest-extended";
3+
import { getResponseElements, getParameters } from "../../../helpers.js";
104

115
describeWithMongoDB("listDatabases tool", (integration) => {
126
const defaultDatabases = ["admin", "config", "local"];

tests/integration/tools/mongodb/mongodbHelpers.ts

+47-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import runner, { MongoCluster } from "mongodb-runner";
22
import path from "path";
33
import fs from "fs/promises";
44
import { MongoClient, ObjectId } from "mongodb";
5-
import { IntegrationTest, setupIntegrationTest } from "../../helpers.js";
5+
import { getResponseContent, IntegrationTest, setupIntegrationTest } from "../../helpers.js";
66
import { UserConfig, config } from "../../../../src/config.js";
77

88
interface MongoDBIntegrationTest {
@@ -111,3 +111,49 @@ export function setupMongoDBIntegrationTest(
111111
randomDbName: () => randomDbName,
112112
};
113113
}
114+
115+
export function validateAutoConnectBehavior(
116+
integration: IntegrationTest & MongoDBIntegrationTest,
117+
name: string,
118+
validation: () => {
119+
args: { [x: string]: unknown };
120+
expectedResponse?: string;
121+
validate?: (content: unknown) => void;
122+
},
123+
beforeEachImpl?: () => Promise<void>
124+
): void {
125+
describe("when not connected", () => {
126+
if (beforeEachImpl) {
127+
beforeEach(() => beforeEachImpl());
128+
}
129+
130+
it("connects automatically if connection string is configured", async () => {
131+
config.connectionString = integration.connectionString();
132+
133+
const validationInfo = validation();
134+
135+
const response = await integration.mcpClient().callTool({
136+
name,
137+
arguments: validationInfo.args,
138+
});
139+
140+
if (validationInfo.expectedResponse) {
141+
const content = getResponseContent(response.content);
142+
expect(content).toContain(validationInfo.expectedResponse);
143+
}
144+
145+
if (validationInfo.validate) {
146+
validationInfo.validate(response.content);
147+
}
148+
});
149+
150+
it("throws an error if connection string is not configured", async () => {
151+
const response = await integration.mcpClient().callTool({
152+
name,
153+
arguments: validation().args,
154+
});
155+
const content = getResponseContent(response.content);
156+
expect(content).toContain("You need to connect to a MongoDB instance before you can access its data.");
157+
});
158+
});
159+
}

tests/integration/tools/mongodb/read/count.test.ts

+1-3
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,9 @@
1-
import { describeWithMongoDB } from "../mongodbHelpers.js";
1+
import { describeWithMongoDB, validateAutoConnectBehavior } from "../mongodbHelpers.js";
22

33
import {
44
getResponseContent,
55
dbOperationParameters,
6-
setupIntegrationTest,
76
validateToolMetadata,
8-
validateAutoConnectBehavior,
97
validateThrowsForInvalidArguments,
108
} from "../../../helpers.js";
119

0 commit comments

Comments
 (0)