#[macro_use(bson)] extern crate ejdb; extern crate bson; extern crate tempdir; use tempdir::TempDir; use ejdb::meta::IndexType; use ejdb::query::{Q, QH}; use ejdb::{CollectionOptions, Database}; #[test] fn test_meta() { let (db, dir) = make_db(); db.collection("test_1") .unwrap() .save_all(vec![ bson!{ "name" => "Foo", "count" => 123 }, bson!{ "name" => "Bar", "whatever" => ["a", 1, 42.3] }, ]).unwrap(); let options = CollectionOptions::default() .compressed(true) .cached_records(512); let coll_2 = options.get_or_create(&db, "test_2").unwrap(); coll_2.index("name").string(true).set().unwrap(); coll_2.index("count").number().set().unwrap(); let meta = db.get_metadata().unwrap(); assert_eq!(meta.file(), format!("{}/db", dir.path().display())); let collections: Vec<_> = meta.collections().collect(); assert_eq!(collections.len(), 2); for coll in collections { match coll.name() { "test_1" => { assert_eq!(coll.file(), format!("{}/db_test_1", dir.path().display())); assert_eq!(coll.records(), 2); assert_eq!(coll.buckets(), 262139); assert_eq!(coll.cached_records(), 0); assert_eq!(coll.compressed(), false); assert_eq!(coll.large(), false); assert_eq!(coll.indices().len(), 0); } "test_2" => { assert_eq!(coll.file(), format!("{}/db_test_2", dir.path().display())); assert_eq!(coll.records(), 0); assert_eq!(coll.buckets(), 262139); assert_eq!(coll.cached_records(), 512); assert_eq!(coll.compressed(), true); assert_eq!(coll.large(), false); let indices: Vec<_> = coll.indices().collect(); assert_eq!(indices.len(), 2); for index in indices { match index.field() { "name" => { assert_eq!(index.name(), "sname"); assert_eq!( index.file(), Some(&*format!( "{}/db_test_2.idx.sname.lex", dir.path().display() )) ); assert_eq!(index.records(), Some(0)); assert_eq!(index.index_type(), IndexType::Lexical); } "count" => { assert_eq!(index.name(), "ncount"); assert_eq!( index.file(), Some(&*format!( "{}/db_test_2.idx.ncount.dec", dir.path().display() )) ); assert_eq!(index.records(), Some(0)); assert_eq!(index.index_type(), IndexType::Decimal); } _ => panic!("unknown index: {:?}", index), } } } _ => panic!("unknown collection: {:?}", coll), } } } #[test] fn test_save_load() { let (db, _dir) = make_db(); let coll = db.collection("test").unwrap(); let ids = coll .save_all(vec![ bson!{ "name" => "Foo", "count" => 123 }, bson!{ "name" => "Bar", "items" => [1, "hello", 42.3] }, bson!{ "title" => "Baz", "subobj" => { "key" => "a", "xyz" => 632 } }, ]).unwrap(); assert_eq!(ids.len(), 3); let item_1 = coll.load(&ids[0]).unwrap().unwrap(); assert_eq!( item_1, bson! { "_id" => (ids[0].clone()), "name" => "Foo", "count" => 123 } ); let item_2 = coll.load(&ids[1]).unwrap().unwrap(); assert_eq!( item_2, bson! { "_id" => (ids[1].clone()), "name" => "Bar", "items" => [1, "hello", 42.3] } ); let item_3 = coll.load(&ids[2]).unwrap().unwrap(); assert_eq!( item_3, bson! { "_id" => (ids[2].clone()), "title" => "Baz", "subobj" => { "key" => "a", "xyz" => 632 } } ); } #[test] fn test_query() { let (db, _dir) = make_db(); let coll = db.collection("test").unwrap(); let ids = coll .save_all(vec![ bson!{ "name" => "Foo", "count" => 123 }, bson!{ "name" => "Foo Foo", "count" => 345 }, bson!{ "name" => "Foo Bar", "count" => 23 }, bson!{ "name" => "Bar", "items" => [1, "hello", 42.3] }, bson!{ "title" => "Baz", "subobj" => { "key" => "a", "xyz" => 632 } }, ]).unwrap(); let n_foo = coll .query( Q.field("name").eq(("Foo".to_owned(), "".to_owned())), QH.empty(), ).count() .unwrap(); assert_eq!(n_foo, 3); let n_bar = coll .query( Q.field("name").eq(("Bar".to_owned(), "".to_owned())), QH.empty(), ).count() .unwrap(); assert_eq!(n_bar, 2); let foos = coll .query(Q.field("count").gt(100), QH.order_by("count").desc()) .find() .unwrap(); let foos_vec: ejdb::Result> = foos.collect(); assert_eq!( foos_vec.unwrap(), vec![ bson! { "_id" => (ids[1].clone()), "name" => "Foo Foo", "count" => 345 }, bson! { "_id" => (ids[0].clone()), "name" => "Foo", "count" => 123 } ] ); let baz = coll .query(Q.field("subobj.xyz").eq(632), QH.empty()) .find_one() .unwrap(); assert!(baz.is_some()); assert_eq!( baz.unwrap(), bson! { "_id" => (ids[4].clone()), "title" => "Baz", "subobj" => { "key" => "a", "xyz" => 632 } } ); let result = coll .query( Q.field("items") .exists(true) .push_all("items", vec![1, 2, 3]), QH.empty(), ).update() .unwrap(); assert_eq!(result, 1); let bar = coll.load(&ids[3]).unwrap().unwrap(); assert_eq!( bar, bson! { "_id" => (ids[3].clone()), "name" => "Bar", "items" => [1, "hello", 42.3, 1, 2, 3] } ); } fn make_db() -> (Database, TempDir) { let dir = TempDir::new("ejdb").expect("cannot create temporary directory"); let db = Database::open(dir.path().join("db").to_str().unwrap()).expect("cannot create database"); (db, dir) }