use crate::{ field::Field, queue::{Message, MsgType, Queue}, }; use std::{ sync::mpsc::{channel, Receiver}, thread::spawn, }; const RESPONDS_TO: [MsgType; 1] = [MsgType::DocumentRequest]; struct Document { queue: Queue, rx: Receiver, } impl Document { fn new(queue: Queue, rx: Receiver) -> Self { Self { queue: queue, rx: rx, } } pub fn start(queue: Queue) { let (tx, rx) = channel(); let mut document = Document::new(queue, rx); document.queue.add(tx, RESPONDS_TO.to_vec()); spawn(move || { document.listen(); }); } fn listen(&mut self) { loop { let msg = self.rx.recv().unwrap(); let mut reply = msg.reply(MsgType::Document); reply.add_data( "sess_id", msg.get_data("sess_id").unwrap().to_uuid().unwrap(), ); reply.add_data("doc", "Something goes hwew"); self.queue.send(reply).unwrap(); } } } #[cfg(test)] mod documents { use super::*; use std::time::Duration; use uuid::Uuid; const TIMEOUT: Duration = Duration::from_millis(500); fn setup_document(listen_for: Vec) -> (Queue, Receiver) { let queue = Queue::new(); let (tx, rx) = channel(); queue.add(tx, listen_for); Document::start(queue.clone()); (queue, rx) } #[test] fn start_service() { let (queue, rx) = setup_document([MsgType::Document].to_vec()); let id = Uuid::new_v4(); let mut msg = Message::new(MsgType::DocumentRequest); msg.add_data("sess_id", id.clone()); queue.send(msg.clone()).unwrap(); let reply = rx.recv_timeout(TIMEOUT).unwrap(); assert_eq!(reply.get_id(), msg.get_id()); match reply.get_class() { MsgType::Document => {} _ => unreachable!("got {:?} should have gotten document", msg.get_class()), } assert_eq!(reply.get_data("sess_id").unwrap().to_uuid().unwrap(), id); assert!(reply.get_data("doc").is_some()); } }