mongodb 0.3.5

A native MongoDB driver developed under MongoDB labs.
Documentation
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);
}