feat: add user profile management with update and retrieval endpoints, enhance database setup for testing

This commit is contained in:
2025-09-06 14:24:27 +02:00
parent 6e63dca513
commit c9e99e6f23
21 changed files with 422 additions and 42 deletions

View File

@@ -13,16 +13,24 @@ pub struct TestApp {
}
pub async fn setup() -> TestApp {
std::env::set_var("DATABASE_URL", "sqlite::memory:");
std::env::set_var(
"MANAGEMENT_DATABASE_URL",
"postgres://postgres:postgres@localhost:5434/postgres",
);
std::env::set_var(
"DATABASE_URL",
"postgres://postgres:postgres@localhost:5434/postgres",
);
std::env::set_var("AUTH_SECRET", "test_secret");
std::env::set_var("BASE_URL", "http://localhost:3000");
std::env::set_var("HOST", "localhost");
std::env::set_var("PORT", "3000");
std::env::set_var("LOG_LEVEL", "debug");
let db = setup_test_db("sqlite::memory:")
.await
.expect("Failed to set up test db");
let db = setup_test_db().await.expect("Failed to set up test db");
let db = db.clone();
let router = setup_router(db.clone(), &app::config::Config::from_env());
TestApp { router, db }
}

View File

@@ -1,10 +1,10 @@
use axum::http::StatusCode;
use http_body_util::BodyExt;
use serde_json::Value;
use serde_json::{json, Value};
use utils::testing::{make_get_request, make_post_request};
use utils::testing::{make_get_request, make_jwt_request, make_post_request};
use crate::api::main::setup;
use crate::api::main::{login_user, setup};
#[tokio::test]
async fn test_post_users() {
@@ -16,7 +16,11 @@ async fn test_post_users() {
assert_eq!(response.status(), StatusCode::CREATED);
let body = response.into_body().collect().await.unwrap().to_bytes();
assert_eq!(&body[..], br#"{"id":1,"username":"test"}"#);
let v: Value = serde_json::from_slice(&body).unwrap();
assert_eq!(v["id"], 1);
assert_eq!(v["username"], "test");
assert!(v["display_name"].is_null());
}
#[tokio::test]
@@ -26,7 +30,6 @@ pub(super) async fn test_post_users_error() {
let body = r#"{"username": "1", "password": "password123"}"#.to_owned();
let response = make_post_request(app.router, "/auth/register", body, None).await;
println!("{:?}", response);
assert_eq!(response.status(), StatusCode::UNPROCESSABLE_ENTITY);
let body = response.into_body().collect().await.unwrap().to_bytes();
@@ -46,5 +49,67 @@ pub async fn test_get_users() {
assert_eq!(response.status(), StatusCode::OK);
let body = response.into_body().collect().await.unwrap().to_bytes();
assert_eq!(&body[..], br#"{"users":[{"id":1,"username":"test"}]}"#);
let v: Value = serde_json::from_slice(&body).unwrap();
assert!(v["users"].is_array());
let users_array = v["users"].as_array().unwrap();
assert_eq!(users_array.len(), 1);
assert_eq!(users_array[0]["id"], 1);
assert_eq!(users_array[0]["username"], "test");
}
#[tokio::test]
async fn test_me_endpoints() {
let app = setup().await;
// 1. Register a new user
let register_body = json!({
"username": "me_user",
"password": "password123"
})
.to_string();
let response =
make_post_request(app.router.clone(), "/auth/register", register_body, None).await;
assert_eq!(response.status(), StatusCode::CREATED);
// 2. Log in to get a token
let token = login_user(app.router.clone(), "me_user", "password123").await;
// 3. GET /users/me to fetch initial profile
let response = make_jwt_request(app.router.clone(), "/users/me", "GET", None, &token).await;
assert_eq!(response.status(), StatusCode::OK);
let body = response.into_body().collect().await.unwrap().to_bytes();
let v: Value = serde_json::from_slice(&body).unwrap();
assert_eq!(v["username"], "me_user");
assert!(v["bio"].is_null());
assert!(v["display_name"].is_null());
// 4. PUT /users/me to update the profile
let update_body = json!({
"display_name": "Me User",
"bio": "This is my updated bio.",
"avatar_url": "https://example.com/avatar.png"
})
.to_string();
let response = make_jwt_request(
app.router.clone(),
"/users/me",
"PUT",
Some(update_body),
&token,
)
.await;
assert_eq!(response.status(), StatusCode::OK);
let body = response.into_body().collect().await.unwrap().to_bytes();
let v_updated: Value = serde_json::from_slice(&body).unwrap();
assert_eq!(v_updated["display_name"], "Me User");
assert_eq!(v_updated["bio"], "This is my updated bio.");
// 5. GET /users/me again to verify the update was persisted
let response = make_jwt_request(app.router.clone(), "/users/me", "GET", None, &token).await;
assert_eq!(response.status(), StatusCode::OK);
let body = response.into_body().collect().await.unwrap().to_bytes();
let v_verify: Value = serde_json::from_slice(&body).unwrap();
assert_eq!(v_verify["display_name"], "Me User");
assert_eq!(v_verify["bio"], "This is my updated bio.");
}