Solstice client.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 

163 lines
4.1 KiB

use anyhow::Context as AnyhowContext;
use solstice_proto::server;
use crate::context::Context;
use crate::control;
use crate::message_handler::MessageHandler;
use crate::room::Message as RoomMessage;
#[derive(Debug, Default)]
pub struct RoomMessageResponseHandler;
impl MessageHandler for RoomMessageResponseHandler {
type Message = server::RoomMessageResponse;
fn run(
self,
context: &mut Context,
response: &server::RoomMessageResponse,
) -> anyhow::Result<()> {
let room = context
.state
.rooms
.get_mut_strict(&response.room_name)
.context("looking up room")?;
let message = RoomMessage {
received_at: context.system_clock.now(),
user_name: response.user_name.clone(),
message: response.message.clone(),
};
room.messages.insert(message.clone());
context
.control_response_tx
.blocking_send(control::Response::RoomMessageResponse(
control::RoomMessageResponse {
room_name: response.room_name.clone(),
message,
},
))
.context("sending control response")?;
Ok(())
}
fn name() -> String {
"RoomMessageResponseHandler".to_string()
}
}
#[cfg(test)]
mod tests {
use std::time::{Duration, SystemTime};
use solstice_proto::server;
use crate::clock::SimulatedSystemClock;
use crate::context::{ContextBundle, ContextOptions};
use crate::control;
use crate::message_handler::MessageHandler;
use crate::room::{Message, Room, Visibility};
use super::RoomMessageResponseHandler;
fn system_time_from_secs(seconds: u64) -> SystemTime {
SystemTime::UNIX_EPOCH + Duration::from_secs(seconds)
}
#[test]
fn run_forwards_response() {
let mut options = ContextOptions::default();
options
.initial_state
.rooms
.insert("apple".to_string(), Room::new(Visibility::Public, 1));
options.simulated_clock =
Some(SimulatedSystemClock::new(system_time_from_secs(42)));
let mut bundle = ContextBundle::new(options);
RoomMessageResponseHandler::default()
.run(
&mut bundle.context,
&server::RoomMessageResponse {
room_name: "apple".to_string(),
user_name: "shruti".to_string(),
message: "yo!".to_string(),
},
)
.expect("running handler");
let response = bundle
.control_response_rx
.blocking_recv()
.expect("receiving control response");
assert_eq!(
response,
control::Response::RoomMessageResponse(control::RoomMessageResponse {
room_name: "apple".to_string(),
message: Message {
user_name: "shruti".to_string(),
message: "yo!".to_string(),
received_at: SystemTime::UNIX_EPOCH + Duration::from_secs(42),
},
})
);
}
#[test]
fn run_stores_message() {
let mut room = Room::new(Visibility::Public, 42);
room.messages.insert(Message {
received_at: system_time_from_secs(42),
user_name: "karandeep".to_string(),
message: "namaste!".to_string(),
});
let mut options = ContextOptions::default();
options
.initial_state
.rooms
.insert("apple".to_string(), room.clone());
options.simulated_clock =
Some(SimulatedSystemClock::new(system_time_from_secs(43)));
let mut bundle = ContextBundle::new(options);
RoomMessageResponseHandler::default()
.run(
&mut bundle.context,
&server::RoomMessageResponse {
room_name: "apple".to_string(),
user_name: "shruti".to_string(),
message: "yo!".to_string(),
},
)
.expect("running handler");
let room = bundle
.context
.state
.rooms
.get_strict("apple")
.expect("looking up room");
assert_eq!(
room.messages.to_vec(),
vec![
Message {
received_at: system_time_from_secs(42),
user_name: "karandeep".to_string(),
message: "namaste!".to_string(),
},
Message {
received_at: system_time_from_secs(43),
user_name: "shruti".to_string(),
message: "yo!".to_string(),
},
]
);
}
}