smalld_rust 0.2.0

A minimalist client for the Discord API
use serde_json::json;
use smalld::{Error, QueryParameters, SmallD, SmallDBuilder};

const DUMMY_TOKEN: &str = "DuMmY.ToKeN";
const HTTP_BIN: &str = "http://httpbin.org";

fn subject() -> SmallD {
    SmallDBuilder::new()
        .token(DUMMY_TOKEN)
        .base_url(HTTP_BIN)
        .build()
        .unwrap()
}

fn http_bin(path: &str) -> String {
    format!("{}{}", HTTP_BIN, path)
}

fn assert_strlike_eq<A: AsRef<str>, B: AsRef<str>>(lhs: A, rhs: B) {
    assert_eq!(lhs.as_ref(), rhs.as_ref());
}

#[test]
fn it_makes_get_request() {
    let rsp = subject().get("/get").unwrap();
    assert_strlike_eq(rsp["url"].as_str().unwrap(), http_bin("/get"));
}

#[test]
fn it_makes_get_request_with_parameters() {
    let rsp = subject()
        .get_with_parameters(
            "/get",
            QueryParameters::new()
                .add("key1", "value1")
                .add("key2", "value2"),
        )
        .unwrap();
    assert_strlike_eq(
        rsp["url"].as_str().unwrap(),
        http_bin("/get?key1=value1&key2=value2"),
    );
}

#[test]
fn it_makes_post_request() {
    let json = json!({"foo": "bar"});
    let rsp = subject().post("/post", json!({"foo": "bar"})).unwrap();
    assert_strlike_eq(rsp["url"].as_str().unwrap(), http_bin("/post"));
    assert_eq!(rsp["json"], json);
}

#[test]
fn it_makes_put_request() {
    let json = json!({"foo": "bar"});
    let rsp = subject().put("/put", json!({"foo": "bar"})).unwrap();
    assert_strlike_eq(rsp["url"].as_str().unwrap(), http_bin("/put"));
    assert_eq!(rsp["json"], json);
}

#[test]
fn it_makes_patch_request() {
    let json = json!({"foo": "bar"});
    let rsp = subject().patch("/patch", json!({"foo": "bar"})).unwrap();
    assert_strlike_eq(rsp["url"].as_str().unwrap(), http_bin("/patch"));
    assert_eq!(rsp["json"], json);
}

#[test]
fn it_makes_delete_request() {
    let rsp = subject().delete("/delete").unwrap();
    assert_strlike_eq(rsp["url"].as_str().unwrap(), http_bin("/delete"));
}

#[test]
fn it_sends_user_agent() {
    let rsp = subject().get("/user-agent").unwrap();
    assert_strlike_eq(
        rsp["user-agent"].as_str().unwrap(),
        "DiscordBot (https://github.com/princesslana/smalld_rust, 0.0.0-dev)",
    );
}

#[test]
fn it_sends_auth_header() {
    let rsp = subject().get("/headers").unwrap();
    assert_strlike_eq(
        rsp["headers"]["Authorization"].as_str().unwrap(),
        format!("Bot {}", DUMMY_TOKEN),
    );
}

#[test]
fn it_handles_204_response() {
    let rsp = subject().delete("/status/204").unwrap();
    assert_eq!(rsp, json!({}));
}

#[test]
fn it_errors_on_404_response() {
    let rsp = subject().get("/status/404");
    assert!(matches!(rsp, Err(Error::HttpError(_))));
}