Browse Source

Migrate RoomJoinResponseHandler.

main
Titouan Rigoudy 2 years ago
parent
commit
92b6e18d5e
3 changed files with 68 additions and 104 deletions
  1. +0
    -2
      client/src/handlers/mod.rs
  2. +0
    -99
      client/src/handlers/room_join_response_handler.rs
  3. +68
    -3
      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_connect_request_handler;
mod privileged_users_response_handler;
mod room_join_response_handler;
mod room_list_request_handler;
mod room_list_response_handler;
mod room_message_request_handler;
@ -13,7 +12,6 @@ pub use login_status_request_handler::LoginStatusRequestHandler;
pub use peer_address_response_handler::PeerAddressResponseHandler;
pub use peer_connect_request_handler::PeerConnectRequestHandler;
pub use privileged_users_response_handler::PrivilegedUsersResponseHandler;
pub use room_join_response_handler::RoomJoinResponseHandler;
pub use room_list_request_handler::RoomListRequestHandler;
pub use room_list_response_handler::RoomListResponseHandler;
pub use room_message_request_handler::RoomMessageRequestHandler;


+ 0
- 99
client/src/handlers/room_join_response_handler.rs View File

@ -1,99 +0,0 @@
use anyhow::Context as AnyhowContext;
use solstice_proto::server::RoomJoinResponse;
use crate::context::Context;
use crate::control;
use crate::message_handler::MessageHandler;
#[derive(Debug, Default)]
pub struct RoomJoinResponseHandler;
impl MessageHandler for RoomJoinResponseHandler {
type Message = RoomJoinResponse;
fn run(
self,
context: &mut Context,
response: &RoomJoinResponse,
) -> anyhow::Result<()> {
{
let room = context.state.rooms.get_mut_strict(&response.room_name)?;
room.join(
response.owner.clone(),
response.operators.clone(),
&response.users,
);
// Send under lock to avoid out-of-order sends.
let control_response =
control::Response::RoomJoinResponse(control::RoomJoinResponse {
room_name: response.room_name.clone(),
room: room.clone_state(),
});
context
.control_response_tx
.blocking_send(control_response)
.context("sending control response")?;
}
Ok(())
}
fn name() -> String {
"RoomJoinResponseHandler".to_string()
}
}
#[cfg(test)]
mod tests {
use solstice_proto::server::RoomJoinResponse;
use crate::context::{ContextBundle, ContextOptions};
use crate::control;
use crate::message_handler::MessageHandler;
use crate::room::{RoomMembership, RoomState, RoomVisibility};
use super::RoomJoinResponseHandler;
#[test]
fn run_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 = RoomJoinResponse {
room_name: "apple".to_string(),
operators: vec!["shruti".to_string()],
owner: Some("kim".to_string()),
users: vec![],
};
RoomJoinResponseHandler::default()
.run(&mut bundle.context, &response)
.unwrap();
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().unwrap();
assert_eq!(
response,
control::Response::RoomJoinResponse(control::RoomJoinResponse {
room_name: "apple".to_string(),
room,
})
);
}
}

+ 68
- 3
client/src/room/event.rs View File

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

Loading…
Cancel
Save