diff --git a/src/document/create.rs b/src/document/create.rs index de2aa42..97daf47 100644 --- a/src/document/create.rs +++ b/src/document/create.rs @@ -913,6 +913,7 @@ mod document_files { } } + /* #[test] fn query_sends_on_query_message() { let count = 5; @@ -957,6 +958,7 @@ mod document_files { _ => unreachable!("should never get here"), } } + */ #[test] fn send_on_addition_message() { diff --git a/src/lib.rs b/src/lib.rs index 7b3d859..f9e319c 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -13,7 +13,7 @@ use queue::{ router::Queue, }; use std::{ - sync::mpsc::{channel, Receiver, Sender}, + sync::mpsc::{channel, Receiver, RecvTimeoutError, Sender}, time::Duration, }; use uuid::Uuid; @@ -198,6 +198,7 @@ impl MoreThanText { pub struct TestMoreThanText { mtt: MoreThanText, queue: Queue, + channel: Option>, } impl TestMoreThanText { @@ -207,22 +208,12 @@ impl TestMoreThanText { Self { mtt: mtt, queue: queue, + channel: None, } } - pub fn validate_session(&mut self, session: Option) -> Uuid { - self.mtt.validate_session(session) - } - - pub fn records(&mut self, request: UA) -> Result - where - UA: Into, - { - self.mtt.records(request) - } - - pub fn create_document(&mut self, docdef: DocDef) -> Result<(), MTTError> { - self.mtt.create_document(docdef) + pub fn get_morethantext(&self) -> MoreThanText { + self.mtt.clone() } pub fn send_time_pulse(&self) { @@ -230,7 +221,7 @@ impl TestMoreThanText { self.queue.send(msg); } - pub fn register_channel(&self, paths: Vec) -> Receiver { + pub fn register_channel(&mut self, paths: Vec) { let mut queue = self.mtt.queue.clone(); let (tx, rx) = channel(); let sender_id = queue.add_sender(tx); @@ -239,6 +230,29 @@ impl TestMoreThanText { queue.send(Message::new(reg_msg)); rx.recv().unwrap(); // Wait for completion. } - rx + self.channel = Some(rx); + } + + pub fn recv(&self) -> Result { + match &self.channel { + Some(rx) => rx.recv_timeout(Duration::from_millis(500)), + None => panic!("test environment does not have a channel setup"), + } + } + + pub fn get_trigger_records(&self, action: Action) -> Records { + let msg = self.recv().unwrap(); + let msg_action = msg.get_action(); + if action == msg_action.clone().into() { + match msg_action { + MsgAction::OnAddition(data) => data.clone(), + MsgAction::OnDelete(data) => data.clone(), + MsgAction::OnQuery(data) => data.clone(), + MsgAction::OnUpdate(data) => data.clone(), + _ => panic!("{:?} is not a trigger", action), + } + } else { + panic!("received {:?} instead of {:?} trigger", msg, action); + } } } diff --git a/tests/delete_test.rs b/tests/delete_test.rs index 6f5fbd9..d2e4bdb 100644 --- a/tests/delete_test.rs +++ b/tests/delete_test.rs @@ -27,7 +27,8 @@ fn can_delete() { #[test] fn can_delete_specific() { let selected = 1; - let (mut mtt, test_doc) = setup_range(3); + let (test_env, test_doc) = setup_range(3); + let mut mtt = test_env.get_morethantext(); let mut calc = Calculation::new(Operand::Equal); calc.add_value(selected.clone()).unwrap(); calc.add_value(CalcValue::Existing(FieldType::Integer)) @@ -65,7 +66,8 @@ fn can_delete_multiple() { let count: i128 = 5; let selected: i128 = 2; // must be less than count and not less than 0 let bound = selected + 1; - let (mut mtt, test_doc) = setup_range(count.clone().try_into().unwrap()); + let (test_env, test_doc) = setup_range(count.clone().try_into().unwrap()); + let mut mtt = test_env.get_morethantext(); let mut calc = Calculation::new(Operand::GreaterThan); calc.add_value(CalcValue::Existing(FieldType::Integer)) .unwrap(); @@ -106,7 +108,8 @@ fn can_delete_multiple() { #[test] fn does_delete_error_on_a_bad_query() { - let (mut mtt, test_doc) = setup_range(1); + let (test_env, test_doc) = setup_range(1); + let mut mtt = test_env.get_morethantext(); let bad_name = Name::japanese("正しくない"); let mut delete = Delete::new(test_doc.get_doc_name()); let mut qry_calc = Calculation::new(Operand::Equal); diff --git a/tests/document_test.rs b/tests/document_test.rs index c42fd49..eb7316b 100644 --- a/tests/document_test.rs +++ b/tests/document_test.rs @@ -43,7 +43,8 @@ fn does_document_respond_to() { #[test] fn does_document_ignore_other_document_requests() { - let mut mtt = TestMoreThanText::new(); + let mut test_env = TestMoreThanText::new(); + let mut mtt = test_env.get_morethantext(); let quiet = Name::english("quiet"); let alt = Name::english("alt"); mtt.create_document(DocDef::new(quiet.clone())).unwrap(); @@ -53,7 +54,7 @@ fn does_document_ignore_other_document_requests() { Include::Just(quiet.clone().into()), Include::All, )]; - let rx = mtt.register_channel(paths); + test_env.register_channel(paths); let mut requests: Vec = Vec::new(); requests.push(Addition::new(alt.clone()).into()); requests.push(Delete::new(alt.clone()).into()); @@ -62,7 +63,7 @@ fn does_document_ignore_other_document_requests() { for req in requests.iter() { mtt.records(req.clone()).unwrap(); } - match rx.recv_timeout(TIMEOUT) { + match test_env.recv() { Ok(msg) => unreachable!("got {:?} should have timed out", msg), Err(err) => match err { RecvTimeoutError::Timeout => {} diff --git a/tests/query_test.rs b/tests/query_test.rs index 738b95e..e9e9ade 100644 --- a/tests/query_test.rs +++ b/tests/query_test.rs @@ -1,8 +1,8 @@ mod support; use morethantext::{ - CalcValue, Calculation, DocDef, ErrorID, Field, FieldType, IndexType, MTTError, MoreThanText, - Name, Operand, Query, + Action, CalcValue, Calculation, DocDef, ErrorID, Field, FieldType, Include, IndexType, + MTTError, MoreThanText, Name, Operand, Path, Query, TestMoreThanText, }; use std::collections::HashSet; use support::{setup_range, TestDocument}; @@ -11,7 +11,8 @@ const COUNT: usize = 5; #[test] fn does_empty_query_get_all_documents() { - let (mut mtt, test_doc) = setup_range(COUNT); + let (test_env, test_doc) = setup_range(COUNT); + let mut mtt = test_env.get_morethantext(); let mut query = Query::new(test_doc.get_doc_name()); let result = mtt.records(query).unwrap(); assert_eq!(result.len(), 5, "got {:?}", result); @@ -29,7 +30,8 @@ fn does_empty_query_get_all_documents() { #[test] fn does_query_pull_specific_information() { - let (mut mtt, test_doc) = setup_range(COUNT); + let (test_env, test_doc) = setup_range(COUNT); + let mut mtt = test_env.get_morethantext(); let expected = 3; let mut calc = Calculation::new(Operand::Equal); calc.add_value(expected.clone()).unwrap(); @@ -48,7 +50,8 @@ fn does_query_pull_specific_information() { #[test] fn does_query_work_with_less_than() { - let (mut mtt, test_doc) = setup_range(COUNT); + let (test_env, test_doc) = setup_range(COUNT); + let mut mtt = test_env.get_morethantext(); let expected = 2; let mut calc = Calculation::new(Operand::LessThan); calc.add_value(expected.clone()).unwrap(); @@ -72,7 +75,8 @@ fn does_query_work_with_less_than() { #[test] fn does_query_work_with_less_than_equal() { - let (mut mtt, test_doc) = setup_range(COUNT); + let (test_env, test_doc) = setup_range(COUNT); + let mut mtt = test_env.get_morethantext(); let expected = 2; let mut calc = Calculation::new(Operand::LessThanEqual); calc.add_value(expected.clone()).unwrap(); @@ -96,7 +100,8 @@ fn does_query_work_with_less_than_equal() { #[test] fn does_query_work_with_greater_than() { - let (mut mtt, test_doc) = setup_range(COUNT); + let (test_env, test_doc) = setup_range(COUNT); + let mut mtt = test_env.get_morethantext(); let expected = 2; let mut calc = Calculation::new(Operand::GreaterThan); calc.add_value(expected.clone()).unwrap(); @@ -119,7 +124,8 @@ fn does_query_work_with_greater_than() { #[test] fn does_query_work_with_greater_than_equal() { - let (mut mtt, test_doc) = setup_range(COUNT); + let (test_env, test_doc) = setup_range(COUNT); + let mut mtt = test_env.get_morethantext(); let expected = 2; let mut calc = Calculation::new(Operand::GreaterThanEqual); calc.add_value(expected.clone()).unwrap(); @@ -284,3 +290,38 @@ fn does_it_error_on_bad_field_type() { let result = mtt.records(qry).unwrap_err(); assert_eq!(result.to_string(), expected.to_string()); } + +#[test] +fn does_query_send_on_query_message() { + let selected = 2; + let (mut test_env, test_doc) = setup_range(3); + let mut mtt = test_env.get_morethantext(); + test_env.register_channel(vec![Path::new( + Include::All, + Include::Just(test_doc.get_doc_name().into()), + Include::Just(Action::OnQuery), + )]); + let mut calc = Calculation::new(Operand::Equal); + calc.add_value(selected.clone()).unwrap(); + calc.add_value(CalcValue::Existing(FieldType::Integer)) + .unwrap(); + let mut qry = Query::new(test_doc.get_doc_name()); + qry.add(test_doc.get_field_name(0), calc); + let query_result = mtt.records(qry).unwrap(); + let trigger_result = test_env.get_trigger_records(Action::OnQuery); + assert_eq!(trigger_result.len(), query_result.len()); + assert_eq!( + trigger_result + .iter() + .last() + .unwrap() + .get(test_doc.get_field_name(0)) + .unwrap(), + query_result + .iter() + .last() + .unwrap() + .get(test_doc.get_field_name(0)) + .unwrap() + ); +} diff --git a/tests/session_test.rs b/tests/session_test.rs index c443677..bfbdd3e 100644 --- a/tests/session_test.rs +++ b/tests/session_test.rs @@ -112,7 +112,8 @@ fn does_expire_update_on_query() { #[test] #[ignore = "failing to update"] fn are_expired_sessions_removed() { - let mut mtt = TestMoreThanText::new(); + let test_env = TestMoreThanText::new(); + let mut mtt = test_env.get_morethantext(); let id = mtt.validate_session(None); let mut update = Update::new(doc_name()); let mut calc = Calculation::new(Operand::Equal); @@ -127,7 +128,7 @@ fn are_expired_sessions_removed() { .get_values_mut() .add_field(Name::english("expire"), expire); mtt.records(update).unwrap(); - mtt.send_time_pulse(); + test_env.send_time_pulse(); let mut qry = Query::new(doc_name()); qry.add(Name::english("id"), calc.clone()); let result = mtt.records(qry).unwrap(); diff --git a/tests/support.rs b/tests/support.rs index f1e7a21..91479c8 100644 --- a/tests/support.rs +++ b/tests/support.rs @@ -1,12 +1,13 @@ -use morethantext::{Addition, DocDef, Field, FieldType, MoreThanText, Name}; +use morethantext::{Addition, DocDef, Field, FieldType, MoreThanText, Name, TestMoreThanText}; use uuid::Uuid; pub fn random_name() -> Name { Name::english(Uuid::new_v4().to_string().as_str()) } -pub fn setup_range(count: usize) -> (MoreThanText, TestDocument) { - let mut mtt = MoreThanText::new(); +pub fn setup_range(count: usize) -> (TestMoreThanText, TestDocument) { + let test_env = TestMoreThanText::new(); + let mut mtt = test_env.get_morethantext(); let test_doc = TestDocument::new(vec![FieldType::Integer]); mtt.create_document(test_doc.get_docdef()).unwrap(); let mut data: Vec> = Vec::new(); @@ -15,7 +16,7 @@ pub fn setup_range(count: usize) -> (MoreThanText, TestDocument) { data.push(vec![holder]); } test_doc.populate_multiple(&mut mtt, data); - (mtt, test_doc) + (test_env, test_doc) } pub struct TestDocument { diff --git a/tests/update_test.rs b/tests/update_test.rs index d8a167a..d2f3b17 100644 --- a/tests/update_test.rs +++ b/tests/update_test.rs @@ -12,7 +12,8 @@ use uuid::Uuid; fn is_it_possible_to_update_nothing() { let count = 3; let outside: i128 = (count + 2).try_into().unwrap(); - let (mut mtt, test_doc) = setup_range(count); + let (test_env, test_doc) = setup_range(count); + let mut mtt = test_env.get_morethantext(); let mut update = Update::new(test_doc.get_doc_name()); update.add_field(test_doc.get_field_name(0), 20); let mut calc = Calculation::new(Operand::Equal); @@ -60,7 +61,8 @@ fn are_the_updates_limited_to_the_queried() { let count = 3; let choice = 1; let changed = 20; - let (mut mtt, test_doc) = setup_range(count); + let (test_env, test_doc) = setup_range(count); + let mut mtt = test_env.get_morethantext(); let mut update = Update::new(test_doc.get_doc_name()); update.add_field(test_doc.get_field_name(0), changed.clone()); let mut calc = Calculation::new(Operand::Equal); @@ -94,7 +96,8 @@ fn are_the_updates_limited_to_the_queried() { fn can_multiple_documents_be_update() { let count = 3; let choice = 1; - let (mut mtt, test_doc) = setup_range(count); + let (test_env, test_doc) = setup_range(count); + let mut mtt = test_env.get_morethantext(); let mut add_up = Calculation::new(Operand::Add); add_up .add_value(CalcValue::Existing(FieldType::Integer)) @@ -132,7 +135,8 @@ fn can_multiple_documents_be_update() { #[test] fn does_update_error_on_a_bad_query() { - let (mut mtt, test_doc) = setup_range(1); + let (test_env, test_doc) = setup_range(1); + let mut mtt = test_env.get_morethantext(); let bad_name = Name::japanese("正しくない"); let mut update = Update::new(test_doc.get_doc_name()); let mut qry_calc = Calculation::new(Operand::Equal); @@ -151,7 +155,8 @@ fn does_update_error_on_a_bad_query() { #[test] fn does_update_error_on_a_bad_field_name() { - let (mut mtt, test_doc) = setup_range(1); + let (test_env, test_doc) = setup_range(1); + let mut mtt = test_env.get_morethantext(); let bad_name = Name::japanese("正しくない"); let mut update = Update::new(test_doc.get_doc_name()); let mut qry_calc = Calculation::new(Operand::Equal); @@ -172,7 +177,8 @@ fn does_update_error_on_a_bad_field_name() { #[test] fn does_update_error_on_a_bad_field_type() { - let (mut mtt, test_doc) = setup_range(1); + let (test_env, test_doc) = setup_range(1); + let mut mtt = test_env.get_morethantext(); let mut update = Update::new(test_doc.get_doc_name()); let mut qry_calc = Calculation::new(Operand::Equal); qry_calc.add_value(0).unwrap();