use bson::Bson;
use mongodb::coll::options::WriteModel;
use mongodb::{Client, ThreadedClient};
use mongodb::db::ThreadedDatabase;
#[test]
fn bulk_ordered_insert_only() {
let client = Client::connect("localhost", 27017).unwrap();
let db = client.db("test-client-bulk");
let coll = db.collection("bulk_ordered_insert_only");
coll.drop().unwrap();
let models = (1..5)
.map(|i| {
WriteModel::InsertOne {
document: doc! {
"_id" => (i),
"x" => (i * 11)
},
}
})
.collect();
coll.bulk_write(models, true);
let cursor: Vec<_> = coll.find(None, None).unwrap().collect();
assert_eq!(cursor.len(), 4);
for (i, result) in cursor.into_iter().enumerate() {
let doc = result.unwrap();
let expected_id = i + 1;
match doc.get("_id") {
Some(&Bson::I32(j)) => assert_eq!(expected_id as i32, j),
_ => panic!("Invalid id: {:?}", doc),
}
match doc.get("x") {
Some(&Bson::I32(j)) => assert_eq!(11 * expected_id as i32, j),
_ => panic!("Invalid id: {:?}", doc),
}
}
}
#[test]
fn bulk_unordered_insert_only() {
let client = Client::connect("localhost", 27017).unwrap();
let db = client.db("test-client-bulk");
let coll = db.collection("bulk_unordered_insert_only");
coll.drop().unwrap();
let models = (1..5)
.map(|i| {
WriteModel::InsertOne {
document: doc! {
"_id" => (i),
"x" => (i * 11)
},
}
})
.collect();
coll.bulk_write(models, false);
let cursor: Vec<_> = coll.find(None, None).unwrap().collect();
assert_eq!(cursor.len(), 4);
for (i, result) in cursor.into_iter().enumerate() {
let doc = result.unwrap();
let expected_id = i + 1;
match doc.get("_id") {
Some(&Bson::I32(j)) => assert_eq!(expected_id as i32, j),
_ => panic!("Invalid id: {:?}", doc),
}
match doc.get("x") {
Some(&Bson::I32(j)) => assert_eq!(11 * expected_id as i32, j),
_ => panic!("Invalid id: {:?}", doc),
}
}
}
#[test]
fn bulk_ordered_mix() {
let models = vec![
WriteModel::InsertOne { document: doc! {
"_id" => (1),
"x" => (11)
}},
WriteModel::InsertOne { document: doc! {
"_id" => (2),
"x" => (22)
}},
WriteModel::InsertOne { document: doc! {
"_id" => (3),
"x" => (33)
}},
WriteModel::InsertOne { document: doc! {
"_id" => (4),
"x" => (44)
}},
WriteModel::ReplaceOne {
filter: doc! { "_id" => (3) },
replacement: doc! { "x" => (37) },
upsert: Some(true),
},
WriteModel::UpdateMany {
filter: doc! { "_id" => { "$lt" => (3) } },
update: doc! { "$inc" => { "x" => (1) } },
upsert: Some(false),
},
WriteModel::DeleteOne { filter: doc! {
"_id" => (4)
}},
WriteModel::InsertOne { document: doc! {
"_id" => (5),
"x" => (55)
}},
WriteModel::UpdateOne {
filter: doc! { "_id" => (6) },
update: doc! { "$set" => { "x" => (62) } },
upsert: Some(true)
},
WriteModel::InsertOne { document: doc! {
"_id" => (101),
"x" => ("dalmations")
}},
WriteModel::InsertOne { document: doc! {
"_id" => (102),
"x" => ("strawberries")
}},
WriteModel::InsertOne { document: doc! {
"_id" => (103),
"x" => ("blueberries")
}},
WriteModel::InsertOne { document: doc! {
"_id" => (104),
"x" => ("bananas")
}},
WriteModel::DeleteMany { filter: doc! {
"_id" => { "$gte" => (103) }
}},
];
let client = Client::connect("localhost", 27017).unwrap();
let db = client.db("test-client-bulk");
let coll = db.collection("bulk_ordered_mix");
coll.drop().unwrap();
let result = coll.bulk_write(models, true);
assert_eq!(result.inserted_count, 9);
assert_eq!(result.inserted_ids.len() as i32, result.inserted_count);
assert_eq!(result.matched_count, 3);
assert_eq!(result.modified_count, 3);
assert_eq!(result.deleted_count, 3);
assert_eq!(result.upserted_count, 1);
assert_eq!(result.upserted_ids.len() as i32, result.upserted_count);
macro_rules! check_value_in_tree {
($tree:expr, $key:expr, $value:expr) => {
match $tree.get(&$key).unwrap() {
&Bson::I32($value) => (),
&Bson::I64($value) => (),
id => panic!("Invalid inserted id at index {}: {:?}", $key, id)
}
};
}
check_value_in_tree!(result.inserted_ids, 0, 1);
check_value_in_tree!(result.inserted_ids, 1, 2);
check_value_in_tree!(result.inserted_ids, 2, 3);
check_value_in_tree!(result.inserted_ids, 3, 4);
check_value_in_tree!(result.inserted_ids, 7, 5);
check_value_in_tree!(result.inserted_ids, 9, 101);
check_value_in_tree!(result.inserted_ids, 10, 102);
check_value_in_tree!(result.inserted_ids, 11, 103);
check_value_in_tree!(result.inserted_ids, 12, 104);
check_value_in_tree!(result.upserted_ids, 8, 6);
}