diff --git a/client/src/handlers/mod.rs b/client/src/handlers/mod.rs index 9f2d535..8bd97ee 100644 --- a/client/src/handlers/mod.rs +++ b/client/src/handlers/mod.rs @@ -2,7 +2,6 @@ mod login_status_request_handler; mod peer_address_response_handler; mod peer_connect_request_handler; mod privileged_users_response_handler; -mod room_list_request_handler; mod room_list_response_handler; mod room_message_request_handler; mod room_message_response_handler; @@ -12,7 +11,6 @@ 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_list_request_handler::RoomListRequestHandler; pub use room_list_response_handler::RoomListResponseHandler; pub use room_message_request_handler::RoomMessageRequestHandler; pub use room_message_response_handler::RoomMessageResponseHandler; diff --git a/client/src/handlers/room_list_request_handler.rs b/client/src/handlers/room_list_request_handler.rs deleted file mode 100644 index c47986b..0000000 --- a/client/src/handlers/room_list_request_handler.rs +++ /dev/null @@ -1,111 +0,0 @@ -use anyhow::Context as AnyhowContext; -use solstice_proto::ServerRequest; - -use crate::context::Context; -use crate::control; -use crate::message_handler::MessageHandler; - -#[derive(Debug, Default)] -pub struct RoomListRequestHandler; - -impl MessageHandler for RoomListRequestHandler { - type Message = (); - - fn run(self, context: &mut Context, _message: &()) -> anyhow::Result<()> { - { - let rooms = context.state.rooms.get_room_list(); - let control_response = - control::Response::RoomListResponse(control::RoomListResponse { - rooms, - }); - - context - .control_response_tx - .blocking_send(control_response) - .context("sending control response")?; - } - - context - .server_request_tx - .blocking_send(ServerRequest::RoomListRequest) - .context("sending server request")?; - Ok(()) - } - - fn name() -> String { - "RoomListRequestHandler".to_string() - } -} - -#[cfg(test)] -mod tests { - use solstice_proto::server::RoomListResponse; - use solstice_proto::ServerRequest; - - use crate::context::{ContextBundle, ContextOptions}; - use crate::control; - use crate::message_handler::MessageHandler; - use crate::room::{RoomState, RoomVisibility}; - - use super::RoomListRequestHandler; - - // Cannot get the compiler to be satisfied when borrowing the name... - fn room_name(pair: &(String, RoomState)) -> String { - pair.0.clone() - } - - #[test] - fn run_forwards_request() { - let mut bundle = ContextBundle::default(); - - RoomListRequestHandler::default() - .run(&mut bundle.context, &()) - .unwrap(); - - let request = bundle.server_request_rx.blocking_recv().unwrap(); - - assert_eq!(request, ServerRequest::RoomListRequest); - } - - #[test] - fn run_sends_immediate_response() { - let mut options = ContextOptions::default(); - options.initial_state.rooms.set_room_list(RoomListResponse { - rooms: vec![("potato".to_string(), 123), ("apple".to_string(), 42)], - owned_private_rooms: vec![], - other_private_rooms: vec![], - operated_private_room_names: vec![], - }); - - let mut bundle = ContextBundle::new(options); - - RoomListRequestHandler::default() - .run(&mut bundle.context, &()) - .unwrap(); - - let response = bundle.control_response_rx.blocking_recv().unwrap(); - - let mut rooms = match response { - control::Response::RoomListResponse(control::RoomListResponse { - rooms, - }) => rooms, - _ => panic!("Unexpected control response: {:?}", response), - }; - - rooms.sort_by_key(room_name); - - assert_eq!( - rooms, - vec![ - ( - "apple".to_string(), - RoomState::new(RoomVisibility::Public, 42) - ), - ( - "potato".to_string(), - RoomState::new(RoomVisibility::Public, 123) - ), - ] - ); - } -} diff --git a/client/src/room/event.rs b/client/src/room/event.rs index 5dba7c7..c9f09eb 100644 --- a/client/src/room/event.rs +++ b/client/src/room/event.rs @@ -8,7 +8,7 @@ use solstice_proto::ServerRequest; use crate::context::Context; use crate::control; use crate::handlers::{ - RoomListRequestHandler, RoomListResponseHandler, RoomMessageRequestHandler, + RoomListResponseHandler, RoomMessageRequestHandler, RoomMessageResponseHandler, }; use crate::message_handler::MessageHandler; @@ -98,6 +98,23 @@ fn handle_join_response( Ok(()) } +fn handle_list_request(context: &mut Context) -> anyhow::Result<()> { + let rooms = context.state.rooms.get_room_list(); + let control_response = + control::Response::RoomListResponse(control::RoomListResponse { rooms }); + + context + .control_response_tx + .blocking_send(control_response) + .context("sending control response")?; + + context + .server_request_tx + .blocking_send(ServerRequest::RoomListRequest) + .context("sending server request")?; + Ok(()) +} + impl HandleRoomEvent for RoomEventHandler { fn handle( &mut self, @@ -112,9 +129,7 @@ impl HandleRoomEvent for RoomEventHandler { RoomEvent::JoinResponse(response) => { handle_join_response(context, response) } - RoomEvent::ListRequest => { - RoomListRequestHandler::default().run(context, &()) - } + RoomEvent::ListRequest => handle_list_request(context), RoomEvent::ListResponse(response) => { RoomListResponseHandler::default().run(context, &response) } @@ -298,4 +313,67 @@ mod tests { }) ); } + + #[test] + fn handle_list_request_forwards_request() { + let mut bundle = ContextBundle::default(); + + RoomEventHandler + .handle(&mut bundle.context, RoomEvent::ListRequest) + .unwrap(); + + let request = bundle.server_request_rx.blocking_recv().unwrap(); + + assert_eq!(request, ServerRequest::RoomListRequest); + } + + // Cannot get the compiler to be satisfied when borrowing the name... + fn room_name(pair: &(String, RoomState)) -> String { + pair.0.clone() + } + + #[test] + fn handle_list_request_sends_immediate_response() { + let mut options = ContextOptions::default(); + options + .initial_state + .rooms + .set_room_list(server::RoomListResponse { + rooms: vec![("potato".to_string(), 123), ("apple".to_string(), 42)], + owned_private_rooms: vec![], + other_private_rooms: vec![], + operated_private_room_names: vec![], + }); + + let mut bundle = ContextBundle::new(options); + + RoomEventHandler + .handle(&mut bundle.context, RoomEvent::ListRequest) + .unwrap(); + + let response = bundle.control_response_rx.blocking_recv().unwrap(); + + let mut rooms = match response { + control::Response::RoomListResponse(control::RoomListResponse { + rooms, + }) => rooms, + _ => panic!("Unexpected control response: {:?}", response), + }; + + rooms.sort_by_key(room_name); + + assert_eq!( + rooms, + vec![ + ( + "apple".to_string(), + RoomState::new(RoomVisibility::Public, 42) + ), + ( + "potato".to_string(), + RoomState::new(RoomVisibility::Public, 123) + ), + ] + ); + } }