| @ -0,0 +1,94 @@ | |||
| use anyhow::Context as AnyhowContext; | |||
| use crate::context::Context; | |||
| use crate::control::{Response, UserListResponse}; | |||
| use crate::message_handler::MessageHandler; | |||
| #[derive(Debug, Default)] | |||
| pub struct UserListRequestHandler; | |||
| impl MessageHandler for UserListRequestHandler { | |||
| type Message = (); | |||
| fn run(self, context: &mut Context, _message: &()) -> anyhow::Result<()> { | |||
| let users = context.state.users.get_list(); | |||
| let control_response = | |||
| Response::UserListResponse(UserListResponse { users }); | |||
| context | |||
| .control_response_tx | |||
| .blocking_send(control_response) | |||
| .context("sending control response")?; | |||
| Ok(()) | |||
| } | |||
| fn name() -> String { | |||
| "UserListRequestHandler".to_string() | |||
| } | |||
| } | |||
| #[cfg(test)] | |||
| mod tests { | |||
| use solstice_proto::{User, UserStatus}; | |||
| use crate::context::{ContextBundle, ContextOptions}; | |||
| use crate::control::{Response, UserListResponse}; | |||
| use crate::message_handler::MessageHandler; | |||
| use super::UserListRequestHandler; | |||
| // Cannot get the compiler to be satisfied when borrowing the name... | |||
| fn user_name(pair: &(String, User)) -> String { | |||
| pair.0.clone() | |||
| } | |||
| #[test] | |||
| fn run_sends_response() { | |||
| let shruti = User { | |||
| name: "shruti".to_string(), | |||
| status: UserStatus::Online, | |||
| average_speed: 1, | |||
| num_downloads: 2, | |||
| unknown: 3, | |||
| num_files: 4, | |||
| num_folders: 5, | |||
| num_free_slots: 6, | |||
| country: "IN".to_string(), | |||
| }; | |||
| let yao = User { | |||
| name: "yao".to_string(), | |||
| status: UserStatus::Away, | |||
| average_speed: 11, | |||
| num_downloads: 12, | |||
| unknown: 13, | |||
| num_files: 14, | |||
| num_folders: 15, | |||
| num_free_slots: 16, | |||
| country: "CN".to_string(), | |||
| }; | |||
| let mut options = ContextOptions::default(); | |||
| options.initial_state.users.insert(shruti.clone()); | |||
| options.initial_state.users.insert(yao.clone()); | |||
| let mut bundle = ContextBundle::new(options); | |||
| UserListRequestHandler::default() | |||
| .run(&mut bundle.context, &()) | |||
| .unwrap(); | |||
| let response = bundle.control_response_rx.blocking_recv().unwrap(); | |||
| let mut users = match response { | |||
| Response::UserListResponse(UserListResponse { users }) => users, | |||
| _ => panic!("Unexpected control response: {:?}", response), | |||
| }; | |||
| users.sort_by_key(user_name); | |||
| assert_eq!( | |||
| users, | |||
| vec![("shruti".to_string(), shruti), ("yao".to_string(), yao)] | |||
| ); | |||
| } | |||
| } | |||