feat: add document test
This commit is contained in:
parent
2bc939479c
commit
0ce76c5a89
|
|
@ -2253,6 +2253,7 @@ dependencies = [
|
|||
"bincode",
|
||||
"serde",
|
||||
"sled",
|
||||
"tempfile",
|
||||
"thiserror",
|
||||
]
|
||||
|
||||
|
|
|
|||
|
|
@ -9,4 +9,7 @@ edition = "2021"
|
|||
sled = "0.34.7"
|
||||
thiserror = "1.0.30"
|
||||
serde = { version = "1.0", features = ["derive"] }
|
||||
bincode = "1.3.3"
|
||||
bincode = "1.3.3"
|
||||
|
||||
[dev-dependencies]
|
||||
tempfile = "3.4.0"
|
||||
|
|
@ -27,7 +27,7 @@ impl RevDB {
|
|||
from_key: K,
|
||||
to_key: K,
|
||||
) -> Result<Vec<IVec>, 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?;
|
||||
|
|
|
|||
|
|
@ -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<Option<Vec<u8>>, RevDBError> {
|
||||
) -> Result<Option<DocumentRevData>, 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<R: Into<RevRange>>(
|
||||
&self,
|
||||
uid: i64,
|
||||
document_id: i64,
|
||||
range: RevRange,
|
||||
range: R,
|
||||
) -> Result<Vec<DocumentRevData>, 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<K: AsRef<[u8]>>(
|
||||
fn batch_get<K: AsRef<[u8]>>(
|
||||
&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,
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
mod db;
|
||||
pub mod db;
|
||||
pub mod document;
|
||||
pub mod error;
|
||||
pub mod range;
|
||||
|
|
|
|||
|
|
@ -1,2 +0,0 @@
|
|||
#[test]
|
||||
fn read_document() {}
|
||||
|
|
@ -0,0 +1,2 @@
|
|||
mod test;
|
||||
mod util;
|
||||
|
|
@ -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::<Vec<String>>()
|
||||
.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<DocumentRevData>) -> String {
|
||||
values
|
||||
.into_iter()
|
||||
.map(|data| data.content)
|
||||
.collect::<Vec<String>>()
|
||||
.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);
|
||||
}
|
||||
|
|
@ -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()
|
||||
}
|
||||
|
|
@ -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 "
|
||||
}
|
||||
}
|
||||
Loading…
Reference in New Issue