zapreq 0.1.4

A fast, friendly HTTP client for the terminal
Documentation
use crate::common;
use assert_cmd::Command;
use mockito::Matcher;
use tempfile::TempDir;

fn zapreq(config_dir: &TempDir) -> Command {
    let mut cmd = Command::cargo_bin("http").expect("binary should build");
    cmd.env("ZAPREQ_CONFIG_DIR", config_dir.path());
    cmd
}

#[test]
fn post_with_equals_sends_json_body() {
    let cfg = TempDir::new().expect("temp dir");
    let mut server = common::mock_server();
    let m = server
        .mock("POST", "/post")
        .match_header(
            "content-type",
            Matcher::Regex("application/json".to_string()),
        )
        .match_body(Matcher::JsonString(r#"{"key":"value"}"#.to_string()))
        .with_status(200)
        .create();
    zapreq(&cfg)
        .args(["POST", &format!("{}/post", server.url()), "key=value"])
        .assert()
        .success();
    m.assert();
}

#[test]
fn post_with_colon_equals_sends_raw_json_value() {
    let cfg = TempDir::new().expect("temp dir");
    let mut server = common::mock_server();
    let m = server
        .mock("POST", "/post")
        .match_body(Matcher::PartialJsonString(
            r#"{"payload":{"x":1}}"#.to_string(),
        ))
        .with_status(200)
        .create();
    zapreq(&cfg)
        .args([
            "POST",
            &format!("{}/post", server.url()),
            "payload:={\"x\":1}",
        ])
        .assert()
        .success();
    m.assert();
}

#[test]
fn post_form_sends_urlencoded() {
    let cfg = TempDir::new().expect("temp dir");
    let mut server = common::mock_server();
    let m = server
        .mock("POST", "/form")
        .match_header(
            "content-type",
            Matcher::Regex("application/x-www-form-urlencoded".to_string()),
        )
        .match_body(Matcher::Regex("a=1".to_string()))
        .with_status(200)
        .create();
    zapreq(&cfg)
        .args(["POST", &format!("{}/form", server.url()), "--form", "a=1"])
        .assert()
        .success();
    m.assert();
}

#[test]
fn content_type_json_set_automatically() {
    let cfg = TempDir::new().expect("temp dir");
    let mut server = common::mock_server();
    let m = server
        .mock("POST", "/ct")
        .match_header(
            "content-type",
            Matcher::Regex("application/json".to_string()),
        )
        .with_status(200)
        .create();
    zapreq(&cfg)
        .args(["POST", &format!("{}/ct", server.url()), "a=1"])
        .assert()
        .success();
    m.assert();
}

#[test]
fn inferred_post_when_body_items_present() {
    let cfg = TempDir::new().expect("temp dir");
    let mut server = common::mock_server();
    let m = server.mock("POST", "/infer").with_status(200).create();
    zapreq(&cfg)
        .args([&format!("{}/infer", server.url()), "a=1"])
        .assert()
        .success();
    m.assert();
}

#[test]
fn multiple_equals_fields_merged_json() {
    let cfg = TempDir::new().expect("temp dir");
    let mut server = common::mock_server();
    let m = server
        .mock("POST", "/merge")
        .match_body(Matcher::JsonString(r#"{"a":"1","b":"2"}"#.to_string()))
        .with_status(200)
        .create();
    zapreq(&cfg)
        .args(["POST", &format!("{}/merge", server.url()), "a=1", "b=2"])
        .assert()
        .success();
    m.assert();
}

#[test]
fn verbose_prints_request_and_response() {
    let cfg = TempDir::new().expect("temp dir");
    let mut server = common::mock_server();
    let _m = common::mock_text(&mut server, "POST", "/v", 200, "ok");
    let assert = zapreq(&cfg)
        .args(["POST", &format!("{}/v", server.url()), "-v", "a=1"])
        .assert()
        .success();
    let stdout = String::from_utf8_lossy(&assert.get_output().stdout);
    assert!(stdout.contains("HTTP/1.1"));
    assert!(stdout.contains("200 OK"));
}

#[test]
fn empty_post_sends_no_body() {
    let cfg = TempDir::new().expect("temp dir");
    let mut server = common::mock_server();
    let m = server.mock("POST", "/empty").with_status(200).create();
    zapreq(&cfg)
        .args(["POST", &format!("{}/empty", server.url())])
        .assert()
        .success();
    m.assert();
}