qubit-http 0.5.0

General-purpose HTTP infrastructure for Rust with unified client semantics, secure logging, and built-in SSE decoding
Documentation
/*******************************************************************************
 *
 *    Copyright (c) 2026 Haixing Hu.
 *
 *    SPDX-License-Identifier: Apache-2.0
 *
 *    Licensed under the Apache License, Version 2.0.
 *
 ******************************************************************************/

//! Coverage-only tests for defensive branches.

use qubit_http::{coverage_support, HttpErrorKind};

#[test]
fn test_coverage_support_exercises_backend_error_mapper_paths() {
    assert_eq!(
        coverage_support::classify_backend_error_kinds(),
        vec![
            HttpErrorKind::Decode,
            HttpErrorKind::Status,
            HttpErrorKind::InvalidUrl,
            HttpErrorKind::Transport,
        ]
    );

    assert_eq!(
        coverage_support::classify_timeout_kinds(),
        vec![
            HttpErrorKind::ConnectTimeout,
            HttpErrorKind::RequestTimeout,
            HttpErrorKind::ReadTimeout,
            HttpErrorKind::RequestTimeout,
        ]
    );
}

#[test]
fn test_coverage_support_exercises_http_retry_mapping_paths() {
    let diagnostics = coverage_support::exercise_http_retry_mapping_paths();

    assert!(diagnostics
        .iter()
        .any(|message| message.contains("attempts exhausted")),);
    assert!(diagnostics
        .iter()
        .any(|message| message.contains("retry aborted")),);
    assert!(diagnostics
        .iter()
        .any(|message| message.contains("retry executor failed")),);
    assert!(diagnostics
        .iter()
        .any(|message| message.contains("max duration exceeded")),);
    assert_eq!(
        coverage_support::exercise_retry_failure_decision_path(),
        "UseDefault"
    );
}

#[tokio::test]
async fn test_coverage_support_exercises_response_and_request_paths() {
    let (kind, message) = coverage_support::validate_non_utf8_sse_content_type();
    assert_eq!(kind, HttpErrorKind::SseProtocol);
    assert!(message.contains("non-UTF8 Content-Type"));

    let response_diagnostics = coverage_support::exercise_response_preview_paths().await;
    assert!(response_diagnostics
        .iter()
        .any(|message| message.contains("abc")),);
    assert!(response_diagnostics
        .iter()
        .any(|message| message.contains("<empty>")),);
    assert!(response_diagnostics
        .iter()
        .any(|message| message.contains("Cancelled")),);

    let request_diagnostics = coverage_support::exercise_request_cache_paths().await;
    assert!(request_diagnostics
        .iter()
        .any(|message| message.contains("coverage-cache")),);
    assert!(request_diagnostics.iter().any(|message| message == "0"),);
}

#[tokio::test]
async fn test_coverage_support_exercises_threshold_paths() {
    let diagnostics = coverage_support::exercise_threshold_paths().await;

    assert!(diagnostics
        .iter()
        .any(|message| message.contains("No IPv4 address found")),);
    assert!(diagnostics.iter().any(|message| message == "1"),);
    assert!(diagnostics.iter().any(|message| message == "coverage"),);
    assert!(diagnostics.iter().any(|message| message == "ProxyConfig"),);
    assert!(diagnostics.iter().any(|message| message == "Other"),);
    assert!(diagnostics
        .iter()
        .any(|message| message == "/relative-only"),);
    assert!(diagnostics.iter().any(|message| message == "Cancelled"),);
}