aboutsummaryrefslogtreecommitdiff
path: root/database/src/kv/tests.rs
diff options
context:
space:
mode:
Diffstat (limited to 'database/src/kv/tests.rs')
-rw-r--r--database/src/kv/tests.rs142
1 files changed, 142 insertions, 0 deletions
diff --git a/database/src/kv/tests.rs b/database/src/kv/tests.rs
new file mode 100644
index 0000000..5b587ed
--- /dev/null
+++ b/database/src/kv/tests.rs
@@ -0,0 +1,142 @@
+use crate::{
+ Database, Filter, Query, Sort,
+ test_shared::{AGE, NAME, new_alice, new_bob, new_charlie},
+};
+use anyhow::Result;
+use jellyobject::Path;
+
+#[test]
+pub fn insert_get() -> Result<()> {
+ let db = jellykv::memory::new();
+
+ let mut bob_row = 0;
+ db.transaction(&mut |txn| {
+ bob_row = txn.insert(new_bob())?;
+ Ok(())
+ })?;
+
+ let mut bob = None;
+ db.transaction(&mut |txn| {
+ bob = txn.get(bob_row)?;
+ Ok(())
+ })?;
+
+ assert_eq!(bob.unwrap().as_object().get(NAME).unwrap(), "Bob");
+ Ok(())
+}
+
+#[test]
+pub fn update() -> Result<()> {
+ let db = jellykv::memory::new();
+
+ let mut bob_row = 0;
+ let mut bob = None;
+
+ db.transaction(&mut |txn| {
+ bob_row = txn.insert(new_bob())?;
+ Ok(())
+ })?;
+ db.transaction(&mut |txn| {
+ let better_bob = new_bob().as_object().insert(NAME, "Better Bob");
+ txn.update(bob_row, better_bob)?;
+ Ok(())
+ })?;
+ db.transaction(&mut |txn| {
+ bob = txn.get(bob_row)?;
+ Ok(())
+ })?;
+
+ assert_eq!(bob.unwrap().as_object().get(NAME).unwrap(), "Better Bob");
+ Ok(())
+}
+
+#[test]
+pub fn query_match_int() -> Result<()> {
+ let db = jellykv::memory::new();
+
+ let mut rows = [0, 0, 0];
+ let mut result = None;
+
+ db.transaction(&mut |txn| {
+ rows = [
+ txn.insert(new_bob())?,
+ txn.insert(new_alice())?,
+ txn.insert(new_charlie())?,
+ ];
+ Ok(())
+ })?;
+ db.transaction(&mut |txn| {
+ result = txn.query_single(Query {
+ filter: Filter::Match(Path(vec![AGE.0]), 35_u32.to_be_bytes().to_vec()),
+ sort: Sort::None,
+ })?;
+ Ok(())
+ })?;
+
+ assert_eq!(result, Some(rows[0]));
+ Ok(())
+}
+
+#[test]
+pub fn query_match_str() -> Result<()> {
+ let db = jellykv::memory::new();
+
+ let mut rows = [0, 0, 0];
+ let mut result = None;
+
+ db.transaction(&mut |txn| {
+ rows = [
+ txn.insert(new_bob())?,
+ txn.insert(new_alice())?,
+ txn.insert(new_charlie())?,
+ ];
+ Ok(())
+ })?;
+ db.transaction(&mut |txn| {
+ result = txn.query_single(Query {
+ filter: Filter::Match(Path(vec![NAME.0]), "Alice".as_bytes().to_vec()),
+ sort: Sort::None,
+ })?;
+ Ok(())
+ })?;
+
+ assert_eq!(result, Some(rows[1]));
+ Ok(())
+}
+
+#[test]
+pub fn query_match_str_after() -> Result<()> {
+ let db = jellykv::memory::new();
+
+ let mut rows = [0, 0, 0];
+ let mut result = None;
+
+ db.transaction(&mut |txn| {
+ result = txn.query_single(Query {
+ filter: Filter::Match(Path(vec![NAME.0]), "Alice".as_bytes().to_vec()),
+ sort: Sort::None,
+ })?;
+ Ok(())
+ })?;
+ assert_eq!(result, None);
+
+ db.transaction(&mut |txn| {
+ rows = [
+ txn.insert(new_bob())?,
+ txn.insert(new_alice())?,
+ txn.insert(new_charlie())?,
+ ];
+ Ok(())
+ })?;
+
+ db.transaction(&mut |txn| {
+ result = txn.query_single(Query {
+ filter: Filter::Match(Path(vec![NAME.0]), "Alice".as_bytes().to_vec()),
+ sort: Sort::None,
+ })?;
+ Ok(())
+ })?;
+ assert_eq!(result, Some(rows[1]));
+
+ Ok(())
+}