Browse Source

Migrate RoomMessageResponseHandler.

main
Titouan Rigoudy 2 years ago
parent
commit
34d0b1886d
3 changed files with 132 additions and 168 deletions
  1. +0
    -2
      client/src/handlers/mod.rs
  2. +0
    -163
      client/src/handlers/room_message_response_handler.rs
  3. +132
    -3
      client/src/room/event.rs

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

@ -2,12 +2,10 @@ 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_message_response_handler;
mod user_list_request_handler; mod user_list_request_handler;
pub use login_status_request_handler::LoginStatusRequestHandler; 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_message_response_handler::RoomMessageResponseHandler;
pub use user_list_request_handler::UserListRequestHandler; pub use user_list_request_handler::UserListRequestHandler;

+ 0
- 163
client/src/handlers/room_message_response_handler.rs View File

@ -1,163 +0,0 @@
use anyhow::Context as AnyhowContext;
use solstice_proto::server;
use crate::context::Context;
use crate::control;
use crate::message_handler::MessageHandler;
use crate::room::RoomMessage;
#[derive(Debug, Default)]
pub struct RoomMessageResponseHandler;
impl MessageHandler for RoomMessageResponseHandler {
type Message = server::RoomMessageResponse;
fn run(
self,
context: &mut Context,
response: &server::RoomMessageResponse,
) -> anyhow::Result<()> {
let room = context
.state
.rooms
.get_mut_strict(&response.room_name)
.context("looking up room")?;
let message = RoomMessage {
received_at: context.system_clock.now(),
user_name: response.user_name.clone(),
message: response.message.clone(),
};
room.insert_message(message.clone());
context
.control_response_tx
.blocking_send(control::Response::RoomMessageResponse(
control::RoomMessageResponse {
room_name: response.room_name.clone(),
message,
},
))
.context("sending control response")?;
Ok(())
}
fn name() -> String {
"RoomMessageResponseHandler".to_string()
}
}
#[cfg(test)]
mod tests {
use std::time::{Duration, SystemTime};
use solstice_proto::server;
use crate::clock::SimulatedSystemClock;
use crate::context::{ContextBundle, ContextOptions};
use crate::control;
use crate::message_handler::MessageHandler;
use crate::room::{RoomMessage, RoomState, RoomVisibility};
use super::RoomMessageResponseHandler;
fn system_time_from_secs(seconds: u64) -> SystemTime {
SystemTime::UNIX_EPOCH + Duration::from_secs(seconds)
}
#[test]
fn run_forwards_response() {
let mut options = ContextOptions::default();
options.initial_state.rooms.insert(
"apple".to_string(),
RoomState::new(RoomVisibility::Public, 1),
);
options.simulated_clock =
Some(SimulatedSystemClock::new(system_time_from_secs(42)));
let mut bundle = ContextBundle::new(options);
RoomMessageResponseHandler::default()
.run(
&mut bundle.context,
&server::RoomMessageResponse {
room_name: "apple".to_string(),
user_name: "shruti".to_string(),
message: "yo!".to_string(),
},
)
.expect("running handler");
let response = bundle
.control_response_rx
.blocking_recv()
.expect("receiving control response");
assert_eq!(
response,
control::Response::RoomMessageResponse(control::RoomMessageResponse {
room_name: "apple".to_string(),
message: RoomMessage {
user_name: "shruti".to_string(),
message: "yo!".to_string(),
received_at: SystemTime::UNIX_EPOCH + Duration::from_secs(42),
},
})
);
}
#[test]
fn run_stores_message() {
let mut room = RoomState::new(RoomVisibility::Public, 42);
room.messages.insert(RoomMessage {
received_at: system_time_from_secs(42),
user_name: "karandeep".to_string(),
message: "namaste!".to_string(),
});
let mut options = ContextOptions::default();
options
.initial_state
.rooms
.insert("apple".to_string(), room.clone());
options.simulated_clock =
Some(SimulatedSystemClock::new(system_time_from_secs(43)));
let mut bundle = ContextBundle::new(options);
RoomMessageResponseHandler::default()
.run(
&mut bundle.context,
&server::RoomMessageResponse {
room_name: "apple".to_string(),
user_name: "shruti".to_string(),
message: "yo!".to_string(),
},
)
.expect("running handler");
let room = bundle
.context
.state
.rooms
.get_strict("apple")
.expect("looking up room");
assert_eq!(
room.clone_state().messages.to_vec(),
vec![
RoomMessage {
received_at: system_time_from_secs(42),
user_name: "karandeep".to_string(),
message: "namaste!".to_string(),
},
RoomMessage {
received_at: system_time_from_secs(43),
user_name: "shruti".to_string(),
message: "yo!".to_string(),
},
]
);
}
}

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

