1
+ import { MongoClient } from 'mongodb' ;
2
+ import { MongoDBDatabaseAdapter } from '../index' ;
3
+ import { v4 as uuidv4 } from 'uuid' ;
4
+ import { RAGKnowledgeItem , type UUID } from '@elizaos/core' ;
5
+
6
+ describe ( 'MongoDBAdapter' , ( ) => {
7
+ let adapter : MongoDBDatabaseAdapter ;
8
+ const testUrl = 'mongodb://mongodb:mongodb@localhost:27018' ;
9
+ const dbName = 'eliza_test' ;
10
+
11
+ beforeAll ( async ( ) => {
12
+ adapter = new MongoDBDatabaseAdapter ( new MongoClient ( testUrl ) , dbName ) ;
13
+ await adapter . init ( ) ;
14
+ } ) ;
15
+
16
+ afterAll ( async ( ) => {
17
+ await adapter . close ( ) ;
18
+ } ) ;
19
+
20
+ beforeEach ( async ( ) => {
21
+ // Clear the collections before each test
22
+ const client = new MongoClient ( testUrl ) ;
23
+ await client . connect ( ) ;
24
+ const db = client . db ( dbName ) ;
25
+ await db . collection ( 'knowledge' ) . deleteMany ( { } ) ;
26
+ await client . close ( ) ;
27
+ } ) ;
28
+
29
+ describe ( 'Knowledge Management' , ( ) => {
30
+ it ( 'should create and retrieve knowledge' , async ( ) => {
31
+ const testKnowledge : RAGKnowledgeItem = {
32
+ id : uuidv4 ( ) as UUID ,
33
+ agentId : uuidv4 ( ) as UUID ,
34
+ content : {
35
+ text : 'Test knowledge content' ,
36
+ metadata : {
37
+ isShared : false ,
38
+ isMain : true
39
+ }
40
+ } ,
41
+ embedding : new Float32Array ( [ 0.1 , 0.2 , 0.3 ] ) ,
42
+ createdAt : Date . now ( )
43
+ } ;
44
+
45
+ await adapter . createKnowledge ( testKnowledge ) ;
46
+
47
+ const retrieved = await adapter . getKnowledge ( { id : testKnowledge . id , agentId : testKnowledge . agentId } ) ;
48
+ expect ( retrieved ) . toHaveLength ( 1 ) ;
49
+ expect ( retrieved [ 0 ] . id ) . toBe ( testKnowledge . id ) ;
50
+ expect ( retrieved [ 0 ] . content . text ) . toBe ( testKnowledge . content . text ) ;
51
+ } ) ;
52
+
53
+ it ( 'should search knowledge by embedding' , async ( ) => {
54
+ const testKnowledge1 : RAGKnowledgeItem = {
55
+ id : uuidv4 ( ) as UUID ,
56
+ agentId : uuidv4 ( ) as UUID ,
57
+ content : {
58
+ text : 'First test knowledge' ,
59
+ metadata : { isShared : false }
60
+ } ,
61
+ embedding : new Float32Array ( [ 0.1 , 0.2 , 0.3 ] ) ,
62
+ createdAt : Date . now ( )
63
+ } ;
64
+
65
+ const testKnowledge2 : RAGKnowledgeItem = {
66
+ id : uuidv4 ( ) as UUID ,
67
+ agentId : uuidv4 ( ) as UUID ,
68
+ content : {
69
+ text : 'Second test knowledge' ,
70
+ metadata : { isShared : false }
71
+ } ,
72
+ embedding : new Float32Array ( [ 0.4 , 0.5 , 0.6 ] ) ,
73
+ createdAt : Date . now ( )
74
+ } ;
75
+
76
+ await adapter . createKnowledge ( testKnowledge1 ) ;
77
+ await adapter . createKnowledge ( testKnowledge2 ) ;
78
+
79
+ const searchResults = await adapter . searchKnowledge ( {
80
+ agentId : testKnowledge1 . agentId ,
81
+ embedding : new Float32Array ( [ 0.1 , 0.2 , 0.3 ] ) ,
82
+ match_count : 1 ,
83
+ match_threshold : 0.8
84
+ } ) ;
85
+
86
+ expect ( searchResults ) . toHaveLength ( 1 ) ;
87
+ expect ( searchResults [ 0 ] . id ) . toBe ( testKnowledge1 . id ) ;
88
+ } ) ;
89
+
90
+ it ( 'should remove knowledge' , async ( ) => {
91
+ const testKnowledge : RAGKnowledgeItem = {
92
+ id : uuidv4 ( ) as UUID ,
93
+ agentId : uuidv4 ( ) as UUID ,
94
+ content : {
95
+ text : 'Test knowledge to remove' ,
96
+ metadata : { isShared : false }
97
+ } ,
98
+ embedding : new Float32Array ( [ 0.1 , 0.2 , 0.3 ] ) ,
99
+ createdAt : Date . now ( )
100
+ } ;
101
+
102
+ await adapter . createKnowledge ( testKnowledge ) ;
103
+ await adapter . removeKnowledge ( testKnowledge . id ) ;
104
+
105
+ const retrieved = await adapter . getKnowledge ( { id : testKnowledge . id , agentId : testKnowledge . agentId } ) ;
106
+ expect ( retrieved ) . toHaveLength ( 0 ) ;
107
+ } ) ;
108
+ } ) ;
109
+
110
+ describe ( 'Cache Operations' , ( ) => {
111
+ it ( 'should set and get cache' , async ( ) => {
112
+ const agentId = uuidv4 ( ) ;
113
+ const key = 'test-key' ;
114
+ const value = 'test-value' ;
115
+
116
+ await adapter . setCache ( { key, agentId : agentId as UUID , value } ) ;
117
+ const retrieved = await adapter . getCache ( { key, agentId : agentId as UUID } ) ;
118
+
119
+ expect ( retrieved ) . toBe ( value ) ;
120
+ } ) ;
121
+
122
+ it ( 'should delete cache' , async ( ) => {
123
+ const agentId = uuidv4 ( ) ;
124
+ const key = 'test-key' ;
125
+ const value = 'test-value' ;
126
+
127
+ await adapter . setCache ( { key, agentId : agentId as UUID , value } ) ;
128
+ await adapter . deleteCache ( { key, agentId : agentId as UUID } ) ;
129
+
130
+ const retrieved = await adapter . getCache ( { key, agentId : agentId as UUID } ) ;
131
+ expect ( retrieved ) . toBeUndefined ( ) ;
132
+ } ) ;
133
+ } ) ;
134
+ } ) ;
0 commit comments