actix-web-pagination 0.1.0

Pagination for actix-web
Documentation
#[macro_use]
extern crate serde;

#[macro_use]
extern crate actix_web;

use actix_web::{test, App, HttpResponse};
use actix_web_pagination::Pagination;

#[derive(Debug, Deserialize, Serialize, PartialEq, Eq)]
struct R {
    page: u32,
    per_page: u32,
    offset: u32,
}

impl R {
    fn new(page: u32, per_page: u32) -> Self {
        Self {
            page,
            per_page,
            offset: page * per_page,
        }
    }
}

#[get("/")]
async fn index(page: Pagination) -> HttpResponse {
    HttpResponse::Ok().json(R {
        page: page.page(),
        per_page: page.per_page(),
        offset: page.offset(),
    })
}

#[actix_rt::test]
async fn it_works_with_page() -> actix_web::Result<()> {
    let t = test::start(|| App::new().service(index));

    let mut res = t.get("/").send().await?;
    assert_eq!(R::new(0, 20), res.json().await?);

    let mut res = t.get("/?page=-1").send().await?;
    assert_eq!(R::new(0, 20), res.json().await?);

    let mut res = t.get("/?page=0").send().await?;
    assert_eq!(R::new(0, 20), res.json().await?);

    let mut res = t.get("/?page=1").send().await?;
    assert_eq!(R::new(0, 20), res.json().await?);

    let mut res = t.get("/?page=2").send().await?;
    assert_eq!(R::new(1, 20), res.json().await?);

    let mut res = t.get("/?page=10").send().await?;
    assert_eq!(R::new(9, 20), res.json().await?);

    let mut res = t.get("/?page=ok").send().await?;
    assert_eq!(R::new(0, 20), res.json().await?);

    Ok(())
}

#[actix_rt::test]
async fn it_works_with_per_page() -> actix_web::Result<()> {
    let t = test::start(|| App::new().service(index));

    let mut res = t.get("/").send().await?;
    assert_eq!(R::new(0, 20), res.json().await?);

    let mut res = t.get("/?per_page=10").send().await?;
    assert_eq!(R::new(0, 20), res.json().await?);

    let mut res = t.get("/?per_page=20").send().await?;
    assert_eq!(R::new(0, 20), res.json().await?);

    let mut res = t.get("/?per_page=100").send().await?;
    assert_eq!(R::new(0, 100), res.json().await?);

    let mut res = t.get("/?per_page=101").send().await?;
    assert_eq!(R::new(0, 100), res.json().await?);

    Ok(())
}

#[actix_rt::test]
async fn it_works_with_config() -> actix_web::Result<()> {
    let t = test::start(|| {
        App::new().service(index).data(
            Pagination::config()
                .page_name("page1")
                .per_page_name("limit")
                .default_per_page(50),
        )
    });

    let mut res = t.get("/").send().await?;
    assert_eq!(R::new(0, 50), res.json().await?);

    let mut res = t.get("/?page=10").send().await?;
    assert_eq!(R::new(0, 50), res.json().await?);

    let mut res = t.get("/?page1=10").send().await?;
    assert_eq!(R::new(9, 50), res.json().await?);

    let mut res = t.get("/?per_page=60").send().await?;
    assert_eq!(R::new(0, 50), res.json().await?);

    let mut res = t.get("/?limit=60").send().await?;
    assert_eq!(R::new(0, 60), res.json().await?);

    Ok(())
}