digitalocean 0.1.1

A pure Rust DigitalOcean API binding.
Documentation
extern crate digitalocean;
#[macro_use]
extern crate log;
#[macro_use]
extern crate serde_json;
extern crate url;
extern crate url_serde;

mod utils;

use serde_json::Value;

use digitalocean::api::{Domain, DomainRecord};
use digitalocean::method::{Create, Delete, Get, List, Update};
use digitalocean::request::Request;

use crate::utils::before;

#[test]
fn list_produces_correct_request() {
    before();

    let domain = "example.com";
    let correct_url = format!("https://api.digitalocean.com/v2/domains/{}/records", domain);

    let req: Request<List, Vec<DomainRecord>> = Domain::get(domain).records();
    info!("{:#?}", req);

    assert_eq!(req.url().as_str(), correct_url);
    assert_eq!(*req.body(), Value::Null);
}

#[test]
fn create_produces_correct_request() {
    before();

    let domain = "example.com";
    let correct_url = format!("https://api.digitalocean.com/v2/domains/{}/records", domain);
    let (kind, name, data, ttl) = ("A", "www", "192.168.0.1", 100);

    let req: Request<Create, DomainRecord> = Domain::get(domain)
        .records()
        .create(kind, name, data)
        .ttl(ttl);
    info!("{:#?}", req);

    assert_eq!(req.url().as_str(), correct_url);
    assert_eq!(
        *req.body(),
        json!({
            "type": kind,
            "name": name,
            "data": data,
            "ttl": ttl,
        })
    );
}

#[test]
fn get_produces_correct_request() {
    before();

    let domain = "example.com";
    let record_id = 123;
    let correct_url = format!(
        "https://api.digitalocean.com/v2/domains/{}/records/{}",
        domain, record_id
    );

    let req: Request<Get, DomainRecord> = Domain::get(domain).records().get(record_id);
    info!("{:#?}", req);

    assert_eq!(req.url().as_str(), correct_url);
    assert_eq!(*req.body(), Value::Null);
}

#[test]
fn update_produces_correct_request() {
    before();

    let domain = "example.com";
    let record_id = 123;
    let correct_url = format!(
        "https://api.digitalocean.com/v2/domains/{}/records/{}",
        domain, record_id
    );
    let (kind, name, ttl) = ("SRV", "ww2", 200);

    let req: Request<Update, DomainRecord> = Domain::get(domain)
        .records()
        .update(record_id)
        .kind(kind)
        .name(name)
        .ttl(ttl);
    info!("{:#?}", req);

    assert_eq!(req.url().as_str(), correct_url);
    assert_eq!(
        *req.body(),
        json!({
            "type": kind,
            "name": name,
            "ttl": ttl,
        })
    );
}

#[test]
fn delete_produces_correct_request() {
    before();

    let domain = "example.com";
    let record_id = 123;
    let correct_url = format!(
        "https://api.digitalocean.com/v2/domains/{}/records/{}",
        domain, record_id
    );

    let req: Request<Delete, ()> = Domain::get(domain).records().delete(record_id);
    info!("{:#?}", req);

    assert_eq!(req.url().as_str(), correct_url);
    assert_eq!(*req.body(), Value::Null);
}