Added language to session.
This commit is contained in:
parent
2c9b08c77d
commit
804a539a04
@ -11,6 +11,8 @@ pub enum MsgType {
|
||||
Document,
|
||||
DocumentRequest,
|
||||
Error,
|
||||
Session,
|
||||
SessionGet,
|
||||
SessionValidate,
|
||||
SessionValidated,
|
||||
Time,
|
||||
|
||||
122
src/session.rs
122
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<Utc>,
|
||||
language: Language,
|
||||
}
|
||||
|
||||
impl SessionData {
|
||||
fn new() -> Self {
|
||||
fn new(lang: Option<Language>) -> 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<MsgType>) -> (Queue, Receiver<Message>) {
|
||||
fn setup_session() -> (Queue, Receiver<Message>) {
|
||||
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<Message>) -> Uuid {
|
||||
let msg = Message::new(MsgType::SessionValidate);
|
||||
fn create_session(queue: &Queue, rx: &Receiver<Message>, lang: Option<Language>) -> 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<Uuid> = 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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user