jsonbox 0.2.0

Rust wrapper for jsonbox.io
Documentation
use jsonbox::{Client, Error};
use matches::*;
use mockito::mock;
use serde::{Deserialize, Serialize};

#[derive(Serialize, Deserialize, Debug)]
struct Data {
    name: String,
    count: i32,
}

#[test]
fn test_create() {
    let _m = mock("POST", "/00000000000000000000")
        .with_status(200)
        .with_header("content-type", "application/json; charset=utf-8")
        .with_body(r#"{"_id":"11111111111111111111","name":"rust","count":42,"_createdOn":"2019-09-22T12:24:37.513Z"}"#)
        .create();
    let server_url = mockito::server_url();
    let client = Client::new("00000000000000000000").with_base_url(&server_url);
    let data = Data {
        name: "rust".into(),
        count: 42,
    };
    let res = client.create(&data);
    assert!(res.is_ok());

    let (data, meta) = res.unwrap();
    assert_eq!(data.name, "rust");
    assert_eq!(data.count, 42);
    assert_eq!(meta.id, "11111111111111111111");
    assert_eq!(meta.created_on, "2019-09-22T12:24:37.513Z");
    assert_eq!(meta.updated_on, "2019-09-22T12:24:37.513Z");
}

#[test]
fn test_create_bulk() {
    let _m = mock("POST", "/00000000000000000000")
        .with_status(200)
        .with_header("content-type", "application/json; charset=utf-8")
        .with_body(r#"[{"_id":"11111111111111111111","name":"rust","count":42,"_createdOn":"2019-09-22T12:24:37.513Z"},{"_id":"22222222222222222222","name":"cargo","count":7,"_createdOn":"2019-09-22T12:24:37.513Z"}]"#)
        .create();
    let server_url = mockito::server_url();
    let client = Client::new("00000000000000000000").with_base_url(&server_url);
    let data = vec![
        Data {
            name: "rust".into(),
            count: 42,
        },
        Data {
            name: "cargo".into(),
            count: 7,
        },
    ];
    let res = client.create_bulk(&data);
    assert!(res.is_ok());

    let bulk = res.unwrap();
    assert_eq!(bulk.len(), 2);

    let (data, meta) = bulk.first().unwrap();
    assert_eq!(data.name, "rust");
    assert_eq!(meta.id, "11111111111111111111");

    let (data, meta) = bulk.last().unwrap();
    assert_eq!(data.name, "cargo");
    assert_eq!(meta.id, "22222222222222222222");
}

#[test]
fn test_read_all() {
    let _m = mock("GET", "/00000000000000000000")
        .with_status(200)
        .with_header("content-type", "application/json; charset=utf-8")
        .with_body(r#"[{"_id":"11111111111111111111","name":"kuy","count":42,"_createdOn":"2019-09-23T12:24:37.513Z"},{"_id":"22222222222222222222","name":"github","count":7,"_createdOn":"2019-09-22T12:24:37.513Z"}]"#)
        .create();
    let server_url = mockito::server_url();
    let client = Client::new("00000000000000000000").with_base_url(&server_url);
    let res = client.read().all::<Data>();
    assert!(res.is_ok());

    let all = res.unwrap();
    assert_eq!(all.len(), 2);

    let (data, meta) = all.first().unwrap();
    assert_eq!(data.name, "kuy");
    assert_eq!(meta.id, "11111111111111111111");

    let (data, meta) = all.last().unwrap();
    assert_eq!(data.name, "github");
    assert_eq!(meta.id, "22222222222222222222");
}

#[test]
fn test_read_all_empty() {
    let _m = mock("GET", "/99999999999999999999")
        .with_status(200)
        .with_header("content-type", "application/json; charset=utf-8")
        .with_body("[]")
        .create();
    let server_url = mockito::server_url();
    let client = Client::new("99999999999999999999").with_base_url(&server_url);
    let res = client.read().all::<Data>();
    assert!(res.is_ok());

    let all = res.unwrap();
    assert_eq!(all.len(), 0);
}

#[test]
fn test_read_limit() {
    let _m = mock("GET", "/00000000000000000000?sort=-_createdOn&skip=0&limit=1")
        .with_status(200)
        .with_header("content-type", "application/json; charset=utf-8")
        .with_body(r#"[{"_id":"11111111111111111111","name":"kuy","count":42,"_createdOn":"2019-09-23T12:24:37.513Z"}]"#)
        .create();
    let server_url = mockito::server_url();
    let client = Client::new("00000000000000000000").with_base_url(&server_url);
    let res = client.read().limit(1).run::<Data>();
    assert!(res.is_ok());

    let all = res.unwrap();
    assert_eq!(all.len(), 1);

    let (data, meta) = all.first().unwrap();
    assert_eq!(data.name, "kuy");
    assert_eq!(meta.id, "11111111111111111111");
}

#[test]
fn test_read_skip() {
    let _m = mock("GET", "/00000000000000000000?sort=-_createdOn&skip=1&limit=20")
        .with_status(200)
        .with_header("content-type", "application/json; charset=utf-8")
        .with_body(r#"[{"_id":"22222222222222222222","name":"github","count":7,"_createdOn":"2019-09-22T12:24:37.513Z"}]"#)
        .create();
    let server_url = mockito::server_url();
    let client = Client::new("00000000000000000000").with_base_url(&server_url);
    let res = client.read().skip(1).run::<Data>();
    assert!(res.is_ok());

    let all = res.unwrap();
    assert_eq!(all.len(), 1);

    let (data, meta) = all.first().unwrap();
    assert_eq!(data.name, "github");
    assert_eq!(meta.id, "22222222222222222222");
}

#[test]
fn test_read_sort() {
    let _m = mock("GET", "/00000000000000000000?sort=count&skip=0&limit=20")
        .with_status(200)
        .with_header("content-type", "application/json; charset=utf-8")
        .with_body(r#"[{"_id":"22222222222222222222","name":"github","count":7,"_createdOn":"2019-09-22T12:24:37.513Z"},{"_id":"11111111111111111111","name":"kuy","count":42,"_createdOn":"2019-09-23T12:24:37.513Z"}]"#)
        .create();
    let server_url = mockito::server_url();
    let client = Client::new("00000000000000000000").with_base_url(&server_url);
    let res = client.read().order_by("count").run::<Data>();
    assert!(res.is_ok());

    let all = res.unwrap();
    assert_eq!(all.len(), 2);

    let (data, meta) = all.first().unwrap();
    assert_eq!(data.name, "github");
    assert_eq!(data.count, 7);
    assert_eq!(meta.id, "22222222222222222222");

    let (data, meta) = all.last().unwrap();
    assert_eq!(data.name, "kuy");
    assert_eq!(data.count, 42);
    assert_eq!(meta.id, "11111111111111111111");
}

#[test]
fn test_read() {
    let _m = mock("GET", "/00000000000000000000/11111111111111111111")
        .with_status(200)
        .with_header("content-type", "application/json; charset=utf-8")
        .with_body(r#"{"_id":"11111111111111111111","name":"kuy","count":42,"_createdOn":"2019-09-22T12:24:37.513Z"}"#)
        .create();
    let server_url = mockito::server_url();
    let client = Client::new("00000000000000000000").with_base_url(&server_url);
    let res = client.read().id::<Data>("11111111111111111111");
    assert!(res.is_ok());

    let (data, meta) = res.unwrap();
    assert_eq!(data.name, "kuy");
    assert_eq!(data.count, 42);
    assert_eq!(meta.id, "11111111111111111111");
    assert_eq!(meta.created_on, "2019-09-22T12:24:37.513Z");
    assert_eq!(meta.updated_on, "2019-09-22T12:24:37.513Z");
}

#[test]
fn test_read_unknown_record_id() {
    let _m = mock("GET", "/00000000000000000000/11111111111111111111")
        .with_status(500)
        .with_header("content-type", "application/json; charset=utf-8")
        .with_body(r#"{"message":"Cannot read property '_id' of null"}"#)
        .create();
    let server_url = mockito::server_url();
    let client = Client::new("00000000000000000000").with_base_url(&server_url);
    let res = client.read().id::<Data>("11111111111111111111");
    assert!(res.is_err());

    let err = res.unwrap_err();
    assert_matches!(err, Error::General { code, message: _ } if code == 500);
}

#[test]
fn test_update() {
    let _m = mock("PUT", "/00000000000000000000/33333333333333333333")
        .with_status(200)
        .with_header("content-type", "application/json; charset=utf-8")
        .with_body(r#"{"message":"Record updated."}"#)
        .create();
    let server_url = mockito::server_url();
    let client = Client::new("00000000000000000000").with_base_url(&server_url);
    let data = Data {
        name: "cargo".into(),
        count: 42,
    };
    let res = client.update("33333333333333333333", &data);
    assert!(res.is_ok());

    let _m = mock("GET", "/00000000000000000000/33333333333333333333")
        .with_status(200)
        .with_header("content-type", "application/json; charset=utf-8")
        .with_body(r#"{"_id":"33333333333333333333","name":"cargo","count":42,"_createdOn":"2019-09-22T12:24:37.513Z","_updatedOn":"2019-09-22T12:25:52.114Z"}"#)
        .create();

    let res = client.read().id::<Data>("33333333333333333333");
    assert!(res.is_ok());

    let (data, meta) = res.unwrap();
    assert_eq!(data.name, "cargo");
    assert_eq!(data.count, 42);
    assert_eq!(meta.id, "33333333333333333333");
    assert_eq!(meta.created_on, "2019-09-22T12:24:37.513Z");
    assert_eq!(meta.updated_on, "2019-09-22T12:25:52.114Z");
}

#[test]
fn test_update_unknown_record_id() {
    let _m = mock("PUT", "/00000000000000000000/11111111111111111111")
        .with_status(400)
        .with_header("content-type", "application/json; charset=utf-8")
        .with_body(r#"{"message":"Invalid record Id"}"#)
        .create();
    let server_url = mockito::server_url();
    let client = Client::new("00000000000000000000").with_base_url(&server_url);
    let data = Data {
        name: "crates".into(),
        count: 42,
    };
    let res = client.update("11111111111111111111", &data);
    assert!(res.is_err());

    let err = res.unwrap_err();
    assert_matches!(err, Error::General { code, message: _ } if code == 400);
}

#[test]
fn test_delete() {
    let _m = mock("DELETE", "/00000000000000000000/22222222222222222222")
        .with_status(200)
        .with_header("content-type", "application/json; charset=utf-8")
        .with_body(r#"{"message":"Record removed."}"#)
        .create();
    let server_url = mockito::server_url();
    let client = Client::new("00000000000000000000").with_base_url(&server_url);
    let res = client.delete("22222222222222222222");
    assert!(res.is_ok());
}

#[test]
fn test_delete_unknown_record_id() {
    let _m = mock("DELETE", "/00000000000000000000/44444444444444444444")
        .with_status(400)
        .with_header("content-type", "application/json; charset=utf-8")
        .with_body(r#"{"message":"Invalid record Id"}"#)
        .create();
    let server_url = mockito::server_url();
    let client = Client::new("00000000000000000000").with_base_url(&server_url);
    let res = client.delete("44444444444444444444");
    assert!(res.is_err());

    let err = res.unwrap_err();
    assert_matches!(err, Error::General { code, message: _ } if code == 400);
}