chore: scaffold axum server with in-memory CRUD, auth stub and tracing

This commit is contained in:
2026-04-19 16:03:04 +03:00
parent 132de93600
commit 90c9b9d6ff
10 changed files with 1756 additions and 13 deletions

View 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");
}
}