ciboulette 0.1.4

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

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

    let res: CibouletteQueryParameters = builder
        .build(&bag, bag.get_type("peoples").unwrap().clone())
        .expect("to build correctly");
    let sparse = res.sparse();
    assert_eq!(sparse.len(), 1);
    let sparse = sparse
        .get(bag.get_type("peoples").unwrap().as_ref())
        .unwrap();
    assert_eq!(sparse.len(), 1);
    assert_eq!(sparse[0], "first-name");
}

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

    let res: CibouletteQueryParameters = builder
        .build(&bag, bag.get_type("peoples").unwrap().clone())
        .expect("to build correctly");
    let sparse = res.sparse();
    assert_eq!(sparse.len(), 1);
    let sparse = sparse
        .get(bag.get_type("peoples").unwrap().as_ref())
        .unwrap();
    assert_eq!(sparse.len(), 2);
    assert_eq!(sparse[0], "first-name");
    assert_eq!(sparse[1], "last-name");
}

#[test]
fn multiple_types() {
    let (bag, builder) = setup(r#"fields[peoples]=first-name&fields[articles]=title"#);

    let res: CibouletteQueryParameters = builder
        .build(&bag, bag.get_type("peoples").unwrap().clone())
        .expect("to build correctly");
    let sparse = res.sparse();
    assert_eq!(sparse.len(), 2);
    let peoples = sparse
        .get(bag.get_type("peoples").unwrap().as_ref())
        .unwrap();
    assert_eq!(peoples.len(), 1);
    assert_eq!(peoples[0], "first-name");
    let articles = sparse
        .get(bag.get_type("articles").unwrap().as_ref())
        .unwrap();
    assert_eq!(articles.len(), 1);
    assert_eq!(articles[0], "title");
}

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

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

#[test]
fn unknown_fields() {
    let (bag, builder) = setup(r#"fields[peoples]=AAAA"#);

    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() == "AAAA"),
        true
    );
}

#[test]
fn empty_type() {
    let (bag, builder) = setup(r#"fields[]=AAAA"#);

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

#[test]
fn empty_field() {
    let (bag, builder) = setup(r#"fields[peoples]="#);

    let query: CibouletteQueryParameters = builder
        .build(&bag, bag.get_type("peoples").unwrap().clone())
        .expect("to_build correctly");
    let peoples_sparse = query
        .sparse()
        .get(bag.get_type("peoples").unwrap().as_ref())
        .unwrap();
    assert_eq!(peoples_sparse.len(), 0);
}

#[test]
fn url_encoded_type() {
    let (bag, builder) = setup(r#"fields%5Bpeoples%5D=first-name"#);

    let res: CibouletteQueryParameters = builder
        .build(&bag, bag.get_type("peoples").unwrap().clone())
        .expect("to build correctly");
    let sparse = res.sparse();
    assert_eq!(sparse.len(), 1);
    let sparse = sparse
        .get(bag.get_type("peoples").unwrap().as_ref())
        .unwrap();
    assert_eq!(sparse.len(), 1);
    assert_eq!(sparse[0], "first-name");
}