2025-03-02 10:36:03 -05:00
|
|
|
use crate::{queue::Message, Field};
|
2025-02-27 00:02:03 -05:00
|
|
|
use std::{
|
|
|
|
sync::mpsc::{channel, Receiver, Sender},
|
|
|
|
thread::spawn,
|
|
|
|
};
|
|
|
|
use uuid::Uuid;
|
|
|
|
|
|
|
|
#[derive(Clone)]
|
|
|
|
pub enum SessionMessage {
|
2025-03-02 10:36:03 -05:00
|
|
|
New(Field),
|
2025-02-27 00:02:03 -05:00
|
|
|
Validate(Option<Field>),
|
|
|
|
}
|
|
|
|
|
|
|
|
impl From<Option<Field>> for SessionMessage {
|
|
|
|
fn from(value: Option<Field>) -> Self {
|
|
|
|
SessionMessage::Validate(value)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
#[cfg(test)]
|
2025-03-02 10:36:03 -05:00
|
|
|
pub mod create_session_message {
|
2025-02-27 00:02:03 -05:00
|
|
|
use super::*;
|
|
|
|
|
2025-03-02 10:36:03 -05:00
|
|
|
pub fn create_session_new() -> (SessionMessage, Uuid) {
|
|
|
|
let id = Uuid::new_v4();
|
|
|
|
(SessionMessage::New(id.into()), id)
|
2025-02-27 00:02:03 -05:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
#[cfg(test)]
|
|
|
|
mod sessionmessages {
|
|
|
|
use super::*;
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn from_optional_field() {
|
|
|
|
let text = "afield";
|
|
|
|
let id = Some(text.into());
|
|
|
|
match id.into() {
|
2025-03-02 10:36:03 -05:00
|
|
|
SessionMessage::Validate(result) => match result {
|
|
|
|
Some(data) => match data {
|
|
|
|
Field::Static(output) => assert_eq!(output, text),
|
|
|
|
_ => unreachable!("should have returned static text"),
|
|
|
|
},
|
|
|
|
None => unreachable!("shoulf have returned data"),
|
2025-02-27 00:02:03 -05:00
|
|
|
},
|
|
|
|
_ => unreachable!("should have been a vaqlidate"),
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
struct Session {
|
|
|
|
tx: Sender<Message>,
|
|
|
|
rx: Receiver<Message>,
|
|
|
|
}
|
|
|
|
|
|
|
|
impl Session {
|
|
|
|
fn new(tx: Sender<Message>, rx: Receiver<Message>) -> Self {
|
2025-03-02 10:36:03 -05:00
|
|
|
Self { tx: tx, rx: rx }
|
2025-02-27 00:02:03 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
fn start(queue_tx: Sender<Message>) {
|
|
|
|
spawn(move || {
|
|
|
|
let (tx, rx) = channel();
|
|
|
|
let session = Session::new(queue_tx.clone(), rx);
|
|
|
|
queue_tx.send(tx.clone().into()).unwrap();
|
|
|
|
session.listen();
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
fn listen(&self) {
|
|
|
|
loop {
|
|
|
|
self.rx.recv().unwrap();
|
|
|
|
let res = Uuid::nil();
|
|
|
|
self.tx.send(SessionMessage::New(res.into()).into());
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
#[cfg(test)]
|
|
|
|
mod sessions {
|
|
|
|
use super::*;
|
2025-03-02 10:36:03 -05:00
|
|
|
use std::time::Duration;
|
2025-02-27 00:02:03 -05:00
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn gets_registered() {
|
|
|
|
let (tx, rx) = channel();
|
|
|
|
Session::start(tx);
|
|
|
|
match rx.recv().unwrap() {
|
2025-03-02 10:36:03 -05:00
|
|
|
Message::Register(_) => {}
|
2025-02-27 00:02:03 -05:00
|
|
|
_ => unreachable!("should register the service"),
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn validate_none_returns_new_id() {
|
|
|
|
let (tx, rx) = channel();
|
|
|
|
let sender: Sender<Message>;
|
|
|
|
Session::start(tx);
|
|
|
|
match rx.recv().unwrap() {
|
|
|
|
Message::Register(result) => sender = result,
|
|
|
|
_ => unreachable!("should register the service"),
|
|
|
|
}
|
|
|
|
let data: Option<Field> = None;
|
|
|
|
let req: SessionMessage = data.into();
|
|
|
|
sender.send(req.into()).unwrap();
|
|
|
|
match rx.recv_timeout(Duration::from_millis(500)).unwrap() {
|
2025-03-02 10:36:03 -05:00
|
|
|
Message::SessMsg(data) => match data {
|
|
|
|
SessionMessage::New(_) => {}
|
|
|
|
_ => unreachable!("should have been a new session"),
|
2025-02-27 00:02:03 -05:00
|
|
|
},
|
|
|
|
_ => unreachable!("should have been a session message response"),
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|