asserhttp 0.2.0

Fluent http response assertions
Documentation

Allows fluent assertions for various http client responses. Supports reqwest, hyper, awc (Actix Web Client), surf and isahc.

It works for blocking or async client methods and for responses wrapped in Result.

API

Here's the list of all the provided asserters.

# use isahc;
# use serde::Deserialize;
# use serde_json::{json, Value};
use asserhttp::*;

#[test]
fn my_test() {
#    isahc::get("http://localhost/api/any")
// status
.expect_status_eq(200)
.expect_status_in_range(200, 400)
.expect_status_success()
.expect_status_redirection()
.expect_status_client_error()
.expect_status_server_error()
.expect_status_ok()
.expect_status_created()
.expect_status_accepted()
.expect_status_no_content()
.expect_status_partial_content()
.expect_status_bad_request()
.expect_status_unauthorized()
.expect_status_forbidden()
.expect_status_not_found()
.expect_status_conflict()
.expect_status_gone()
.expect_status_internal_server_error()
// header
.expect_header("content-type", "application/pdf")
.expect_headers("cache-control", ["no-cache", "no-store"])
.expect_header_present("x-my-header")
.expect_header_absent("x-my-header")
.expect_content_type_json()
.expect_content_type_text()
// body
.expect_body_json(|b: Value| assert_eq!(b, json!({"a": "b"})))
.expect_body_json_eq(json!({"name": "jdoe"}))
.expect_body_text(|b| assert_eq!(b, "abcd"))
.expect_body_text_eq("abcd")
.expect_body_text_matches("[a-z]+")
.expect_body_bytes(|b| assert_eq!(b, b"abcd"))
.expect_body_bytes_eq(b"abcd")
.expect_body_present()
.expect_body_absent();
}

Example

reqwest

use reqwest;
use asserhttp::*;

#[tokio::test]
async fn sample_test() {
reqwest::get("http://localhost/api/any").await.unwrap().expect_status_ok();
// no need to call `.unwrap()` directly
reqwest::get("http://localhost/api/any").await.expect_status_eq(200);
reqwest::get("http://localhost/api/any").await.expect_status_ok();
reqwest::get("http://localhost/api/any").await.expect_status_bad_request();
reqwest::get("http://localhost/api/any").await.expect_status_internal_server_error();
// chain expectations
reqwest::get("http://localhost/api/any").await
.expect_status_ok()
.expect_content_type_json()
.expect_body_json_eq(json!({"name": "jdoe"}));
// and many more !
}

hyper

use hyper::Client;
use asserhttp::*;

#[tokio::test]
async fn sample_test() {
Client::new().get("http://localhost/api/any").await.unwrap().expect_status_ok();
// no need to call `.unwrap()` directly
Client::new().get("http://localhost/api/any").await.expect_status_eq(200);
Client::new().get("http://localhost/api/any").await.expect_status_ok();
Client::new().get("http://localhost/api/any").await.expect_status_bad_request();
Client::new().get("http://localhost/api/any").await.expect_status_internal_server_error();
// chain expectations
Client::new().get("http://localhost/api/any").await
.expect_status_ok()
.expect_content_type_json()
.expect_body_json_eq(json!({"name": "jdoe"}));
// and many more !
}

awc (Actix Web Client)

use actix_rt::System;
use awc::Client;
use asserhttp::*;

#[test]
fn sample_test() {
System::new("test").block_on(async move {
Client::default().get("http://localhost/api/any").await.unwrap().expect_status_ok();
// no need to call `.unwrap()` directly
Client::default().get("http://localhost/api/any").await.expect_status_eq(200);
Client::default().get("http://localhost/api/any").await.expect_status_ok();
Client::default().get("http://localhost/api/any").await.expect_status_bad_request();
Client::default().get("http://localhost/api/any").await.expect_status_internal_server_error();
// chain expectations
Client::default().get("http://localhost/api/any").await
.expect_status_ok()
.expect_content_type_json()
.expect_body_json_eq(json!({"name": "jdoe"}));
// and many more !
});
}

surf

use surf;
use asserhttp::*;

#[async_std::test]
async fn sample_test() {
surf::get("http://localhost/api/any").await.unwrap().expect_status_ok();
// no need to call `.unwrap()` directly
surf::get("http://localhost/api/any").await.expect_status_eq(200);
surf::get("http://localhost/api/any").await.expect_status_ok();
surf::get("http://localhost/api/any").await.expect_status_bad_request();
surf::get("http://localhost/api/any").await.expect_status_internal_server_error();
// chain expectations
surf::get("http://localhost/api/any").await
.expect_status_ok()
.expect_content_type_json()
.expect_body_json_eq(json!({"name": "jdoe"}));
// and many more !
}

isahc

use isahc;
use asserhttp::*;

#[async_std::test]
async fn sample_test() {
isahc::get_async("http://localhost/api/any").await.unwrap().expect_status_ok();
// no need to call `.unwrap()` directly
isahc::get_async("http://localhost/api/any").await.expect_status_eq(200);
isahc::get_async("http://localhost/api/any").await.expect_status_ok();
isahc::get_async("http://localhost/api/any").await.expect_status_bad_request();
isahc::get_async("http://localhost/api/any").await.expect_status_internal_server_error();
// chain expectations
isahc::get_async("http://localhost/api/any").await
.expect_status_ok()
.expect_content_type_json()
.expect_body_json_eq(json!({"name": "jdoe"}));
// and many more !
}