chore: scaffold axum server with in-memory CRUD, auth stub and tracing
This commit is contained in:
101
backend/src/web/routes_login.rs
Normal file
101
backend/src/web/routes_login.rs
Normal file
@@ -0,0 +1,101 @@
|
||||
use axum::{
|
||||
Json, Router,
|
||||
routing::{get, post},
|
||||
};
|
||||
use serde::Deserialize;
|
||||
use serde_json::{Value, json};
|
||||
use tower_cookies::{Cookie, Cookies};
|
||||
|
||||
use crate::error::LoftError;
|
||||
|
||||
pub fn routes_login() -> Router {
|
||||
Router::new()
|
||||
.route("/login", post(login))
|
||||
.route("/register", get(register))
|
||||
}
|
||||
|
||||
async fn login(
|
||||
cookies: Cookies,
|
||||
Json(payload): Json<LoginPayload>,
|
||||
) -> Result<Json<Value>, LoftError> {
|
||||
//TODO: real db/auth logic
|
||||
if payload.username != "x" || payload.password != "y" {
|
||||
return Err(LoftError::LoginFail);
|
||||
}
|
||||
|
||||
// FIXME: real auth-token generation-signature
|
||||
cookies.add(Cookie::new("auth-token", "user-1.exp.sign"));
|
||||
|
||||
let body = Json(json!({
|
||||
"result": {
|
||||
"success": true
|
||||
}
|
||||
}));
|
||||
Ok(body)
|
||||
}
|
||||
|
||||
async fn register() -> &'static str {
|
||||
"register"
|
||||
}
|
||||
|
||||
#[derive(Debug, Deserialize)]
|
||||
struct LoginPayload {
|
||||
username: String,
|
||||
password: String,
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use axum::{
|
||||
Router,
|
||||
routing::{get, post},
|
||||
};
|
||||
use axum_test::TestServer;
|
||||
use serde_json::json;
|
||||
|
||||
use crate::web::routes_login::{login, register};
|
||||
|
||||
#[tokio::test]
|
||||
async fn test_routes_login_wrong_credentials() {
|
||||
let app = Router::new()
|
||||
.route(&"/login", post(login))
|
||||
.layer(tower_cookies::CookieManagerLayer::new());
|
||||
let server = TestServer::new(app);
|
||||
let response = server
|
||||
.post("/login")
|
||||
.json(&json!({
|
||||
"username": "wrong",
|
||||
"password": "wrong",
|
||||
}))
|
||||
.await;
|
||||
response.assert_status_unauthorized();
|
||||
}
|
||||
|
||||
#[tokio::test]
|
||||
async fn test_routes_login() {
|
||||
let app = Router::new()
|
||||
.route(&"/login", post(login))
|
||||
.layer(tower_cookies::CookieManagerLayer::new());
|
||||
let server = TestServer::new(app);
|
||||
let response = server
|
||||
.post("/login")
|
||||
.json(&json!({
|
||||
"username": "x",
|
||||
"password": "y",
|
||||
}))
|
||||
.await;
|
||||
response.assert_status_ok().assert_json(&json!({
|
||||
"result": {
|
||||
"success": true
|
||||
}
|
||||
}));
|
||||
}
|
||||
|
||||
#[tokio::test]
|
||||
async fn test_routes_register() {
|
||||
let app = Router::new().route(&"/register", get(register));
|
||||
let server = TestServer::new(app);
|
||||
let response = server.get("/register").await;
|
||||
response.assert_status_ok().assert_text("register");
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user