use crate::objects::json::json_user::JsonUser;
use crate::ServerConfig;
use axum::extract::State;
use axum::Json;
use serde_json::Value;
pub async fn users(State(config): State<ServerConfig>) -> Json<Vec<Value>> {
let fakehub = config.fakehub;
let github = fakehub.main();
let mut users: Vec<Value> = github
.lock()
.expect("Failed to lock")
.clone()
.users()
.iter()
.map(|u| JsonUser::new(u.clone()).as_json())
.collect();
users.sort_by_key(|user| user.get("id").and_then(|id| id.as_u64()));
Json(users)
}
#[cfg(test)]
mod tests {
use crate::handlers::users::users;
use crate::objects::fakehub::FakeHub;
use crate::ServerConfig;
use anyhow::Result;
use axum::extract::State;
use hamcrest::{equal_to, is, HamcrestMatcher};
#[tokio::test]
#[allow(clippy::question_mark_used)]
async fn returns_users() -> Result<()> {
let users = users(State(ServerConfig {
fakehub: FakeHub::default(),
}))
.await;
let user = users.first().expect("Failed to get first JSON user");
assert_that!(users.len(), is(equal_to(2)));
assert_that!(user["id"].as_u64(), is(equal_to(Some(1))));
assert_that!(user["login"].as_str(), is(equal_to(Some("jeff"))));
Ok(())
}
}