From d0578f5a394d542caccab866376f9a649ebb2770 Mon Sep 17 00:00:00 2001 From: Edinson Jim <4842086+edinsonjim@users.noreply.github.com> Date: Mon, 8 Dec 2025 22:51:36 +0100 Subject: [PATCH] test: add paginated user retrieval tests --- src/om/mod.rs | 2 +- tests/users/migrations.rs | 17 ++++++++++++ tests/users/mod.rs | 1 + tests/users/paginated.rs | 58 +++++++++++++++++++++++++++++++++++++++ 4 files changed, 77 insertions(+), 1 deletion(-) create mode 100644 tests/users/paginated.rs diff --git a/src/om/mod.rs b/src/om/mod.rs index 38834e8..66565cb 100644 --- a/src/om/mod.rs +++ b/src/om/mod.rs @@ -18,7 +18,7 @@ pub struct UserCreated { pub id: i32, } -#[derive(Serialize, ToSchema)] +#[derive(Serialize, Deserialize, ToSchema)] #[serde(rename_all = "camelCase")] pub struct UserPage { pub id: i32, diff --git a/tests/users/migrations.rs b/tests/users/migrations.rs index 1de3012..96beea3 100644 --- a/tests/users/migrations.rs +++ b/tests/users/migrations.rs @@ -16,3 +16,20 @@ pub async fn insert_idesoft_user( .save(conn) .await } + +pub async fn insert_blue_bird_user( + conn: &impl ConnectionTrait, +) -> Result { + let created_at = Utc::now(); + + schemas::user::ActiveModel { + id: ActiveValue::NotSet, + username: ActiveValue::Set("bluebird".into()), + password: ActiveValue::Set("bluebird".into()), + disabled: ActiveValue::Set(false.into()), + created_at: ActiveValue::Set(created_at.naive_utc()), + creator_id: ActiveValue::Set(1), + } + .save(conn) + .await +} diff --git a/tests/users/mod.rs b/tests/users/mod.rs index 5f5d8c5..f837ebf 100644 --- a/tests/users/mod.rs +++ b/tests/users/mod.rs @@ -1,3 +1,4 @@ mod create; mod migrations; +mod paginated; mod update; diff --git a/tests/users/paginated.rs b/tests/users/paginated.rs new file mode 100644 index 0000000..f54d520 --- /dev/null +++ b/tests/users/paginated.rs @@ -0,0 +1,58 @@ +use axum::{ + body::Body, + http::{self, Request, StatusCode}, +}; +use f5a_services::om::UserPage; +use tower::ServiceExt; + +use crate::{setup::TestContext, test_ext::IntoValue, users::migrations}; + +#[tokio::test] +async fn it_reads_paginated_users() { + let ctx = TestContext::new().await; + ctx.setup_schema().await; + + migrations::insert_idesoft_user(ctx.db.as_ref()) + .await + .unwrap(); + migrations::insert_blue_bird_user(ctx.db.as_ref()) + .await + .unwrap(); + + let app = ctx.configure(); + + let req = Request::get("/api/users?page=0&page_size=10") + .header(http::header::CONTENT_TYPE, mime::APPLICATION_JSON.as_ref()) + .body(Body::empty()) + .unwrap(); + + let res = app.oneshot(req).await.unwrap(); + assert_eq!(res.status(), StatusCode::OK); + + let value = res.into_value::>().await; + assert_eq!(value.len(), 2); + + assert_eq!(value[0].username, "bluebird"); + assert_eq!(value[0].disabled, false); + assert_eq!(value[1].username, "idesoftd"); + assert_eq!(value[1].disabled, true); +} + +#[tokio::test] +async fn it_reads_empty_paginated_users() { + let ctx = TestContext::new().await; + ctx.setup_schema().await; + + let app = ctx.configure(); + + let req = Request::get("/api/users?page=0&page_size=10") + .header(http::header::CONTENT_TYPE, mime::APPLICATION_JSON.as_ref()) + .body(Body::empty()) + .unwrap(); + + let res = app.oneshot(req).await.unwrap(); + assert_eq!(res.status(), StatusCode::OK); + + let value = res.into_value::>().await; + assert_eq!(value.len(), 0); +}