Browse Source

Migrate RoomListRequestHandler.

main
Titouan Rigoudy 2 years ago
parent
commit
fc3a88d41e
3 changed files with 82 additions and 117 deletions
  1. +0
    -2
      client/src/handlers/mod.rs
  2. +0
    -111
      client/src/handlers/room_list_request_handler.rs
  3. +82
    -4
      client/src/room/event.rs

+ 0
- 2
client/src/handlers/mod.rs View File

@ -2,7 +2,6 @@ mod login_status_request_handler;
mod peer_address_response_handler; mod peer_address_response_handler;
mod peer_connect_request_handler; mod peer_connect_request_handler;
mod privileged_users_response_handler; mod privileged_users_response_handler;
mod room_list_request_handler;
mod room_list_response_handler; mod room_list_response_handler;
mod room_message_request_handler; mod room_message_request_handler;
mod room_message_response_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_address_response_handler::PeerAddressResponseHandler;
pub use peer_connect_request_handler::PeerConnectRequestHandler; pub use peer_connect_request_handler::PeerConnectRequestHandler;
pub use privileged_users_response_handler::PrivilegedUsersResponseHandler; pub use privileged_users_response_handler::PrivilegedUsersResponseHandler;
pub use room_list_request_handler::RoomListRequestHandler;
pub use room_list_response_handler::RoomListResponseHandler; pub use room_list_response_handler::RoomListResponseHandler;
pub use room_message_request_handler::RoomMessageRequestHandler; pub use room_message_request_handler::RoomMessageRequestHandler;
pub use room_message_response_handler::RoomMessageResponseHandler; pub use room_message_response_handler::RoomMessageResponseHandler;


+ 0
- 111
client/src/handlers/room_list_request_handler.rs View File

@ -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)
),
]
);
}
}

+ 82
- 4
client/src/room/event.rs View File

@ -8,7 +8,7 @@ use solstice_proto::ServerRequest;
use crate::context::Context; use crate::context::Context;
use crate::control; use crate::control;
use crate::handlers::{ use crate::handlers::{
RoomListRequestHandler, RoomListResponseHandler, RoomMessageRequestHandler,
RoomListResponseHandler, RoomMessageRequestHandler,
RoomMessageResponseHandler, RoomMessageResponseHandler,
}; };
use crate::message_handler::MessageHandler; use crate::message_handler::MessageHandler;
@ -98,6 +98,23 @@ fn handle_join_response(
Ok(()) 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 { impl HandleRoomEvent for RoomEventHandler {
fn handle( fn handle(
&mut self, &mut self,
@ -112,9 +129,7 @@ impl HandleRoomEvent for RoomEventHandler {
RoomEvent::JoinResponse(response) => { RoomEvent::JoinResponse(response) => {
handle_join_response(context, response) handle_join_response(context, response)
} }
RoomEvent::ListRequest => {
RoomListRequestHandler::default().run(context, &())
}
RoomEvent::ListRequest => handle_list_request(context),
RoomEvent::ListResponse(response) => { RoomEvent::ListResponse(response) => {
RoomListResponseHandler::default().run(context, &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)
),
]
);
}
} }

Loading…
Cancel
Save