|
|
|
@ -7,10 +7,7 @@ use solstice_proto::ServerRequest; |
|
|
|
|
|
|
|
use crate::context::Context;
|
|
|
|
use crate::control;
|
|
|
|
use crate::handlers::{
|
|
|
|
RoomListResponseHandler, RoomMessageRequestHandler,
|
|
|
|
RoomMessageResponseHandler,
|
|
|
|
};
|
|
|
|
use crate::handlers::{RoomMessageRequestHandler, RoomMessageResponseHandler};
|
|
|
|
use crate::message_handler::MessageHandler;
|
|
|
|
|
|
|
|
/// An event affecting the chat room module.
|
|
|
|
@ -72,9 +69,7 @@ fn handle_join_request( |
|
|
|
.blocking_send(ServerRequest::RoomJoinRequest(server::RoomJoinRequest {
|
|
|
|
room_name,
|
|
|
|
}))
|
|
|
|
.context("sending server request")?;
|
|
|
|
|
|
|
|
Ok(())
|
|
|
|
.context("sending server request")
|
|
|
|
}
|
|
|
|
|
|
|
|
fn handle_join_response(
|
|
|
|
@ -94,8 +89,7 @@ fn handle_join_response( |
|
|
|
context
|
|
|
|
.control_response_tx
|
|
|
|
.blocking_send(control_response)
|
|
|
|
.context("sending control response")?;
|
|
|
|
Ok(())
|
|
|
|
.context("sending control response")
|
|
|
|
}
|
|
|
|
|
|
|
|
fn handle_list_request(context: &mut Context) -> anyhow::Result<()> {
|
|
|
|
@ -111,8 +105,23 @@ fn handle_list_request(context: &mut Context) -> anyhow::Result<()> { |
|
|
|
context
|
|
|
|
.server_request_tx
|
|
|
|
.blocking_send(ServerRequest::RoomListRequest)
|
|
|
|
.context("sending server request")?;
|
|
|
|
Ok(())
|
|
|
|
.context("sending server request")
|
|
|
|
}
|
|
|
|
|
|
|
|
fn handle_list_response(
|
|
|
|
context: &mut Context,
|
|
|
|
response: server::RoomListResponse,
|
|
|
|
) -> anyhow::Result<()> {
|
|
|
|
context.state.rooms.set_room_list(response);
|
|
|
|
|
|
|
|
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")
|
|
|
|
}
|
|
|
|
|
|
|
|
impl HandleRoomEvent for RoomEventHandler {
|
|
|
|
@ -131,7 +140,7 @@ impl HandleRoomEvent for RoomEventHandler { |
|
|
|
}
|
|
|
|
RoomEvent::ListRequest => handle_list_request(context),
|
|
|
|
RoomEvent::ListResponse(response) => {
|
|
|
|
RoomListResponseHandler::default().run(context, &response)
|
|
|
|
handle_list_response(context, response)
|
|
|
|
}
|
|
|
|
RoomEvent::MessageRequest(request) => {
|
|
|
|
RoomMessageRequestHandler::default().run(context, &request)
|
|
|
|
@ -168,6 +177,8 @@ pub mod testing { |
|
|
|
|
|
|
|
#[cfg(test)]
|
|
|
|
mod tests {
|
|
|
|
use std::cmp::Ordering;
|
|
|
|
|
|
|
|
use solstice_proto::server;
|
|
|
|
|
|
|
|
use crate::context::{ContextBundle, ContextOptions};
|
|
|
|
@ -327,6 +338,16 @@ mod tests { |
|
|
|
assert_eq!(request, ServerRequest::RoomListRequest);
|
|
|
|
}
|
|
|
|
|
|
|
|
// `sort_by_key()` cannot handle an extractor function that returns
|
|
|
|
// references, so we use `sort_by()` and a comparator instead.
|
|
|
|
// See: https://github.com/rust-lang/rust/issues/34162
|
|
|
|
fn compare_by_name(
|
|
|
|
lhs: &(String, RoomState),
|
|
|
|
rhs: &(String, RoomState),
|
|
|
|
) -> Ordering {
|
|
|
|
lhs.0.cmp(&rhs.0)
|
|
|
|
}
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn handle_list_request_sends_immediate_response() {
|
|
|
|
let mut options = ContextOptions::default();
|
|
|
|
@ -355,12 +376,40 @@ mod tests { |
|
|
|
_ => panic!("Unexpected control response: {:?}", response),
|
|
|
|
};
|
|
|
|
|
|
|
|
// `sort_by_key()` cannot handle an extractor function that returns
|
|
|
|
// references, so we use `sort_by()` instead.
|
|
|
|
// See: https://github.com/rust-lang/rust/issues/34162
|
|
|
|
rooms.sort_unstable_by(|(ref lhs_name, _), (ref rhs_name, _)| {
|
|
|
|
lhs_name.cmp(rhs_name)
|
|
|
|
});
|
|
|
|
rooms.sort_unstable_by(compare_by_name);
|
|
|
|
|
|
|
|
assert_eq!(
|
|
|
|
rooms,
|
|
|
|
vec![
|
|
|
|
(
|
|
|
|
"apple".to_string(),
|
|
|
|
RoomState::new(RoomVisibility::Public, 42)
|
|
|
|
),
|
|
|
|
(
|
|
|
|
"potato".to_string(),
|
|
|
|
RoomState::new(RoomVisibility::Public, 123)
|
|
|
|
),
|
|
|
|
]
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn handle_list_response_sets_room_list() {
|
|
|
|
let mut bundle = ContextBundle::default();
|
|
|
|
|
|
|
|
let response = 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![],
|
|
|
|
};
|
|
|
|
|
|
|
|
RoomEventHandler
|
|
|
|
.handle(&mut bundle.context, RoomEvent::ListResponse(response))
|
|
|
|
.expect("handling response");
|
|
|
|
|
|
|
|
let mut rooms = bundle.context.state.rooms.get_room_list();
|
|
|
|
rooms.sort_unstable_by(compare_by_name);
|
|
|
|
|
|
|
|
assert_eq!(
|
|
|
|
rooms,
|
|
|
|
|