diff --git a/client/src/handlers/mod.rs b/client/src/handlers/mod.rs index 762bd38..7a08ba2 100644 --- a/client/src/handlers/mod.rs +++ b/client/src/handlers/mod.rs @@ -2,12 +2,10 @@ mod login_status_request_handler; mod peer_address_response_handler; mod peer_connect_request_handler; mod privileged_users_response_handler; -mod room_message_response_handler; mod user_list_request_handler; pub use login_status_request_handler::LoginStatusRequestHandler; pub use peer_address_response_handler::PeerAddressResponseHandler; pub use peer_connect_request_handler::PeerConnectRequestHandler; pub use privileged_users_response_handler::PrivilegedUsersResponseHandler; -pub use room_message_response_handler::RoomMessageResponseHandler; pub use user_list_request_handler::UserListRequestHandler; diff --git a/client/src/handlers/room_message_response_handler.rs b/client/src/handlers/room_message_response_handler.rs deleted file mode 100644 index 5347e8d..0000000 --- a/client/src/handlers/room_message_response_handler.rs +++ /dev/null @@ -1,163 +0,0 @@ -use anyhow::Context as AnyhowContext; -use solstice_proto::server; - -use crate::context::Context; -use crate::control; -use crate::message_handler::MessageHandler; -use crate::room::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.insert_message(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::{RoomMessage, RoomState, RoomVisibility}; - - 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(), - RoomState::new(RoomVisibility::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: RoomMessage { - 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 = RoomState::new(RoomVisibility::Public, 42); - room.messages.insert(RoomMessage { - 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.clone_state().messages.to_vec(), - vec![ - RoomMessage { - received_at: system_time_from_secs(42), - user_name: "karandeep".to_string(), - message: "namaste!".to_string(), - }, - RoomMessage { - received_at: system_time_from_secs(43), - user_name: "shruti".to_string(), - message: "yo!".to_string(), - }, - ] - ); - } -} diff --git a/client/src/room/event.rs b/client/src/room/event.rs index 644fe5a..0e5dd7f 100644 --- a/client/src/room/event.rs +++ b/client/src/room/event.rs @@ -7,8 +7,7 @@ use solstice_proto::ServerRequest; use crate::context::Context; use crate::control; -use crate::handlers::RoomMessageResponseHandler; -use crate::message_handler::MessageHandler; +use crate::room::RoomMessage; /// An event affecting the chat room module. #[derive(Debug, PartialEq, Eq)] @@ -140,6 +139,35 @@ fn handle_message_request( .context("sending server request") } +fn handle_message_response( + 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, + message: response.message, + }; + + room.insert_message(message.clone()); + + context + .control_response_tx + .blocking_send(control::Response::RoomMessageResponse( + control::RoomMessageResponse { + room_name: response.room_name, + message, + }, + )) + .context("sending control response") +} + impl HandleRoomEvent for RoomEventHandler { fn handle( &mut self, @@ -162,7 +190,7 @@ impl HandleRoomEvent for RoomEventHandler { handle_message_request(context, request) } RoomEvent::MessageResponse(response) => { - RoomMessageResponseHandler::default().run(context, &response) + handle_message_response(context, response) } } } @@ -194,9 +222,11 @@ pub mod testing { #[cfg(test)] mod tests { use std::cmp::Ordering; + use std::time::{Duration, SystemTime}; use solstice_proto::server; + use crate::clock::SimulatedSystemClock; use crate::context::{ContextBundle, ContextOptions}; use crate::room::{RoomMembership, RoomState, RoomVisibility}; @@ -469,4 +499,103 @@ mod tests { }) ); } + + fn system_time_from_secs(seconds: u64) -> SystemTime { + SystemTime::UNIX_EPOCH + Duration::from_secs(seconds) + } + + #[test] + fn handle_message_response_forwards_response() { + let mut options = ContextOptions::default(); + options.initial_state.rooms.insert( + "apple".to_string(), + RoomState::new(RoomVisibility::Public, 1), + ); + options.simulated_clock = + Some(SimulatedSystemClock::new(system_time_from_secs(42))); + + let mut bundle = ContextBundle::new(options); + + RoomEventHandler + .handle( + &mut bundle.context, + RoomEvent::MessageResponse(server::RoomMessageResponse { + room_name: "apple".to_string(), + user_name: "shruti".to_string(), + message: "yo!".to_string(), + }), + ) + .expect("handling response"); + + 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: RoomMessage { + user_name: "shruti".to_string(), + message: "yo!".to_string(), + received_at: SystemTime::UNIX_EPOCH + Duration::from_secs(42), + }, + }) + ); + } + + #[test] + fn handle_message_response_stores_message() { + let mut room = RoomState::new(RoomVisibility::Public, 42); + room.messages.insert(RoomMessage { + 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); + + RoomEventHandler + .handle( + &mut bundle.context, + RoomEvent::MessageResponse(server::RoomMessageResponse { + room_name: "apple".to_string(), + user_name: "shruti".to_string(), + message: "yo!".to_string(), + }), + ) + .expect("handling response"); + + let room = bundle + .context + .state + .rooms + .get_strict("apple") + .expect("looking up room"); + + assert_eq!( + room.clone_state().messages.to_vec(), + vec![ + RoomMessage { + received_at: system_time_from_secs(42), + user_name: "karandeep".to_string(), + message: "namaste!".to_string(), + }, + RoomMessage { + received_at: system_time_from_secs(43), + user_name: "shruti".to_string(), + message: "yo!".to_string(), + }, + ] + ); + } }