zenwave 0.7.0

Ergonomic HTTP client framework.
Documentation
//! Tests for backend implementations

#[cfg(all(
    not(target_arch = "wasm32"),
    any(feature = "hyper-backend", feature = "curl-backend")
))]
use http_kit::{Endpoint, Method};
#[cfg(default_hyper)]
use zenwave::backend::HyperBackend;

#[cfg(all(
    not(target_arch = "wasm32"),
    any(feature = "hyper-backend", feature = "curl-backend")
))]
mod common;
#[cfg(all(
    not(target_arch = "wasm32"),
    any(feature = "hyper-backend", feature = "curl-backend")
))]
use common::httpbin_uri;

#[cfg_attr(target_arch = "wasm32", wasm_bindgen_test::wasm_bindgen_test)]
#[cfg_attr(not(target_arch = "wasm32"), test)]
#[cfg(default_hyper)]
fn test_hyper_backend_creation() {
    let backend = HyperBackend::default();
    // Just ensure it can be created
    assert_ne!(format!("{backend:?}"), "");
}

#[cfg_attr(target_arch = "wasm32", wasm_bindgen_test::wasm_bindgen_test)]
#[cfg_attr(not(target_arch = "wasm32"), test)]
#[cfg(default_hyper)]
fn test_hyper_backend_default() {
    let backend = HyperBackend::default();
    assert_ne!(format!("{backend:?}"), "");
}

#[test_executors::async_test]
#[cfg(default_hyper)]
async fn test_hyper_backend_get_request() {
    let mut backend = HyperBackend::default();
    let mut request = http::Request::builder()
        .method(Method::GET)
        .uri(httpbin_uri("/get"))
        .body(http_kit::Body::empty())
        .unwrap();
    let response = backend.respond(&mut request).await;
    assert!(response.is_ok());
    let response = response.unwrap();
    assert!(response.status().is_success());
}

#[test_executors::async_test]
#[cfg(default_hyper)]
async fn test_hyper_backend_post_request() {
    let mut backend = HyperBackend::default();
    let mut request = http::Request::builder()
        .method(Method::POST)
        .uri(httpbin_uri("/post"))
        .body(http_kit::Body::empty())
        .unwrap();
    let response = backend.respond(&mut request).await;
    assert!(response.is_ok());
    let response = response.unwrap();
    assert!(response.status().is_success());
}

#[test_executors::async_test]
#[cfg(default_hyper)]
async fn test_hyper_backend_https_request() {
    let mut backend = HyperBackend::default();
    let mut request = http::Request::builder()
        .method(Method::GET)
        .uri(httpbin_uri("/get"))
        .body(http_kit::Body::empty())
        .unwrap();
    let response = backend.respond(&mut request).await;
    assert!(response.is_ok());
    let response = response.unwrap();
    assert!(response.status().is_success());
}

#[test_executors::async_test]
#[cfg(default_hyper)]
async fn test_hyper_backend_invalid_uri() {
    let mut backend = HyperBackend::default();
    let mut request = http::Request::builder()
        .method(Method::GET)
        .uri("invalid-uri")
        .body(http_kit::Body::empty())
        .unwrap();
    let response = backend.respond(&mut request).await;
    assert!(response.is_err());
}

#[test_executors::async_test]
#[cfg(default_hyper)]
async fn test_hyper_backend_http_error_returns_err() {
    let mut backend = HyperBackend::default();
    let mut request = http::Request::builder()
        .method(Method::GET)
        .uri(httpbin_uri("/status/404"))
        .body(http_kit::Body::empty())
        .unwrap();

    let response = backend.respond(&mut request).await;
    assert!(
        response.is_err(),
        "expected non-success status to surface as Err"
    );
}

#[test_executors::async_test]
#[cfg(all(not(target_arch = "wasm32"), feature = "curl-backend"))]
async fn test_curl_backend_http_error_returns_err() {
    use zenwave::backend::CurlBackend;

    let mut backend = CurlBackend::default();
    let mut request = http::Request::builder()
        .method(Method::GET)
        .uri(httpbin_uri("/status/500"))
        .body(http_kit::Body::empty())
        .unwrap();

    let response = backend.respond(&mut request).await;
    assert!(
        response.is_err(),
        "expected non-success status to surface as Err"
    );
}

#[cfg_attr(target_arch = "wasm32", wasm_bindgen_test::wasm_bindgen_test)]
#[cfg_attr(not(target_arch = "wasm32"), test)]
#[cfg(default_hyper)]
fn test_hyper_backend_request_cancellation() {}

// Note: WebBackend tests are more challenging to write without a browser environment
// These would typically require wasm-pack test or a specialized test runner
#[cfg(target_arch = "wasm32")]
mod web_backend_tests {
    use zenwave::backend::WebBackend;

    #[test_executors::async_test]
    async fn test_web_backend_creation() {
        let backend = WebBackend::new(zenwave::Transport::system());
        assert!(format!("{backend:?}").starts_with("WebBackend"));
    }

    #[test_executors::async_test]
    async fn test_web_backend_default() {
        let backend = WebBackend::default();
        assert!(format!("{backend:?}").starts_with("WebBackend"));
    }
}