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