@ -7,8 +7,7 @@ use solstice_proto::ServerRequest;
use crate::context::Context; use crate::context::Context;
use crate::control; use crate::control;
use crate::handlers::RoomMessageResponseHandler;
use crate::message_handler::MessageHandler;
use crate::room::RoomMessage;
/// An event affecting the chat room module. /// An event affecting the chat room module.
#[derive(Debug, PartialEq, Eq)] #[derive(Debug, PartialEq, Eq)]
@ -140,6 +139,35 @@ fn handle_message_request(
.context("sending server request") .context("sending server request")
} }
fn handle_message_response(
context: &mut Context,
response: server::RoomMessageResponse,
) -> anyhow::Result<()> {
let room = context
.state
.rooms
.get_mut_strict(&response.room_name)
.context("looking up room")?;
let message = RoomMessage {
received_at: context.system_clock.now(),
user_name: response.user_name,
message: response.message,
};
room.insert_message(message.clone());
context
.control_response_tx
.blocking_send(control::Response::RoomMessageResponse(
control::RoomMessageResponse {
room_name: response.room_name,
message,
},
))
.context("sending control response")
}
impl HandleRoomEvent for RoomEventHandler { impl HandleRoomEvent for RoomEventHandler {
fn handle( fn handle(
&mut self, &mut self,
@ -162,7 +190,7 @@ impl HandleRoomEvent for RoomEventHandler {
handle_message_request(context, request) handle_message_request(context, request)
} }
RoomEvent::MessageResponse(response) => { RoomEvent::MessageResponse(response) => {
RoomMessageResponseHandler::default().run(context, &response)
handle_message_response(context, response)
} }
} }
} }
@ -194,9 +222,11 @@ pub mod testing {
#[cfg(test)] #[cfg(test)]
mod tests { mod tests {
use std::cmp::Ordering; use std::cmp::Ordering;
use std::time::{Duration, SystemTime};
use solstice_proto::server; use solstice_proto::server;
use crate::clock::SimulatedSystemClock;
use crate::context::{ContextBundle, ContextOptions}; use crate::context::{ContextBundle, ContextOptions};
use crate::room::{RoomMembership, RoomState, RoomVisibility}; use crate::room::{RoomMembership, RoomState, RoomVisibility};
@ -469,4 +499,103 @@ mod tests {
}) })
); );
} }
fn system_time_from_secs(seconds: u64) -> SystemTime {
SystemTime::UNIX_EPOCH + Duration::from_secs(seconds)
}
#[test]
fn handle_message_response_forwards_response() {
let mut options = ContextOptions::default();
options.initial_state.rooms.insert(
"apple".to_string(),
RoomState::new(RoomVisibility::Public, 1),
);
options.simulated_clock =
Some(SimulatedSystemClock::new(system_time_from_secs(42)));
let mut bundle = ContextBundle::new(options);
RoomEventHandler
.handle(
&mut bundle.context,
RoomEvent::MessageResponse(server::RoomMessageResponse {
room_name: "apple".to_string(),
user_name: "shruti".to_string(),
message: "yo!".to_string(),
}),
)
.expect("handling response");
let response = bundle
.control_response_rx
.blocking_recv()
.expect("receiving control response");
assert_eq!(
response,
control::Response::RoomMessageResponse(control::RoomMessageResponse {
room_name: "apple".to_string(),
message: RoomMessage {
user_name: "shruti".to_string(),
message: "yo!".to_string(),
received_at: SystemTime::UNIX_EPOCH + Duration::from_secs(42),
},
})
);
}
#[test]
fn handle_message_response_stores_message() {
let mut room = RoomState::new(RoomVisibility::Public, 42);
room.messages.insert(RoomMessage {
received_at: system_time_from_secs(42),
user_name: "karandeep".to_string(),
message: "namaste!".to_string(),
});
let mut options = ContextOptions::default();
options
.initial_state
.rooms
.insert("apple".to_string(), room.clone());
options.simulated_clock =
Some(SimulatedSystemClock::new(system_time_from_secs(43)));
let mut bundle = ContextBundle::new(options);
RoomEventHandler
.handle(
&mut bundle.context,
RoomEvent::MessageResponse(server::RoomMessageResponse {
room_name: "apple".to_string(),
user_name: "shruti".to_string(),
message: "yo!".to_string(),
}),
)
.expect("handling response");
let room = bundle
.context
.state
.rooms
.get_strict("apple")
.expect("looking up room");
assert_eq!(
room.clone_state().messages.to_vec(),
vec![
RoomMessage {
received_at: system_time_from_secs(42),
user_name: "karandeep".to_string(),
message: "namaste!".to_string(),
},
RoomMessage {
received_at: system_time_from_secs(43),
user_name: "shruti".to_string(),
message: "yo!".to_string(),
},
]
);
}
} }

Loading…
Cancel
Save