Skip to content

Commit 7f87ee7

Browse files
CBenoitCopilot
andcommitted
test: avoid version-dependent index metadata
MongoDB 7 omits per-index ns metadata from listIndexes responses. Assert index keys and uniqueness instead, while retaining stale index replacement coverage. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
1 parent ea9c14a commit 7f87ee7

1 file changed

Lines changed: 47 additions & 137 deletions

File tree

tests/indexes.rs

Lines changed: 47 additions & 137 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,48 @@
11
use pretty_assertions::assert_eq;
22

3-
use mongodb::Client;
43
use mongodb::bson::{Document, doc};
54
use mongodb::options::ClientOptions;
5+
use mongodb::{Client, Database};
66
use mongodm::{CollectionConfig, Index, IndexOption, Indexes, sync_indexes};
77

8+
async fn list_indexes(db: &Database, collection_name: &str) -> Vec<Document> {
9+
db.run_command(doc! { "listIndexes": collection_name })
10+
.await
11+
.unwrap()
12+
.get_document("cursor")
13+
.unwrap()
14+
.get_array("firstBatch")
15+
.unwrap()
16+
.iter()
17+
.map(|index| index.as_document().unwrap().clone())
18+
.collect()
19+
}
20+
21+
fn assert_synced_indexes(indexes: &[Document], expected_key: Document, expected_unique: bool) {
22+
assert_eq!(indexes.len(), 2);
23+
24+
let id_key = doc! { "_id": 1 };
25+
assert!(
26+
indexes
27+
.iter()
28+
.any(|index| index.get_document("key").is_ok_and(|key| key == &id_key))
29+
);
30+
31+
let expected_index = indexes
32+
.iter()
33+
.find(|index| {
34+
index
35+
.get_document("key")
36+
.is_ok_and(|key| key == &expected_key)
37+
})
38+
.unwrap();
39+
40+
assert_eq!(
41+
expected_index.get_bool("unique").ok(),
42+
expected_unique.then_some(true)
43+
);
44+
}
45+
846
struct OneSyncCollConf;
947

1048
impl CollectionConfig for OneSyncCollConf {
@@ -33,40 +71,8 @@ async fn one_sync() {
3371

3472
sync_indexes::<OneSyncCollConf>(&db).await.unwrap();
3573

36-
let ret = db
37-
.run_command(doc! { "listIndexes": OneSyncCollConf::collection_name() })
38-
.await
39-
.unwrap();
40-
41-
assert_eq!(
42-
ret,
43-
doc! {
44-
"cursor" : {
45-
"id" : 0i64,
46-
"ns" : "rust_mongo_orm_tests.one_sync",
47-
"firstBatch" : [
48-
{
49-
"v" : 2,
50-
"key" : {
51-
"_id" : 1
52-
},
53-
"name" : "_id_",
54-
"ns" : "rust_mongo_orm_tests.one_sync"
55-
},
56-
{
57-
"v" : 2,
58-
"unique" : true,
59-
"key" : {
60-
"field" : 1
61-
},
62-
"name" : "field_1",
63-
"ns" : "rust_mongo_orm_tests.one_sync"
64-
}
65-
]
66-
},
67-
"ok" : 1.0
68-
}
69-
);
74+
let indexes = list_indexes(&db, OneSyncCollConf::collection_name()).await;
75+
assert_synced_indexes(&indexes, doc! { "field": 1 }, true);
7076
}
7177

7278
struct MultipleSyncCollConf;
@@ -125,116 +131,20 @@ async fn multiple_sync() {
125131

126132
sync_indexes::<MultipleSyncCollConf>(&db).await.unwrap();
127133

128-
let ret = db
129-
.run_command(doc! { "listIndexes": MultipleSyncCollConf::collection_name() })
130-
.await
131-
.unwrap();
132-
133-
assert_eq!(
134-
ret,
135-
doc! {
136-
"cursor" : {
137-
"id" : 0i64,
138-
"ns" : "rust_mongo_orm_tests.multiple_sync",
139-
"firstBatch" : [
140-
{
141-
"v" : 2,
142-
"key" : {
143-
"_id" : 1
144-
},
145-
"name" : "_id_",
146-
"ns" : "rust_mongo_orm_tests.multiple_sync"
147-
},
148-
{
149-
"v" : 2,
150-
"unique" : true,
151-
"key" : {
152-
"field" : 1,
153-
"last_seen" : 1
154-
},
155-
"name" : "field_1_last_seen_1",
156-
"ns" : "rust_mongo_orm_tests.multiple_sync"
157-
}
158-
]
159-
},
160-
"ok" : 1.0
161-
}
162-
);
134+
let indexes = list_indexes(&db, MultipleSyncCollConf::collection_name()).await;
135+
assert_synced_indexes(&indexes, doc! { "field": 1, "last_seen": 1 }, true);
163136

164137
sync_indexes::<MultipleNoLastSeenCollConf>(&db)
165138
.await
166139
.unwrap();
167140

168-
let ret = db
169-
.run_command(doc! { "listIndexes": MultipleNoLastSeenCollConf::collection_name() })
170-
.await
171-
.unwrap();
172-
173-
assert_eq!(
174-
ret,
175-
doc! {
176-
"cursor" : {
177-
"id" : 0i64,
178-
"ns" : "rust_mongo_orm_tests.multiple_sync",
179-
"firstBatch" : [
180-
{
181-
"v" : 2,
182-
"key" : {
183-
"_id" : 1
184-
},
185-
"name" : "_id_",
186-
"ns" : "rust_mongo_orm_tests.multiple_sync"
187-
},
188-
{
189-
"v" : 2,
190-
"unique" : true,
191-
"key" : {
192-
"field" : 1,
193-
},
194-
"name" : "field_1",
195-
"ns" : "rust_mongo_orm_tests.multiple_sync"
196-
}
197-
]
198-
},
199-
"ok" : 1.0
200-
}
201-
);
141+
let indexes = list_indexes(&db, MultipleNoLastSeenCollConf::collection_name()).await;
142+
assert_synced_indexes(&indexes, doc! { "field": 1 }, true);
202143

203144
sync_indexes::<MultipleNotUniqueCollConf>(&db)
204145
.await
205146
.unwrap();
206147

207-
let ret = db
208-
.run_command(doc! { "listIndexes": MultipleNotUniqueCollConf::collection_name() })
209-
.await
210-
.unwrap();
211-
212-
assert_eq!(
213-
ret,
214-
doc! {
215-
"cursor" : {
216-
"id" : 0i64,
217-
"ns" : "rust_mongo_orm_tests.multiple_sync",
218-
"firstBatch" : [
219-
{
220-
"v" : 2,
221-
"key" : {
222-
"_id" : 1
223-
},
224-
"name" : "_id_",
225-
"ns" : "rust_mongo_orm_tests.multiple_sync"
226-
},
227-
{
228-
"v" : 2,
229-
"key" : {
230-
"field" : 1,
231-
},
232-
"name" : "field_1",
233-
"ns" : "rust_mongo_orm_tests.multiple_sync"
234-
}
235-
]
236-
},
237-
"ok" : 1.0
238-
}
239-
);
148+
let indexes = list_indexes(&db, MultipleNotUniqueCollConf::collection_name()).await;
149+
assert_synced_indexes(&indexes, doc! { "field": 1 }, false);
240150
}

0 commit comments

Comments
 (0)