From 0ce76c5a8961856d7ac9ec2c8020d85e0ba88028 Mon Sep 17 00:00:00 2001 From: nathan Date: Thu, 16 Mar 2023 21:01:36 +0800 Subject: [PATCH] feat: add document test --- Cargo.lock | 1 + crates/revdb/Cargo.toml | 5 +- crates/revdb/src/db.rs | 2 +- crates/revdb/src/document.rs | 27 +++--- crates/revdb/src/lib.rs | 2 +- crates/revdb/tests/document.rs | 2 - crates/revdb/tests/document/mod.rs | 2 + crates/revdb/tests/document/test.rs | 134 ++++++++++++++++++++++++++++ crates/revdb/tests/document/util.rs | 7 ++ sqlx-data.json | 37 ++++---- 10 files changed, 188 insertions(+), 31 deletions(-) delete mode 100644 crates/revdb/tests/document.rs create mode 100644 crates/revdb/tests/document/mod.rs create mode 100644 crates/revdb/tests/document/test.rs create mode 100644 crates/revdb/tests/document/util.rs diff --git a/Cargo.lock b/Cargo.lock index 5d3aec97..913c6766 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2253,6 +2253,7 @@ dependencies = [ "bincode", "serde", "sled", + "tempfile", "thiserror", ] diff --git a/crates/revdb/Cargo.toml b/crates/revdb/Cargo.toml index 6e17eb18..9d876298 100644 --- a/crates/revdb/Cargo.toml +++ b/crates/revdb/Cargo.toml @@ -9,4 +9,7 @@ edition = "2021" sled = "0.34.7" thiserror = "1.0.30" serde = { version = "1.0", features = ["derive"] } -bincode = "1.3.3" \ No newline at end of file +bincode = "1.3.3" + +[dev-dependencies] +tempfile = "3.4.0" \ No newline at end of file diff --git a/crates/revdb/src/db.rs b/crates/revdb/src/db.rs index fb4fcb61..8adafcfd 100644 --- a/crates/revdb/src/db.rs +++ b/crates/revdb/src/db.rs @@ -27,7 +27,7 @@ impl RevDB { from_key: K, to_key: K, ) -> Result, RevDBError> { - let iter = self.db.range(from_key..to_key); + let iter = self.db.range(from_key..=to_key); let mut items = vec![]; for item in iter { let (_, value) = item?; diff --git a/crates/revdb/src/document.rs b/crates/revdb/src/document.rs index 7fdeac85..0b35a9ec 100644 --- a/crates/revdb/src/document.rs +++ b/crates/revdb/src/document.rs @@ -12,11 +12,10 @@ impl<'a> Document<'a> { &self, uid: i64, document_id: i64, - rev_id: i64, - data: &[u8], + value: DocumentRevData, ) -> Result<(), RevDBError> { - let key = make_document_key(uid, document_id, rev_id); - let _ = self.db.insert(key, data)?; + let key = make_document_key(uid, document_id, value.rev_id); + let _ = self.db.insert(key, &value.to_vec()?)?; Ok(()) } @@ -25,18 +24,24 @@ impl<'a> Document<'a> { uid: i64, document_id: i64, rev_id: i64, - ) -> Result>, RevDBError> { + ) -> Result, RevDBError> { let key = make_document_key(uid, document_id, rev_id); - let value = self.db.get(key)?; - Ok(value.map(|value| value.to_vec())) + match self.db.get(key)? { + None => Ok(None), + Some(value) => { + let data = DocumentRevData::from_vec(value.as_ref())?; + Ok(Some(data)) + } + } } - pub fn get_with_range( + pub fn get_with_range>( &self, uid: i64, document_id: i64, - range: RevRange, + range: R, ) -> Result, RevDBError> { + let range = range.into(); let from = make_document_key(uid, document_id, range.start); let to = make_document_key(uid, document_id, range.end); self.batch_get(from, to) @@ -64,7 +69,7 @@ impl<'a> Document<'a> { self.batch_get(from, to) } - pub fn batch_get>( + fn batch_get>( &self, from: K, to: K, @@ -79,7 +84,7 @@ impl<'a> Document<'a> { } } -#[derive(Debug, Serialize, Deserialize)] +#[derive(Debug, Clone, Serialize, Deserialize)] pub struct DocumentRevData { #[serde(rename = "rid")] pub rev_id: i64, diff --git a/crates/revdb/src/lib.rs b/crates/revdb/src/lib.rs index 75ae3967..d6cf3006 100644 --- a/crates/revdb/src/lib.rs +++ b/crates/revdb/src/lib.rs @@ -1,4 +1,4 @@ -mod db; +pub mod db; pub mod document; pub mod error; pub mod range; diff --git a/crates/revdb/tests/document.rs b/crates/revdb/tests/document.rs deleted file mode 100644 index b61455dd..00000000 --- a/crates/revdb/tests/document.rs +++ /dev/null @@ -1,2 +0,0 @@ -#[test] -fn read_document() {} diff --git a/crates/revdb/tests/document/mod.rs b/crates/revdb/tests/document/mod.rs new file mode 100644 index 00000000..89c3cfa9 --- /dev/null +++ b/crates/revdb/tests/document/mod.rs @@ -0,0 +1,2 @@ +mod test; +mod util; diff --git a/crates/revdb/tests/document/test.rs b/crates/revdb/tests/document/test.rs new file mode 100644 index 00000000..71552cce --- /dev/null +++ b/crates/revdb/tests/document/test.rs @@ -0,0 +1,134 @@ +use crate::document::util::make_test_db; +use revdb::document::{Document, DocumentRevData}; +use revdb::range::RevRange; + +#[test] +fn insert_text() { + let db = make_test_db(); + let document = db.document(); + let uid = 12345678; + let document_id = 1; + let value = DocumentRevData { + rev_id: 0, + base_rev_id: 0, + content: "hello world".to_string(), + }; + document.insert(uid, document_id, value.clone()).unwrap(); + + let restored_data = document.get(uid, document_id, 0).unwrap().unwrap(); + assert_eq!(value.content, restored_data.content); +} + +#[test] +fn insert_multi_text() { + let db = make_test_db(); + let document = db.document(); + let uid = 12345678; + let document_id = 1; + + let mut base_rev_id = 0; + let mut expected_str = "".to_string(); + for i in 0..=100 { + let content = i.to_string(); + expected_str.push_str(&content); + let value = DocumentRevData { + rev_id: i, + base_rev_id, + content, + }; + base_rev_id += 1; + document.insert(uid, document_id, value).unwrap(); + } + // + let restored_str = document + .get_with_range(uid, document_id, RevRange::new(0, 100)) + .unwrap() + .into_iter() + .map(|data| data.content) + .collect::>() + .join(""); + + assert_eq!(expected_str, restored_str); +} + +fn insert_100_string_to_document(uid: i64, document_id: i64, document: &Document) { + let mut base_rev_id = 0; + for i in 0..=100 { + let content = i.to_string(); + let value = DocumentRevData { + rev_id: i, + base_rev_id, + content, + }; + base_rev_id += 1; + document.insert(uid, document_id, value).unwrap(); + } +} + +fn values_to_string(values: Vec) -> String { + values + .into_iter() + .map(|data| data.content) + .collect::>() + .join("") +} + +#[test] +fn get_value_before() { + let db = make_test_db(); + let document = db.document(); + let uid = 12345678; + let document_id = 1; + insert_100_string_to_document(uid, document_id, &document); + + let restored_str = values_to_string(document.get_before(uid, document_id, 50).unwrap()); + assert_eq!("01234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950", restored_str); + + let restored_str = values_to_string(document.get_before(uid, document_id, 0).unwrap()); + assert_eq!("0", restored_str); +} + +#[test] +fn get_value_after() { + let db = make_test_db(); + let document = db.document(); + let uid = 12345678; + let document_id = 1; + insert_100_string_to_document(uid, document_id, &document); + + let restored_str = values_to_string(document.get_after(uid, document_id, 50).unwrap()); + assert_eq!("5051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100", restored_str); + + let restored_str = values_to_string(document.get_after(uid, document_id, 100).unwrap()); + assert_eq!("100", restored_str); +} + +#[test] +fn get_value_with_range() { + let db = make_test_db(); + let document = db.document(); + let uid = 12345678; + let document_id = 1; + insert_100_string_to_document(uid, document_id, &document); + + let restored_str = values_to_string( + document + .get_with_range(uid, document_id, RevRange::new(50, 60)) + .unwrap(), + ); + assert_eq!("5051525354555657585960", restored_str); + + let restored_str = values_to_string( + document + .get_with_range(uid, document_id, RevRange::new(50, 200)) + .unwrap(), + ); + assert_eq!("5051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100", restored_str); + + let restored_str = values_to_string( + document + .get_with_range(uid, document_id, RevRange::new(50, 50)) + .unwrap(), + ); + assert_eq!("50", restored_str); +} diff --git a/crates/revdb/tests/document/util.rs b/crates/revdb/tests/document/util.rs new file mode 100644 index 00000000..75b45246 --- /dev/null +++ b/crates/revdb/tests/document/util.rs @@ -0,0 +1,7 @@ +use revdb::db::RevDB; +use tempfile::TempDir; + +pub fn make_test_db() -> RevDB { + let tempdir = TempDir::new().unwrap(); + RevDB::open(tempdir).unwrap() +} diff --git a/sqlx-data.json b/sqlx-data.json index 53978b56..3c7b16dd 100644 --- a/sqlx-data.json +++ b/sqlx-data.json @@ -6,7 +6,7 @@ "nullable": [], "parameters": { "Left": [ - "Uuid", + "Int8", "Text", "Text", "Timestamptz", @@ -16,13 +16,33 @@ }, "query": "\n INSERT INTO users (uid, email, username, create_time, password)\n VALUES ($1, $2, $3, $4, $5)\n " }, + "3502aac2e0b7e80c2afdf7aba85cd1bfa9dd7f6b95d711bb1dee50c6fae2f061": { + "describe": { + "columns": [ + { + "name": "email", + "ordinal": 0, + "type_info": "Text" + } + ], + "nullable": [ + false + ], + "parameters": { + "Left": [ + "Int8" + ] + } + }, + "query": "\n SELECT email \n FROM users\n WHERE uid = $1\n " + }, "b188bb8915fa0fc8c5dfefa27f1b086b839633c3c4dc6e4991b43a608d46a170": { "describe": { "columns": [ { "name": "uid", "ordinal": 0, - "type_info": "Uuid" + "type_info": "Int8" }, { "name": "password", @@ -41,18 +61,5 @@ } }, "query": "\n SELECT uid, password\n FROM users\n WHERE email = $1\n " - }, - "b754835f0a1543fc32acbfee436f775e542036888e7a2051622efa435debb318": { - "describe": { - "columns": [], - "nullable": [], - "parameters": { - "Left": [ - "Text", - "Uuid" - ] - } - }, - "query": "\n UPDATE users\n SET password= $1\n WHERE uid = $2\n " } } \ No newline at end of file