use crate::objects::user::User;
use crate::ServerConfig;
use axum::extract::State;
use axum::http::StatusCode;
use axum::Json;
use log::info;
pub async fn register_user(
State(config): State<ServerConfig>,
Json(payload): Json<User>,
) -> Result<StatusCode, String> {
let mut newcomer = User::new(payload.login.clone());
let fakehub = config.fakehub;
let github = fakehub.clone().main();
match newcomer.register_in(&mut github.clone(), fakehub) {
Ok(_) => {
info!("New user is here. Hello @{}", newcomer.login);
Ok(StatusCode::CREATED)
}
Err(e) => Err(format!("Can't register user @{}: {}", newcomer.login, e)),
}
}
#[cfg(test)]
mod tests {
use crate::handlers::register_user::register_user;
use crate::objects::fakehub::FakeHub;
use crate::objects::user::User;
use crate::ServerConfig;
use anyhow::Result;
use axum::extract::State;
use axum::Json;
use hamcrest::{equal_to, is, HamcrestMatcher};
#[tokio::test]
async fn registers_user() -> Result<()> {
let server = ServerConfig {
fakehub: FakeHub::default(),
};
let state = State(server);
let status = register_user(state, Json::from(User::new(String::from("new1234"))))
.await
.expect("Failed to register user");
assert_that!(status.as_u16(), is(equal_to(201)));
Ok(())
}
#[should_panic(expected = "Failed to register user")]
#[tokio::test]
async fn panics_when_user_exists() {
let server = ServerConfig {
fakehub: FakeHub::default(),
};
let state = State(server);
register_user(state, Json::from(User::new(String::from("jeff"))))
.await
.expect("Failed to register user");
}
}