zapreq 0.1.4

A fast, friendly HTTP client for the terminal
Documentation
use crate::common;
use assert_cmd::Command;
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 json_pretty_printed_with_indent() {
    let cfg = TempDir::new().expect("temp dir");
    let mut server = common::mock_server();
    let _m = common::mock_json(
        &mut server,
        "GET",
        "/json",
        200,
        serde_json::json!({"a":{"b":1}}),
    );
    let assert = zapreq(&cfg)
        .args(["GET", &format!("{}/json", server.url())])
        .assert()
        .success();
    let stdout = String::from_utf8_lossy(&assert.get_output().stdout);
    assert!(stdout.contains("\n    \"b\""));
}

#[test]
fn xml_response_indented() {
    let cfg = TempDir::new().expect("temp dir");
    let mut server = common::mock_server();
    let _m = server
        .mock("GET", "/xml")
        .with_status(200)
        .with_header("content-type", "application/xml")
        .with_body("<root><item>1</item></root>")
        .create();
    let assert = zapreq(&cfg)
        .args(["GET", &format!("{}/xml", server.url())])
        .assert()
        .success();
    let stdout = String::from_utf8_lossy(&assert.get_output().stdout);
    assert!(stdout.contains("\n  <item>"));
}

#[test]
fn binary_response_shows_warning() {
    let cfg = TempDir::new().expect("temp dir");
    let mut server = common::mock_server();
    let _m = server
        .mock("GET", "/bin")
        .with_status(200)
        .with_header("content-type", "application/octet-stream")
        .with_body("\0\0abc")
        .create();
    let assert = zapreq(&cfg)
        .args(["GET", &format!("{}/bin", server.url())])
        .assert()
        .success();
    let stdout = String::from_utf8_lossy(&assert.get_output().stdout);
    assert!(stdout.contains("[binary body"));
}

#[test]
fn meta_flag_shows_metadata_box() {
    let cfg = TempDir::new().expect("temp dir");
    let mut server = common::mock_server();
    let _m = common::mock_text(&mut server, "GET", "/meta", 200, "ok");
    let assert = zapreq(&cfg)
        .args(["GET", &format!("{}/meta", server.url()), "--meta"])
        .assert()
        .success();
    let stdout = String::from_utf8_lossy(&assert.get_output().stdout);
    assert!(stdout.contains("Method:"));
    assert!(stdout.contains("Status:"));
}

#[test]
fn style_dracula_changes_theme_no_crash() {
    let cfg = TempDir::new().expect("temp dir");
    let mut server = common::mock_server();
    let _m = common::mock_json(
        &mut server,
        "GET",
        "/theme",
        200,
        serde_json::json!({"ok":true}),
    );
    zapreq(&cfg)
        .args([
            "GET",
            &format!("{}/theme", server.url()),
            "--style",
            "dracula",
        ])
        .assert()
        .success();
}