diff --git a/src/message.rs b/src/message.rs index 0492f7a..a22dbf8 100644 --- a/src/message.rs +++ b/src/message.rs @@ -27,6 +27,7 @@ enum Action { Error, Query, Reply, + Show, } impl From for Action { @@ -36,6 +37,7 @@ impl From for Action { MsgAction::Error(_) => Action::Error, MsgAction::Query(_) => Action::Query, MsgAction::Reply(_) => Action::Reply, + MsgAction::Show => Action::Show, } } } @@ -85,6 +87,7 @@ enum MsgAction { Error(MTTError), Query(Access), Reply(Response), + Show, // Add // Delete } @@ -171,7 +174,7 @@ mod msgactions { } } -#[derive(Clone)] +#[derive(Clone, Debug)] struct Message { msg_id: Uuid, document_id: NameID, @@ -948,11 +951,18 @@ impl Document { NameID::Name(name) => name.clone(), NameID::ID(id) => id.to_string(), }; - let routes = [RouteRequest::new( - Include::All, - Include::Some(name.clone()), - Include::Some(Action::Query), - )] + let routes = [ + RouteRequest::new( + Include::All, + Include::Some(name.clone()), + Include::Some(Action::Query), + ), + RouteRequest::new( + Include::All, + Include::Some(name.clone()), + Include::Some(Action::Show), + ), + ] .to_vec(); match queue.register(tx, name, routes) { Ok(_) => {} @@ -984,44 +994,59 @@ mod documents { use super::{support_test::TIMEOUT, *}; use std::sync::mpsc::RecvTimeoutError; - struct TestDoc { - queue: Queue, - rx: Receiver, - } - - impl TestDoc { - fn new(name: &str, docdef: DocDef) -> Self { - let mut queue = Queue::new(); - let msg = Message::new(name, docdef); - Document::start(queue.clone(), msg); - let (tx, rx) = channel(); - let routes = [RouteRequest::new(Include::All, Include::All, Include::All)].to_vec(); - queue.register(tx, name.to_string(), routes); - Self { - queue: queue, - rx: rx, - } - } - - fn send(&self, msg: Message) -> Result<(), MTTError> { - match self.queue.send(msg) { - // Removes the just sent message from the queue. - Ok(_) => self.rx.recv_timeout(TIMEOUT).unwrap(), - Err(err) => return Err(err), - }; - Ok(()) - } - - fn recv(&self) -> Result { - self.rx.recv_timeout(TIMEOUT) - } + fn test_doc( + name: &str, + docdef: DocDef, + routes: Vec, + ) -> (Queue, Receiver) { + let (tx, rx) = channel(); + let mut queue = Queue::new(); + let msg = Message::new(name, docdef); + Document::start(queue.clone(), msg); + queue + .register(tx, Uuid::new_v4().to_string(), routes) + .unwrap(); + (queue, rx) } #[test] - fn has_data_fields() { + fn can_show_document_details() { let docdef = DocDef::new(); let name = "first"; - let doc = TestDoc::new(name, docdef); + let routes = [RouteRequest::new( + Include::All, + Include::All, + Include::Some(Action::Reply), + )] + .to_vec(); + let (queue, rx) = test_doc(name, docdef, routes); + let msg = Message::new(name, MsgAction::Show); + queue.send(msg.clone()).unwrap(); + let show = rx.recv_timeout(TIMEOUT).unwrap(); + } + + fn only_responses_to_its_show_request() { + let docdef = DocDef::new(); + let name = "quiet"; + let routes = [RouteRequest::new( + Include::All, + Include::All, + Include::Some(Action::Reply), + )] + .to_vec(); + let (mut queue, rx) = test_doc(name, docdef, routes); + let other = "alternate"; + let (tx, _) = channel(); + queue.register(tx, other.to_string(), Vec::new()).unwrap(); + let msg = Message::new(other, MsgAction::Show); + queue.send(msg).unwrap(); + match rx.recv_timeout(TIMEOUT) { + Ok(msg) => unreachable!("should not receive: {:?}", msg), + Err(err) => match err { + RecvTimeoutError::Timeout => {} + _ => unreachable!("should have timed out"), + }, + } } }