vila 3.0.0

Toolkit for creating strongly-typed REST API clients
Documentation
use crate::utils::{FormHello, JsonHello, NameGreeting, QueryHello};
use serde_json::json;
use vila::Client;
use wiremock::matchers::{body_json, body_string, header, method, path, query_param};
use wiremock::{Mock, MockServer, Request as MockRequest, ResponseTemplate};

#[tokio::test]
async fn query() {
    let _ = env_logger::try_init();
    let server = MockServer::start().await;
    let uri = server.uri();
    let client = Client::new(&uri);

    Mock::given(method("GET"))
        .and(path("/hello"))
        .and(query_param("name", "world"))
        .respond_with(|req: &MockRequest| {
            let name = req
                .url
                .query_pairs()
                .find(|(k, _)| k == "name")
                .map(|(_, v)| v)
                .unwrap();
            let body = NameGreeting {
                message: format!("Hello, {}!", name),
            };
            ResponseTemplate::new(200).set_body_json(body)
        })
        .mount(&server)
        .await;

    let response = client
        .send(&QueryHello {
            name: "world".into(),
        })
        .await
        .unwrap();
    assert_eq!(
        response,
        NameGreeting {
            message: "Hello, world!".into(),
        }
    );
}

#[tokio::test]
async fn json() {
    let _ = env_logger::try_init();
    let server = MockServer::start().await;
    let uri = server.uri();
    let client = Client::new(&uri);

    Mock::given(method("GET"))
        .and(path("/hello"))
        .and(body_json(json!({"name": "world"})))
        .respond_with(|_: &MockRequest| {
            let body = NameGreeting {
                message: "Hello, world!".into(),
            };
            ResponseTemplate::new(200).set_body_json(body)
        })
        .mount(&server)
        .await;

    let response = client
        .send(&JsonHello {
            name: "world".into(),
        })
        .await
        .unwrap();
    assert_eq!(
        response,
        NameGreeting {
            message: "Hello, world!".into(),
        }
    );
}

#[tokio::test]
async fn form() {
    let _ = env_logger::try_init();
    let server = MockServer::start().await;
    let uri = server.uri();
    let client = Client::new(&uri);

    Mock::given(method("GET"))
        .and(path("/hello"))
        .and(header("content-type", "application/x-www-form-urlencoded"))
        .and(body_string("name=world"))
        .respond_with(|_: &MockRequest| {
            let body = NameGreeting {
                message: "Hello, world!".into(),
            };
            ResponseTemplate::new(200).set_body_json(body)
        })
        .mount(&server)
        .await;

    let response = client
        .send(&FormHello {
            name: "world".into(),
        })
        .await
        .unwrap();
    assert_eq!(
        response,
        NameGreeting {
            message: "Hello, world!".into(),
        }
    );
}