diff --git a/client/src/context.rs b/client/src/context.rs index 4520593..e27803c 100644 --- a/client/src/context.rs +++ b/client/src/context.rs @@ -67,7 +67,7 @@ impl Default for ContextOptions { impl ContextBundle { /// Builds a new context bundle as configured by `options`. - fn new(options: ContextOptions) -> Self { + pub fn new(options: ContextOptions) -> Self { let (server_request_tx, server_request_rx) = channel(options.server_request_buffer); let (control_response_tx, control_response_rx) = diff --git a/client/src/handlers/room_list_request_handler.rs b/client/src/handlers/room_list_request_handler.rs index d323c17..b145f8a 100644 --- a/client/src/handlers/room_list_request_handler.rs +++ b/client/src/handlers/room_list_request_handler.rs @@ -2,6 +2,7 @@ use anyhow::Context as AnyhowContext; use solstice_proto::ServerRequest; use crate::context::Context; +use crate::control; use crate::message_handler::MessageHandler; #[derive(Debug, Default)] @@ -11,7 +12,20 @@ impl MessageHandler for RoomListRequestHandler { type Message = (); fn run(self, context: &Context, _message: &()) -> anyhow::Result<()> { - // TODO: Send `RoomListResponse` back over socket. + { + let guard = context.state.lock(); + let rooms = guard.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) @@ -26,10 +40,13 @@ impl MessageHandler for RoomListRequestHandler { #[cfg(test)] mod tests { + use solstice_proto::server::RoomListResponse; use solstice_proto::ServerRequest; - use crate::context::ContextBundle; + use crate::context::{ContextBundle, ContextOptions}; + use crate::control; use crate::message_handler::MessageHandler; + use crate::room::{Room, Visibility}; use super::RoomListRequestHandler; @@ -45,4 +62,33 @@ mod tests { 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(&bundle.context, &()) + .unwrap(); + + let response = bundle.control_response_rx.blocking_recv().unwrap(); + + assert_eq!( + response, + control::Response::RoomListResponse(control::RoomListResponse { + rooms: vec![ + ("apple".to_string(), Room::new(Visibility::Public, 42)), + ("potato".to_string(), Room::new(Visibility::Public, 123)), + ] + }) + ); + } }