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