krabdex 0.1.0

A type-safe, async Rust SDK for the PokeAPI
Documentation
use crate::transport::reqwest_transport::ReqwestTransport;
use crate::{
    http::{HttpRequest, Method},
    transport::transport::Transport
};
use httpmock::prelude::*;
use url::Url;

#[tokio::test]
async fn reqwest_transport_sends_query_and_headers() {
    let server = MockServer::start();

    let m = server.mock(|when, then| {
        when.method(GET)
            .path("/hello")
            .query_param("limit", "20")
            .query_param("offset", "40")
            .header("x-test", "abc");

        then.status(200)
            .header("x-reply", "ok")
            .body("{\"ok\":true}");
    });

    let client = reqwest::Client::builder().build().unwrap();
    let transport = ReqwestTransport::new(client);

    let mut req = HttpRequest::new(
        Method::Get,
        Url::parse(&format!("{}/hello", server.base_url())).unwrap(),
    );
    req.query.set("limit", "20");
    req.query.set("offset", "40");
    req.headers.insert("x-test", "abc");

    let resp = transport.send(req).await.unwrap();

    m.assert();
    assert_eq!(resp.status, 200);
    assert_eq!(resp.headers.get("x-reply"), Some("ok"));
    assert_eq!(String::from_utf8_lossy(&resp.body), "{\"ok\":true}");
}

#[tokio::test]
async fn reqwest_transport_sends_no_body_for_get() {
    let server = MockServer::start();

    let m = server.mock(|when, then| {
        when.method(GET).path("/echo");
        then.status(200).body("ok");
    });

    let client = reqwest::Client::builder().build().unwrap();
    let transport = ReqwestTransport::new(client);

    let req = HttpRequest::new(
        Method::Get,
        Url::parse(&format!("{}/echo", server.base_url())).unwrap(),
    );

    let resp = transport.send(req).await.unwrap();

    m.assert();
    assert_eq!(resp.status, 200);
    assert_eq!(String::from_utf8_lossy(&resp.body), "ok");
}

#[tokio::test]
async fn reqwest_transport_maps_network_errors() {
    let client = reqwest::Client::builder().build().unwrap();
    let transport = ReqwestTransport::new(client);

    let listener = std::net::TcpListener::bind("127.0.0.1:0").unwrap();
    let port = listener.local_addr().unwrap().port();
    drop(listener);

    let req = HttpRequest::new(
        Method::Get,
        Url::parse(&format!("http://127.0.0.1:{port}/boom")).unwrap(),
    );

    let err = transport.send(req).await.unwrap_err();

    match err {
        crate::error::Error::Transport { .. } => {}
        other => panic!("expected Transport error, got {other:?}"),
    }
}