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