feat: add user profile management with update and retrieval endpoints, enhance database setup for testing
This commit is contained in:
@@ -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 }
|
||||
}
|
||||
|
@@ -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.");
|
||||
}
|
||||
|
Reference in New Issue
Block a user