|
1 | 1 | use pretty_assertions::assert_eq; |
2 | 2 |
|
3 | | -use mongodb::Client; |
4 | 3 | use mongodb::bson::{Document, doc}; |
5 | 4 | use mongodb::options::ClientOptions; |
| 5 | +use mongodb::{Client, Database}; |
6 | 6 | use mongodm::{CollectionConfig, Index, IndexOption, Indexes, sync_indexes}; |
7 | 7 |
|
| 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 | + |
8 | 46 | struct OneSyncCollConf; |
9 | 47 |
|
10 | 48 | impl CollectionConfig for OneSyncCollConf { |
@@ -33,40 +71,8 @@ async fn one_sync() { |
33 | 71 |
|
34 | 72 | sync_indexes::<OneSyncCollConf>(&db).await.unwrap(); |
35 | 73 |
|
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); |
70 | 76 | } |
71 | 77 |
|
72 | 78 | struct MultipleSyncCollConf; |
@@ -125,116 +131,20 @@ async fn multiple_sync() { |
125 | 131 |
|
126 | 132 | sync_indexes::<MultipleSyncCollConf>(&db).await.unwrap(); |
127 | 133 |
|
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); |
163 | 136 |
|
164 | 137 | sync_indexes::<MultipleNoLastSeenCollConf>(&db) |
165 | 138 | .await |
166 | 139 | .unwrap(); |
167 | 140 |
|
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); |
202 | 143 |
|
203 | 144 | sync_indexes::<MultipleNotUniqueCollConf>(&db) |
204 | 145 | .await |
205 | 146 | .unwrap(); |
206 | 147 |
|
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); |
240 | 150 | } |
0 commit comments