feat: add document test

This commit is contained in:
nathan 2023-03-16 21:01:36 +08:00
parent 2bc939479c
commit 0ce76c5a89
10 changed files with 188 additions and 31 deletions

1
Cargo.lock generated
View File

@ -2253,6 +2253,7 @@ dependencies = [
"bincode",
"serde",
"sled",
"tempfile",
"thiserror",
]

View File

@ -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"

View File

@ -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?;

View File

@ -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,

View File

@ -1,4 +1,4 @@
mod db;
pub mod db;
pub mod document;
pub mod error;
pub mod range;

View File

@ -1,2 +0,0 @@
#[test]
fn read_document() {}

View File

@ -0,0 +1,2 @@
mod test;
mod util;

View File

@ -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);
}

View File

@ -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()
}

View File

@ -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 "
}
}