From 72b586d04d8ce9db0482b98af150a6ef12a1ed04 Mon Sep 17 00:00:00 2001 From: Abraham Toriz Date: Wed, 7 Jul 2021 11:54:18 -0500 Subject: [PATCH] add database tests and solve like 5 bugs --- src/database.rs | 189 +++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 180 insertions(+), 9 deletions(-) diff --git a/src/database.rs b/src/database.rs index 9e196ac..bd5546c 100644 --- a/src/database.rs +++ b/src/database.rs @@ -51,7 +51,7 @@ pub trait Database { match (start, end) { (Some(start), Some(end)) => { self.entry_query( - "select * from entries where sheet=?1 and start >= ?2 and end <= ?2 order by start asc", + "select * from entries where sheet=?1 and start >= ?2 and start <= ?3 order by start asc", &[&sheet, &start, &end] ) } @@ -63,7 +63,7 @@ pub trait Database { } (None, Some(end)) => { self.entry_query( - "select * from entries where sheet=?1 and end <= ?2 order by start asc", + "select * from entries where sheet=?1 and start <= ?2 order by start asc", &[&sheet, &end] ) } @@ -80,19 +80,19 @@ pub trait Database { match (start, end) { (Some(start), Some(end)) => { self.entry_query( - "select * from entries where sheet not like '!_%' escape \"!\" and start >= ?2 and end <= ?2 order by start asc", + "select * from entries where sheet not like '!_%' escape \"!\" and start >= ?1 and start <= ?2 order by start asc", &[&start, &end] ) } (Some(start), None) => { self.entry_query( - "select * from entries where sheet not like '!_%' escape \"!\" and start >= ?2 order by start asc", + "select * from entries where sheet not like '!_%' escape \"!\" and start >= ?1 order by start asc", &[&start] ) } (None, Some(end)) => { self.entry_query( - "select * from entries where sheet not like '!_%' escape \"!\" and end <= ?2 order by start asc", + "select * from entries where sheet not like '!_%' escape \"!\" and start <= ?1 order by start asc", &[&end] ) } @@ -109,25 +109,25 @@ pub trait Database { match (start, end) { (Some(start), Some(end)) => { self.entry_query( - "select * from entries where start >= ?2 and end <= ?2 order by start asc", + "select * from entries where start >= ?1 and start <= ?2 order by start asc", &[&start, &end] ) } (Some(start), None) => { self.entry_query( - "select * from entries where start >= ?2 order by start asc", + "select * from entries where start >= ?1 order by start asc", &[&start] ) } (None, Some(end)) => { self.entry_query( - "select * from entries where end <= ?2 order by start asc", + "select * from entries where start <= ?1 order by start asc", &[&end] ) } (None, None) => { self.entry_query( - "select * from entries where sheet=?1 order by start asc", + "select * from entries order by start asc", &[] ) } @@ -228,3 +228,174 @@ impl Database for SqliteDatabase { Ok(results) } } + +#[cfg(test)] +mod tests { + use chrono::TimeZone; + + use super::*; + + #[test] + fn test_entries_by_sheet() { + let mut db = SqliteDatabase::from_memory().unwrap(); + db.init().unwrap(); + + db.entry_insert(Utc.ymd(2021, 7, 7).and_hms(1, 0, 0), None, None, "XXX".into()).unwrap(); + db.entry_insert(Utc.ymd(2021, 7, 7).and_hms(1, 0, 0), None, None, "OOO".into()).unwrap(); + db.entry_insert(Utc.ymd(2021, 7, 7).and_hms(2, 0, 0), None, None, "XXX".into()).unwrap(); + db.entry_insert(Utc.ymd(2021, 7, 7).and_hms(2, 0, 0), None, None, "OOO".into()).unwrap(); + db.entry_insert(Utc.ymd(2021, 7, 7).and_hms(3, 0, 0), None, None, "XXX".into()).unwrap(); + db.entry_insert(Utc.ymd(2021, 7, 7).and_hms(3, 0, 0), None, None, "OOO".into()).unwrap(); + + let start = Utc.ymd(2021, 7, 7).and_hms(1, 30, 0); + let end = Utc.ymd(2021, 7, 7).and_hms(2, 30, 0); + + // filter by start and end + assert_eq!( + db.entries_by_sheet("XXX", Some(start), Some(end)).unwrap().into_iter().map(|e| e.start).collect::>(), + vec![ + Utc.ymd(2021, 7, 7).and_hms(2, 0, 0), + ] + ); + + // filter only by start + assert_eq!( + db.entries_by_sheet("XXX", Some(start), None).unwrap().into_iter().map(|e| e.start).collect::>(), + vec![ + Utc.ymd(2021, 7, 7).and_hms(2, 0, 0), + Utc.ymd(2021, 7, 7).and_hms(3, 0, 0), + ] + ); + + // filter only by end + assert_eq!( + db.entries_by_sheet("XXX", None, Some(end)).unwrap().into_iter().map(|e| e.start).collect::>(), + vec![ + Utc.ymd(2021, 7, 7).and_hms(1, 0, 0), + Utc.ymd(2021, 7, 7).and_hms(2, 0, 0), + ] + ); + + // no filter + assert_eq!( + db.entries_by_sheet("XXX", None, None).unwrap().into_iter().map(|e| e.start).collect::>(), + vec![ + Utc.ymd(2021, 7, 7).and_hms(1, 0, 0), + Utc.ymd(2021, 7, 7).and_hms(2, 0, 0), + Utc.ymd(2021, 7, 7).and_hms(3, 0, 0), + ] + ); + } + + #[test] + fn test_entries_all() { + let mut db = SqliteDatabase::from_memory().unwrap(); + db.init().unwrap(); + + db.entry_insert(Utc.ymd(2021, 7, 7).and_hms(1, 0, 0), None, None, "XXX".into()).unwrap(); + db.entry_insert(Utc.ymd(2021, 7, 7).and_hms(1, 0, 0), None, None, "_OO".into()).unwrap(); + db.entry_insert(Utc.ymd(2021, 7, 7).and_hms(2, 0, 0), None, None, "XXX".into()).unwrap(); + db.entry_insert(Utc.ymd(2021, 7, 7).and_hms(2, 0, 0), None, None, "_OO".into()).unwrap(); + db.entry_insert(Utc.ymd(2021, 7, 7).and_hms(3, 0, 0), None, None, "XXX".into()).unwrap(); + db.entry_insert(Utc.ymd(2021, 7, 7).and_hms(3, 0, 0), None, None, "_OO".into()).unwrap(); + + let start = Utc.ymd(2021, 7, 7).and_hms(1, 30, 0); + let end = Utc.ymd(2021, 7, 7).and_hms(2, 30, 0); + + // filter by start and end + assert_eq!( + db.entries_all_visible(Some(start), Some(end)).unwrap().into_iter().map(|e| e.start).collect::>(), + vec![ + Utc.ymd(2021, 7, 7).and_hms(2, 0, 0), + ] + ); + + // filter only by start + assert_eq!( + db.entries_all_visible(Some(start), None).unwrap().into_iter().map(|e| e.start).collect::>(), + vec![ + Utc.ymd(2021, 7, 7).and_hms(2, 0, 0), + Utc.ymd(2021, 7, 7).and_hms(3, 0, 0), + ] + ); + + // filter only by end + assert_eq!( + db.entries_all_visible(None, Some(end)).unwrap().into_iter().map(|e| e.start).collect::>(), + vec![ + Utc.ymd(2021, 7, 7).and_hms(1, 0, 0), + Utc.ymd(2021, 7, 7).and_hms(2, 0, 0), + ] + ); + + // no filter + assert_eq!( + db.entries_all_visible(None, None).unwrap().into_iter().map(|e| e.start).collect::>(), + vec![ + Utc.ymd(2021, 7, 7).and_hms(1, 0, 0), + Utc.ymd(2021, 7, 7).and_hms(2, 0, 0), + Utc.ymd(2021, 7, 7).and_hms(3, 0, 0), + ] + ); + } + + #[test] + fn test_entries_full() { + let mut db = SqliteDatabase::from_memory().unwrap(); + db.init().unwrap(); + + db.entry_insert(Utc.ymd(2021, 7, 7).and_hms(1, 0, 0), None, None, "XXX".into()).unwrap(); + db.entry_insert(Utc.ymd(2021, 7, 7).and_hms(1, 0, 0), None, None, "_OO".into()).unwrap(); + db.entry_insert(Utc.ymd(2021, 7, 7).and_hms(2, 0, 0), None, None, "XXX".into()).unwrap(); + db.entry_insert(Utc.ymd(2021, 7, 7).and_hms(2, 0, 0), None, None, "_OO".into()).unwrap(); + db.entry_insert(Utc.ymd(2021, 7, 7).and_hms(3, 0, 0), None, None, "XXX".into()).unwrap(); + db.entry_insert(Utc.ymd(2021, 7, 7).and_hms(3, 0, 0), None, None, "_OO".into()).unwrap(); + + let start = Utc.ymd(2021, 7, 7).and_hms(1, 30, 0); + let end = Utc.ymd(2021, 7, 7).and_hms(2, 30, 0); + + // filter by start and end + assert_eq!( + db.entries_full(Some(start), Some(end)).unwrap().into_iter().map(|e| e.start).collect::>(), + vec![ + Utc.ymd(2021, 7, 7).and_hms(2, 0, 0), + Utc.ymd(2021, 7, 7).and_hms(2, 0, 0), + ] + ); + + // filter only by start + assert_eq!( + db.entries_full(Some(start), None).unwrap().into_iter().map(|e| e.start).collect::>(), + vec![ + Utc.ymd(2021, 7, 7).and_hms(2, 0, 0), + Utc.ymd(2021, 7, 7).and_hms(2, 0, 0), + Utc.ymd(2021, 7, 7).and_hms(3, 0, 0), + Utc.ymd(2021, 7, 7).and_hms(3, 0, 0), + ] + ); + + // filter only by end + assert_eq!( + db.entries_full(None, Some(end)).unwrap().into_iter().map(|e| e.start).collect::>(), + vec![ + Utc.ymd(2021, 7, 7).and_hms(1, 0, 0), + Utc.ymd(2021, 7, 7).and_hms(1, 0, 0), + Utc.ymd(2021, 7, 7).and_hms(2, 0, 0), + Utc.ymd(2021, 7, 7).and_hms(2, 0, 0), + ] + ); + + // no filter + assert_eq!( + db.entries_full(None, None).unwrap().into_iter().map(|e| e.start).collect::>(), + vec![ + Utc.ymd(2021, 7, 7).and_hms(1, 0, 0), + Utc.ymd(2021, 7, 7).and_hms(1, 0, 0), + Utc.ymd(2021, 7, 7).and_hms(2, 0, 0), + Utc.ymd(2021, 7, 7).and_hms(2, 0, 0), + Utc.ymd(2021, 7, 7).and_hms(3, 0, 0), + Utc.ymd(2021, 7, 7).and_hms(3, 0, 0), + ] + ); + } +}