use pickledb::error::ErrorType;
use pickledb::{PickleDb, PickleDbDumpPolicy};
#[macro_use(matches)]
extern crate matches;
extern crate fs2;
use fs2::FileExt;
use std::fs::File;
mod common;
#[test]
fn load_serialization_error_test() {
set_test_rsc!("json_db.db");
let mut db = PickleDb::new_json("json_db.db", PickleDbDumpPolicy::AutoDump);
db.set("num", &100).unwrap();
db.set("float", &1.1).unwrap();
db.set("string", &String::from("my string")).unwrap();
db.set("vec", &vec![1, 2, 3]).unwrap();
let load_as_bin = PickleDb::load_bin("json_db.db", PickleDbDumpPolicy::NeverDump);
assert!(load_as_bin.is_err());
let load_as_bin_err = load_as_bin.err().unwrap();
assert!(matches!(
load_as_bin_err.get_type(),
ErrorType::Serialization
));
assert_eq!(load_as_bin_err.to_string(), "Cannot deserialize DB");
let load_as_cbor = PickleDb::load_cbor("json_db.db", PickleDbDumpPolicy::NeverDump);
assert!(load_as_cbor.is_err());
let load_as_cbor_err = load_as_cbor.err().unwrap();
assert!(matches!(
load_as_cbor_err.get_type(),
ErrorType::Serialization
));
assert_eq!(load_as_cbor_err.to_string(), "Cannot deserialize DB");
assert!(PickleDb::load_yaml("json_db.db", PickleDbDumpPolicy::NeverDump).is_ok());
}
#[test]
fn load_error_test() {
let load_result = PickleDb::load_bin("doesnt_exists.db", PickleDbDumpPolicy::NeverDump);
assert!(load_result.is_err());
let load_result_err = load_result.err().unwrap();
assert!(matches!(load_result_err.get_type(), ErrorType::Io));
}
#[allow(clippy::cognitive_complexity)]
#[test]
fn dump_error_test() {
set_test_rsc!("dump_error_test.db");
if cfg!(not(target_os = "windows")) {
return;
}
let mut db = PickleDb::new_json("dump_error_test.db", PickleDbDumpPolicy::AutoDump);
db.set("num", &100).unwrap();
db.set("float", &1.1).unwrap();
db.set("string", &String::from("my string")).unwrap();
db.set("vec", &vec![1, 2, 3]).unwrap();
db.lcreate("list1").unwrap().lextend(&[1, 2, 3]);
let db_file = File::open("dump_error_test.db").unwrap();
db_file.lock_exclusive().unwrap();
let try_set = db.set("num", &200);
assert!(try_set.is_err());
let try_set_err = try_set.err().unwrap();
assert!(matches!(try_set_err.get_type(), ErrorType::Io));
assert_eq!(db.get::<i32>("num").unwrap(), 100);
let try_dump = db.dump();
assert!(try_dump.is_err());
let try_dump_err = try_dump.err().unwrap();
assert!(matches!(try_dump_err.get_type(), ErrorType::Io));
let try_rem = db.rem("num");
assert!(try_rem.is_err());
let try_rem_err = try_rem.err().unwrap();
assert!(matches!(try_rem_err.get_type(), ErrorType::Io));
assert_eq!(db.get::<i32>("num").unwrap(), 100);
let try_lcreate = db.lcreate("list2");
assert!(try_lcreate.is_err());
let try_lcreate_err = try_lcreate.err().unwrap();
assert!(matches!(try_lcreate_err.get_type(), ErrorType::Io));
let try_ladd = db.ladd("list1", &100);
assert!(try_ladd.is_none());
assert_eq!(db.llen("list1"), 3);
let try_lextend = db.lextend("list1", &["aa", "bb"]);
assert!(try_lextend.is_none());
assert_eq!(db.llen("list1"), 3);
let try_lrem_list = db.lrem_list("list1");
assert!(try_lrem_list.is_err());
let try_lrem_list_err = try_lrem_list.err().unwrap();
assert!(matches!(try_lrem_list_err.get_type(), ErrorType::Io));
assert!(db.exists("list1"));
let try_lpop = db.lpop::<i32>("list1", 0);
assert!(try_lpop.is_none());
assert_eq!(db.llen("list1"), 3);
let try_lrem_value = db.lrem_value("list1", &1);
assert!(try_lrem_value.is_err());
let try_lrem_value_err = try_lrem_value.err().unwrap();
assert!(matches!(try_lrem_value_err.get_type(), ErrorType::Io));
assert_eq!(db.llen("list1"), 3);
db_file.unlock().unwrap();
}