api-bones-test 4.5.1

Test helpers for api-bones: builders and response-assertion utilities
Documentation
#![cfg(feature = "reqwest")]

use api_bones::error::ErrorCode;
use api_bones::response::ApiResponse;
use api_bones_test::reqwest::{assert_envelope_reqwest, assert_problem_json_reqwest};
use wiremock::matchers::{method, path};
use wiremock::{Mock, MockServer, ResponseTemplate};

async fn start_mock_server() -> MockServer {
    MockServer::start().await
}

#[tokio::test]
async fn assert_envelope_reqwest_parses_ok_response() {
    let server = start_mock_server().await;
    let body: ApiResponse<u32> = ApiResponse::builder(99u32).build();

    Mock::given(method("GET"))
        .and(path("/items/1"))
        .respond_with(
            ResponseTemplate::new(200)
                .set_body_json(&body)
                .insert_header("content-type", "application/json"),
        )
        .mount(&server)
        .await;

    let client = reqwest::Client::new();
    let resp = client
        .get(format!("{}/items/1", server.uri()))
        .send()
        .await
        .unwrap();

    let value: u32 = assert_envelope_reqwest(resp).await;
    assert_eq!(value, 99);
}

#[tokio::test]
async fn assert_problem_json_reqwest_parses_problem() {
    let server = start_mock_server().await;
    let err = api_bones::error::ApiError::not_found("not here");

    let body = serde_json::to_vec(&err).unwrap();
    Mock::given(method("GET"))
        .and(path("/missing"))
        .respond_with(ResponseTemplate::new(404).set_body_raw(body, "application/problem+json"))
        .mount(&server)
        .await;

    let client = reqwest::Client::new();
    let resp = client
        .get(format!("{}/missing", server.uri()))
        .send()
        .await
        .unwrap();

    let problem = assert_problem_json_reqwest(resp, ErrorCode::ResourceNotFound).await;
    assert_eq!(problem.code, ErrorCode::ResourceNotFound);
}