|
|
|
@ -8,8 +8,8 @@ use solstice_proto::ServerRequest; |
|
|
|
use crate::context::Context;
|
|
|
|
use crate::control;
|
|
|
|
use crate::handlers::{
|
|
|
|
RoomJoinResponseHandler, RoomListRequestHandler, RoomListResponseHandler,
|
|
|
|
RoomMessageRequestHandler, RoomMessageResponseHandler,
|
|
|
|
RoomListRequestHandler, RoomListResponseHandler, RoomMessageRequestHandler,
|
|
|
|
RoomMessageResponseHandler,
|
|
|
|
};
|
|
|
|
use crate::message_handler::MessageHandler;
|
|
|
|
|
|
|
|
@ -77,6 +77,27 @@ fn handle_join_request( |
|
|
|
Ok(())
|
|
|
|
}
|
|
|
|
|
|
|
|
fn handle_join_response(
|
|
|
|
context: &mut Context,
|
|
|
|
response: server::RoomJoinResponse,
|
|
|
|
) -> anyhow::Result<()> {
|
|
|
|
let room = context.state.rooms.get_mut_strict(&response.room_name)?;
|
|
|
|
|
|
|
|
room.join(response.owner, response.operators, &response.users);
|
|
|
|
|
|
|
|
let control_response =
|
|
|
|
control::Response::RoomJoinResponse(control::RoomJoinResponse {
|
|
|
|
room_name: response.room_name,
|
|
|
|
room: room.clone_state(),
|
|
|
|
});
|
|
|
|
|
|
|
|
context
|
|
|
|
.control_response_tx
|
|
|
|
.blocking_send(control_response)
|
|
|
|
.context("sending control response")?;
|
|
|
|
Ok(())
|
|
|
|
}
|
|
|
|
|
|
|
|
impl HandleRoomEvent for RoomEventHandler {
|
|
|
|
fn handle(
|
|
|
|
&mut self,
|
|
|
|
@ -89,7 +110,7 @@ impl HandleRoomEvent for RoomEventHandler { |
|
|
|
handle_join_request(context, room_name)
|
|
|
|
}
|
|
|
|
RoomEvent::JoinResponse(response) => {
|
|
|
|
RoomJoinResponseHandler::default().run(context, &response)
|
|
|
|
handle_join_response(context, response)
|
|
|
|
}
|
|
|
|
RoomEvent::ListRequest => {
|
|
|
|
RoomListRequestHandler::default().run(context, &())
|
|
|
|
@ -233,4 +254,48 @@ mod tests { |
|
|
|
})
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn handle_join_response_updates_room_state_and_forwards_response() {
|
|
|
|
let mut room = RoomState::new(RoomVisibility::Public, 42);
|
|
|
|
|
|
|
|
let mut options = ContextOptions::default();
|
|
|
|
options
|
|
|
|
.initial_state
|
|
|
|
.rooms
|
|
|
|
.insert("apple".to_string(), room.clone());
|
|
|
|
let mut bundle = ContextBundle::new(options);
|
|
|
|
|
|
|
|
let response = server::RoomJoinResponse {
|
|
|
|
room_name: "apple".to_string(),
|
|
|
|
operators: vec!["shruti".to_string()],
|
|
|
|
owner: Some("kim".to_string()),
|
|
|
|
users: vec![],
|
|
|
|
};
|
|
|
|
|
|
|
|
RoomEventHandler
|
|
|
|
.handle(&mut bundle.context, RoomEvent::JoinResponse(response))
|
|
|
|
.expect("handling response");
|
|
|
|
|
|
|
|
room.membership = RoomMembership::Member;
|
|
|
|
room.user_count = 0;
|
|
|
|
room.operators = ["shruti"].iter().map(|s| s.to_string()).collect();
|
|
|
|
room.owner = Some("kim".to_string());
|
|
|
|
|
|
|
|
let rooms = bundle.context.state.rooms.get_room_list();
|
|
|
|
|
|
|
|
assert_eq!(rooms, vec![("apple".to_string(), room.clone())]);
|
|
|
|
|
|
|
|
let response = bundle
|
|
|
|
.control_response_rx
|
|
|
|
.blocking_recv()
|
|
|
|
.expect("receiving response");
|
|
|
|
assert_eq!(
|
|
|
|
response,
|
|
|
|
control::Response::RoomJoinResponse(control::RoomJoinResponse {
|
|
|
|
room_name: "apple".to_string(),
|
|
|
|
room,
|
|
|
|
})
|
|
|
|
);
|
|
|
|
}
|
|
|
|
}
|