From 804a539a041667b4bb32c0e5b0b91a267b372fce Mon Sep 17 00:00:00 2001 From: Jeff Baskin Date: Fri, 23 May 2025 09:46:13 -0400 Subject: [PATCH] Added language to session. --- src/queue.rs | 2 + src/session.rs | 122 +++++++++++++++++++++++++++++++++++++------------ 2 files changed, 94 insertions(+), 30 deletions(-) diff --git a/src/queue.rs b/src/queue.rs index 2387131..efbed7a 100644 --- a/src/queue.rs +++ b/src/queue.rs @@ -11,6 +11,8 @@ pub enum MsgType { Document, DocumentRequest, Error, + Session, + SessionGet, SessionValidate, SessionValidated, Time, diff --git a/src/session.rs b/src/session.rs index 379b338..4d20176 100644 --- a/src/session.rs +++ b/src/session.rs @@ -3,6 +3,7 @@ use crate::{ queue::{Message, MsgType, Queue}, }; use chrono::prelude::*; +use isolang::Language; use std::{ collections::HashMap, sync::mpsc::{channel, Receiver}, @@ -12,16 +13,23 @@ use std::{ use uuid::Uuid; const EXPIRE_IN: Duration = Duration::from_secs(60 * 60); -const RESPONDS_TO: [MsgType; 2] = [MsgType::SessionValidate, MsgType::Time]; +const RESPONDS_TO: [MsgType; 3] = [MsgType::SessionGet, MsgType::SessionValidate, MsgType::Time]; +const DEFAULT_LANG: Language = Language::Eng; struct SessionData { expire_on: DateTime, + language: Language, } impl SessionData { - fn new() -> Self { + fn new(lang: Option) -> Self { + let session_lang = match lang { + Some(data) => data.clone(), + None => DEFAULT_LANG, + }; Self { expire_on: Utc::now() + EXPIRE_IN, + language: session_lang, } } @@ -41,7 +49,7 @@ mod sessiondatas { #[test] fn create_session_data() { let expire = Utc::now() + EXPIRE_IN; - let data = SessionData::new(); + let data = SessionData::new(None); assert!( data.expire_on > expire, "{:?} should be greater than {:?}", @@ -52,7 +60,7 @@ mod sessiondatas { #[test] fn extend_usage_time() { - let mut data = SessionData::new(); + let mut data = SessionData::new(None); let expire = Utc::now() + EXPIRE_IN; data.extend(); assert!( @@ -65,7 +73,7 @@ mod sessiondatas { #[test] fn is_expired() { - let data = SessionData::new(); + let data = SessionData::new(None); let expire = Utc::now() + EXPIRE_IN; assert!(data.is_expired(&expire), "should be expired"); } @@ -73,9 +81,24 @@ mod sessiondatas { #[test] fn is_not_expired() { let expire = Utc::now() + EXPIRE_IN; - let data = SessionData::new(); + let data = SessionData::new(None); assert!(!data.is_expired(&expire), "should be not expired"); } + + #[test] + fn english_is_the_default_language() { + let data = SessionData::new(None); + assert_eq!(data.language, DEFAULT_LANG); + } + + #[test] + fn assign_language() { + let langs = [Language::Jpn, Language::Deu]; + for lang in langs.into_iter() { + let data = SessionData::new(Some(lang.clone())); + assert_eq!(data.language, lang); + } + } } pub struct Session { @@ -106,6 +129,7 @@ impl Session { loop { let msg = self.rx.recv().unwrap(); match msg.get_msg_type() { + MsgType::SessionGet => self.get(msg), MsgType::SessionValidate => self.validate(msg), MsgType::Time => self.expire(msg), _ => unreachable!("received unknown message"), @@ -135,7 +159,11 @@ impl Session { while self.data.contains_key(&id) { id = Uuid::new_v4(); } - self.data.insert(id.clone(), SessionData::new()); + let req_lang = match msg.get_data("language") { + Some(data) => Some(data.to_language().unwrap().clone()), + None => None, + }; + self.data.insert(id.clone(), SessionData::new(req_lang)); let mut reply = msg.reply_with_data(MsgType::SessionValidated); reply.add_data("sess_id", id); self.queue.send(reply).unwrap(); @@ -153,6 +181,14 @@ impl Session { self.data.remove(id); } } + + fn get(&self, msg: Message) { + let sess_id = msg.get_data("sess_id").unwrap().to_uuid().unwrap(); + let sess_data = self.data.get(&sess_id).unwrap(); + let mut reply = msg.reply(MsgType::Session); + reply.add_data("language", sess_data.language.clone()); + self.queue.send(reply); + } } #[cfg(test)] @@ -169,16 +205,21 @@ pub mod sessions { reply } - fn setup_session(listen_for: Vec) -> (Queue, Receiver) { + fn setup_session() -> (Queue, Receiver) { let queue = Queue::new(); let (tx, rx) = channel(); + let listen_for = [MsgType::Session, MsgType::SessionValidated].to_vec(); queue.add(tx, listen_for); Session::start(queue.clone()); (queue, rx) } - fn create_session(queue: &Queue, rx: &Receiver) -> Uuid { - let msg = Message::new(MsgType::SessionValidate); + fn create_session(queue: &Queue, rx: &Receiver, lang: Option) -> Uuid { + let mut msg = Message::new(MsgType::SessionValidate); + match lang { + Some(data) => msg.add_data("language", data.clone()), + None => {}, + } queue.send(msg.clone()).unwrap(); let holder = rx.recv_timeout(TIMEOUT).unwrap(); holder.get_data("sess_id").unwrap().to_uuid().unwrap() @@ -187,8 +228,7 @@ pub mod sessions { #[test] fn get_new_session() { let id = Uuid::new_v4(); - let listen_for = [MsgType::SessionValidated]; - let (queue, rx) = setup_session(listen_for.to_vec()); + let (queue, rx) = setup_session(); let mut msg = Message::new(MsgType::SessionValidate); msg.add_data(id, id); queue.send(msg.clone()).unwrap(); @@ -206,8 +246,7 @@ pub mod sessions { #[test] fn session_id_is_unique() { - let listen_for = [MsgType::SessionValidated]; - let (queue, rx) = setup_session(listen_for.to_vec()); + let (queue, rx) = setup_session(); let msg = Message::new(MsgType::SessionValidate); let mut ids: Vec = Vec::new(); for _ in 0..10 { @@ -222,9 +261,8 @@ pub mod sessions { #[test] fn existing_id_is_returned() { let add_data = Uuid::new_v4(); - let listen_for = [MsgType::SessionValidated]; - let (queue, rx) = setup_session(listen_for.to_vec()); - let id = create_session(&queue, &rx); + let (queue, rx) = setup_session(); + let id = create_session(&queue, &rx, None); let mut msg = Message::new(MsgType::SessionValidate); msg.add_data("sess_id", id.clone()); msg.add_data(add_data, add_data); @@ -241,8 +279,7 @@ pub mod sessions { #[test] fn issue_new_if_validated_doe_not_exist() { let id = Uuid::new_v4(); - let listen_for = [MsgType::SessionValidated]; - let (queue, rx) = setup_session(listen_for.to_vec()); + let (queue, rx) = setup_session(); let mut msg = Message::new(MsgType::SessionValidate); msg.add_data("sess_id", id.clone()); queue.send(msg).unwrap(); @@ -254,8 +291,7 @@ pub mod sessions { #[test] fn new_for_bad_uuid() { let id = "bad uuid"; - let listen_for = [MsgType::SessionValidated]; - let (queue, rx) = setup_session(listen_for.to_vec()); + let (queue, rx) = setup_session(); let mut msg = Message::new(MsgType::SessionValidate); msg.add_data("sess_id", id); queue.send(msg).unwrap(); @@ -267,9 +303,8 @@ pub mod sessions { #[test] fn timer_does_nothing_to_unexpired() { let expire = Utc::now() + EXPIRE_IN; - let listen_for = [MsgType::SessionValidated]; - let (queue, rx) = setup_session(listen_for.to_vec()); - let id = create_session(&queue, &rx); + let (queue, rx) = setup_session(); + let id = create_session(&queue, &rx, None); let mut time_msg = Message::new(MsgType::Time); time_msg.add_data("time", expire); queue.send(time_msg).unwrap(); @@ -282,9 +317,8 @@ pub mod sessions { #[test] fn timer_removes_expired() { - let listen_for = [MsgType::SessionValidated]; - let (queue, rx) = setup_session(listen_for.to_vec()); - let id = create_session(&queue, &rx); + let (queue, rx) = setup_session(); + let id = create_session(&queue, &rx, None); let expire = Utc::now() + EXPIRE_IN; let mut time_msg = Message::new(MsgType::Time); time_msg.add_data("time", expire); @@ -298,9 +332,8 @@ pub mod sessions { #[test] fn validate_extends_session() { - let listen_for = [MsgType::SessionValidated]; - let (queue, rx) = setup_session(listen_for.to_vec()); - let id = create_session(&queue, &rx); + let (queue, rx) = setup_session(); + let id = create_session(&queue, &rx, None); let mut validate_msg = Message::new(MsgType::SessionValidate); validate_msg.add_data("sess_id", id.clone()); let expire = Utc::now() + EXPIRE_IN; @@ -313,4 +346,33 @@ pub mod sessions { let result = rx.recv_timeout(TIMEOUT).unwrap(); assert_eq!(result.get_data("sess_id").unwrap().to_uuid().unwrap(), id); } + + #[test] + fn get_session_information() { + let (queue, rx) = setup_session(); + let id = create_session(&queue, &rx, None); + let mut msg = Message::new(MsgType::SessionGet); + msg.add_data("sess_id", id.clone()); + queue.send(msg.clone()); + let reply = rx.recv_timeout(TIMEOUT).unwrap(); + assert_eq!(reply.get_id(), msg.get_id()); + assert_eq!(reply.get_msg_type(), &MsgType::Session); + assert_eq!(reply.get_data("language").unwrap().to_language().unwrap(), DEFAULT_LANG); + } + + #[test] + fn get_requested_langaages() { + let langs = [Language::Jpn, Language::Deu]; + let (queue, rx) = setup_session(); + for lang in langs.into_iter() { + let id = create_session(&queue, &rx, Some(lang.clone())); + let mut msg = Message::new(MsgType::SessionGet); + msg.add_data("sess_id", id.clone()); + queue.send(msg.clone()); + let reply = rx.recv_timeout(TIMEOUT).unwrap(); + assert_eq!(reply.get_id(), msg.get_id()); + assert_eq!(reply.get_msg_type(), &MsgType::Session); + assert_eq!(reply.get_data("language").unwrap().to_language().unwrap(), lang); + } + } }