From 1f9e8e388a4cd1931cc8e1a43938a3a7d2e735c1 Mon Sep 17 00:00:00 2001 From: Damien Elmes Date: Fri, 20 Mar 2020 09:26:31 +1000 Subject: [PATCH] start on search tests --- rslib/src/media/check.rs | 10 +++--- rslib/src/search/sqlwriter.rs | 58 +++++++++++++++++++++++++++-------- 2 files changed, 50 insertions(+), 18 deletions(-) diff --git a/rslib/src/media/check.rs b/rslib/src/media/check.rs index 87726d458..843d14493 100644 --- a/rslib/src/media/check.rs +++ b/rslib/src/media/check.rs @@ -498,7 +498,10 @@ fn extract_latex_refs(note: &Note, seen_files: &mut HashSet, svg: bool) } #[cfg(test)] -mod test { +pub(crate) mod test { + pub(crate) const MEDIACHECK_ANKI2: &'static [u8] = + include_bytes!("../../tests/support/mediacheck.anki2"); + use crate::collection::{open_collection, Collection}; use crate::err::Result; use crate::i18n::I18n; @@ -516,10 +519,7 @@ mod test { fs::create_dir(&media_dir)?; let media_db = dir.path().join("media.db"); let col_path = dir.path().join("col.anki2"); - fs::write( - &col_path, - &include_bytes!("../../tests/support/mediacheck.anki2")[..], - )?; + fs::write(&col_path, MEDIACHECK_ANKI2)?; let mgr = MediaManager::new(&media_dir, media_db.clone())?; diff --git a/rslib/src/search/sqlwriter.rs b/rslib/src/search/sqlwriter.rs index c7a0ea671..ecd4bfd99 100644 --- a/rslib/src/search/sqlwriter.rs +++ b/rslib/src/search/sqlwriter.rs @@ -321,6 +321,9 @@ where #[cfg(test)] mod test { use super::ids_to_string; + use crate::{collection::open_collection, i18n::I18n, log}; + use std::{fs, path::PathBuf}; + use tempfile::tempdir; #[test] fn ids_string() { @@ -339,22 +342,51 @@ mod test { s.clear(); } - // use super::super::parser::parse; - // use super::*; + use super::super::parser::parse; + use super::*; - // parse - // fn p(search: &str) -> Node { - // Node::Group(parse(search).unwrap()) - // } - - // get sql - // fn s<'a>(n: &'a Node) -> (String, Vec>) { - // node_to_sql(n) - // } + // shortcut + fn s(req: &mut RequestContext, search: &str) -> (String, Vec) { + let node = Node::Group(parse(search).unwrap()); + node_to_sql(req, &node).unwrap() + } #[test] - fn tosql() -> Result<(), String> { - // assert_eq!(s(&p("added:1")), ("(c.id > 1)".into(), vec![])); + fn sql() -> Result<()> { + // re-use the mediacheck .anki2 file for now + use crate::media::check::test::MEDIACHECK_ANKI2; + let dir = tempdir().unwrap(); + let col_path = dir.path().join("col.anki2"); + fs::write(&col_path, MEDIACHECK_ANKI2).unwrap(); + + let i18n = I18n::new(&[""], "", log::terminal()); + let col = open_collection( + &col_path, + &PathBuf::new(), + &PathBuf::new(), + false, + i18n, + log::terminal(), + ) + .unwrap(); + + col.with_ctx(|ctx| { + // unqualified search + assert_eq!( + s(ctx, "test"), + ( + "((n.sfld like ?1 escape '\\' or n.flds like ?1 escape '\\'))".into(), + vec!["%test%".into()] + ) + ); + assert_eq!(s(ctx, "te%st").1, vec!["%te%st%".to_string()]); + // user should be able to escape sql wildcards + assert_eq!(s(ctx, r#"te\%s\_t"#).1, vec!["%te\\%s\\_t%".to_string()]); + + + Ok(()) + }) + .unwrap(); Ok(()) }