@@ -53,10 +53,12 @@ function setupForClassicIndexes(integration: MongoDBIntegrationTestCase): {
5353
5454function setupForVectorSearchIndexes ( integration : MongoDBIntegrationTestCase ) : {
5555 getMoviesCollection : ( ) => Collection ;
56- getIndexName : ( ) => string ;
56+ getSearchIndexName : ( ) => string ;
57+ getVectorIndexName : ( ) => string ;
5758} {
5859 let moviesCollection : Collection ;
5960 const indexName = "searchIdx" ;
61+ const vectorIndexName = "vectorIdx" ;
6062 beforeEach ( async ( ) => {
6163 await integration . connectMcpClient ( ) ;
6264 const mongoClient = integration . mongoClient ( ) ;
@@ -65,14 +67,24 @@ function setupForVectorSearchIndexes(integration: MongoDBIntegrationTestCase): {
6567 {
6668 name : "Movie1" ,
6769 plot : "This is a horrible movie about a database called BongoDB and how it tried to copy the OG MangoDB." ,
70+ embeddings : [ 0.1 , 0.2 , 0.3 , 0.4 ] ,
6871 } ,
6972 ] ) ;
7073 await waitUntilSearchIsReady ( mongoClient ) ;
7174 await moviesCollection . createSearchIndex ( {
7275 name : indexName ,
73- definition : { mappings : { dynamic : true } } ,
76+ definition : { mappings : { fields : { plot : { type : "string" } } } } ,
77+ type : "search" ,
78+ } ) ;
79+ await moviesCollection . createSearchIndex ( {
80+ name : vectorIndexName ,
81+ definition : {
82+ fields : [ { path : "embeddings" , type : "vector" , numDimensions : 4 , similarity : "euclidean" } ] ,
83+ } ,
84+ type : "vectorSearch" ,
7485 } ) ;
7586 await waitUntilSearchIndexIsListed ( moviesCollection , indexName ) ;
87+ await waitUntilSearchIndexIsListed ( moviesCollection , vectorIndexName ) ;
7688 } ) ;
7789
7890 afterEach ( async ( ) => {
@@ -82,7 +94,8 @@ function setupForVectorSearchIndexes(integration: MongoDBIntegrationTestCase): {
8294
8395 return {
8496 getMoviesCollection : ( ) => moviesCollection ,
85- getIndexName : ( ) => indexName ,
97+ getSearchIndexName : ( ) => indexName ,
98+ getVectorIndexName : ( ) => vectorIndexName ,
8699 } ;
87100}
88101
@@ -341,7 +354,8 @@ describe.each([{ vectorSearchEnabled: false }, { vectorSearchEnabled: true }])(
341354 describeWithMongoDB (
342355 "when connected to MongoDB with search support" ,
343356 ( integration ) => {
344- const { getIndexName } = setupForVectorSearchIndexes ( integration ) ;
357+ const { getSearchIndexName, getVectorIndexName, getMoviesCollection } =
358+ setupForVectorSearchIndexes ( integration ) ;
345359
346360 describe . each ( [
347361 {
@@ -362,35 +376,39 @@ describe.each([{ vectorSearchEnabled: false }, { vectorSearchEnabled: true }])(
362376 collection : "movies" ,
363377 indexName : "non-existent-index" ,
364378 } ,
365- ] ) (
366- "and attempting to delete $title (namespace - $database $collection)" ,
367- ( { database, collection, indexName } ) => {
368- it ( "should fail with appropriate error" , async ( ) => {
369- const response = await integration . mcpClient ( ) . callTool ( {
370- name : "drop-index" ,
371- arguments : { database, collection, indexName, type : "search" } ,
372- } ) ;
373- expect ( response . isError ) . toBe ( true ) ;
374- const content = getResponseContent ( response . content ) ;
375- expect ( content ) . toContain ( "Index does not exist in the provided namespace." ) ;
379+ ] ) ( "and attempting to delete $title" , ( { database, collection, indexName } ) => {
380+ it ( "should fail with appropriate error" , async ( ) => {
381+ const response = await integration . mcpClient ( ) . callTool ( {
382+ name : "drop-index" ,
383+ arguments : { database, collection, indexName, type : "search" } ,
384+ } ) ;
385+ expect ( response . isError ) . toBe ( true ) ;
386+ const content = getResponseContent ( response . content ) ;
387+ expect ( content ) . toContain ( "Index does not exist in the provided namespace." ) ;
376388
377- const data = getDataFromUntrustedContent ( content ) ;
378- expect ( JSON . parse ( data ) ) . toMatchObject ( {
379- indexName,
380- namespace : `${ database } .${ collection } ` ,
381- } ) ;
389+ const data = getDataFromUntrustedContent ( content ) ;
390+ expect ( JSON . parse ( data ) ) . toMatchObject ( {
391+ indexName,
392+ namespace : `${ database } .${ collection } ` ,
382393 } ) ;
383- }
384- ) ;
394+ } ) ;
395+ } ) ;
385396
386- describe ( "and attempting to delete an existing index" , ( ) => {
397+ describe . each ( [
398+ { description : "search" , indexName : getSearchIndexName ( ) } ,
399+ { description : "vector search" , indexName : getVectorIndexName ( ) } ,
400+ ] ) ( "and attempting to delete an existing $description index" , ( { indexName } ) => {
387401 it ( "should succeed in deleting the index" , async ( ) => {
402+ const collection = getMoviesCollection ( ) ;
403+ let indexes = await collection . listSearchIndexes ( ) . toArray ( ) ;
404+ expect ( indexes . find ( ( idx ) => idx . name === indexName ) ) . toBeDefined ( ) ;
405+
388406 const response = await integration . mcpClient ( ) . callTool ( {
389407 name : "drop-index" ,
390408 arguments : {
391- database : "mflix" ,
392- collection : "movies" ,
393- indexName : getIndexName ( ) ,
409+ database : collection . dbName ,
410+ collection : collection . collectionName ,
411+ indexName,
394412 type : "search" ,
395413 } ,
396414 } ) ;
@@ -401,9 +419,12 @@ describe.each([{ vectorSearchEnabled: false }, { vectorSearchEnabled: true }])(
401419
402420 const data = getDataFromUntrustedContent ( content ) ;
403421 expect ( JSON . parse ( data ) ) . toMatchObject ( {
404- indexName : getIndexName ( ) ,
422+ indexName,
405423 namespace : "mflix.movies" ,
406424 } ) ;
425+
426+ indexes = await collection . listSearchIndexes ( ) . toArray ( ) ;
427+ expect ( indexes . find ( ( idx ) => idx . name === indexName ) ) . toBeUndefined ( ) ;
407428 } ) ;
408429 } ) ;
409430 } ,
@@ -417,7 +438,7 @@ describe.each([{ vectorSearchEnabled: false }, { vectorSearchEnabled: true }])(
417438 describeWithMongoDB (
418439 "when invoked via an elicitation enabled client" ,
419440 ( integration ) => {
420- const { getIndexName } = setupForVectorSearchIndexes ( integration ) ;
441+ const { getSearchIndexName : getIndexName } = setupForVectorSearchIndexes ( integration ) ;
421442 let dropSearchIndexSpy : MockInstance ;
422443
423444 beforeEach ( ( ) => {
0 commit comments