ciboulette 0.1.4

Library to parse JSON:API requests and build responses
Documentation
use super::*;

#[test]
fn single_asc() {
    let (bag, builder) = setup(r#"sort=first-name"#);

    let res: CibouletteQueryParameters = builder
        .build(&bag, bag.get_type("peoples").unwrap().clone())
        .expect("to build correctly");
    let sorting = res.sorting();
    assert_eq!(sorting.len(), 1);
    assert_eq!(
        matches!(sorting[0].direction(), &CibouletteSortingDirection::Asc),
        true
    );
    assert_eq!(sorting[0].field(), "first-name");
}

#[test]
fn single_asc_with_positive() {
    let (bag, builder) = setup(r#"sort=%2Bfirst-name"#);

    let res: CibouletteQueryParameters = builder
        .build(&bag, bag.get_type("peoples").unwrap().clone())
        .expect("to build correctly");
    let sorting = res.sorting();
    assert_eq!(sorting.len(), 1);
    assert_eq!(
        matches!(sorting[0].direction(), &CibouletteSortingDirection::Asc),
        true
    );
    assert_eq!(sorting[0].field(), "first-name");
}

#[test]
fn single_desc() {
    let (bag, builder) = setup(r#"sort=-first-name"#);

    let res: CibouletteQueryParameters = builder
        .build(&bag, bag.get_type("peoples").unwrap().clone())
        .expect("to build correctly");
    let sorting = res.sorting();
    assert_eq!(sorting.len(), 1);
    assert_eq!(
        matches!(sorting[0].direction(), &CibouletteSortingDirection::Desc),
        true
    );
    assert_eq!(sorting[0].field(), "first-name");
}

#[test]
fn multiple_mixed() {
    let (bag, builder) = setup(r#"sort=last-name,-first-name"#);

    let res: CibouletteQueryParameters = builder
        .build(&bag, bag.get_type("peoples").unwrap().clone())
        .expect("to build correctly");
    let sorting = res.sorting();
    assert_eq!(sorting.len(), 2);
    assert_eq!(
        matches!(sorting[0].direction(), &CibouletteSortingDirection::Asc),
        true
    );
    assert_eq!(sorting[0].field(), "last-name");
    assert_eq!(
        matches!(sorting[1].direction(), &CibouletteSortingDirection::Desc),
        true
    );
    assert_eq!(sorting[1].field(), "first-name");
}

#[test]
fn unknown_field() {
    let (bag, builder) = setup(r#"sort=unknown_field"#);

    let err: CibouletteError = builder
        .build(&bag, bag.get_type("peoples").unwrap().clone())
        .expect_err("not to build correctly");
    assert_eq!(
        matches!(err, CibouletteError::UnknownField(type_, field) if type_.as_str() == "peoples" && field.as_str() == "unknown_field"),
        true
    );
}

#[test]
fn empty() {
    let (bag, builder) = setup(r#"sort="#);

    let err: CibouletteError = builder
        .build(&bag, bag.get_type("peoples").unwrap().clone())
        .expect_err("not to build correctly");
    assert_eq!(
        matches!(err, CibouletteError::UnknownField(type_, field) if type_.as_str() == "peoples" && field.as_str() == "<empty>"),
        true
    );
}