apollo-errors 0.7.0

Structured error handling with automatic format conversion
Documentation
//! Tests for HTTP headers (http_header)

mod common;

use apollo_errors::Error as ErrorTrait;
use common::{
    BoolHeaderError, ErrorWithHeaders, InnerErrorWithHeaders, RateLimitStructError,
    TransparentWithHeaders,
};
use http::HeaderValue;

#[test]
fn enum_multiple_headers() {
    let error = ErrorWithHeaders::RateLimitExceeded {
        retry_after: 60,
        remaining: 0,
    };

    let headers = error.http_headers();
    assert_eq!(headers.len(), 2);
    assert_eq!(headers[0].0.as_str(), "retry-after");
    assert_eq!(headers[0].1, HeaderValue::from(60u64));
    assert_eq!(headers[1].0.as_str(), "x-ratelimit-remaining");
    assert_eq!(headers[1].1, HeaderValue::from(0u32));
}

#[test]
fn enum_option_header_some() {
    let error = ErrorWithHeaders::QuotaWarning { remaining: Some(5) };

    let headers = error.http_headers();
    assert_eq!(headers.len(), 1);
    assert_eq!(headers[0].0.as_str(), "x-ratelimit-remaining");
    assert_eq!(headers[0].1, HeaderValue::from(5u32));
}

#[test]
fn enum_option_header_none() {
    let error = ErrorWithHeaders::QuotaWarning { remaining: None };

    let headers = error.http_headers();
    assert!(headers.is_empty());
}

#[test]
fn enum_no_headers() {
    let error = ErrorWithHeaders::NoHeaders;

    let headers = error.http_headers();
    assert!(headers.is_empty());
}

#[test]
fn struct_with_headers() {
    let error = RateLimitStructError {
        retry_after: 120,
        limit: 1000,
    };

    let headers = error.http_headers();
    assert_eq!(headers.len(), 1);
    assert_eq!(headers[0].0.as_str(), "retry-after");
    assert_eq!(headers[0].1, HeaderValue::from(120u64));
}

#[test]
fn transparent_inherits_headers() {
    let error = TransparentWithHeaders::Inner(InnerErrorWithHeaders::RateLimit { retry_after: 30 });

    let headers = error.http_headers();
    assert_eq!(headers.len(), 1);
    assert_eq!(headers[0].0.as_str(), "retry-after");
    assert_eq!(headers[0].1, HeaderValue::from(30u64));
}

#[test]
fn transparent_direct_no_headers() {
    let error = TransparentWithHeaders::Direct;

    let headers = error.http_headers();
    assert!(headers.is_empty());
}

#[test]
fn bool_header_true() {
    let error = BoolHeaderError { enabled: true };

    let headers = error.http_headers();
    assert_eq!(headers.len(), 1);
    assert_eq!(headers[0].0.as_str(), "x-feature-enabled");
    assert_eq!(headers[0].1, HeaderValue::from_static("true"));
}

#[test]
fn bool_header_false() {
    let error = BoolHeaderError { enabled: false };

    let headers = error.http_headers();
    assert_eq!(headers.len(), 1);
    assert_eq!(headers[0].0.as_str(), "x-feature-enabled");
    assert_eq!(headers[0].1, HeaderValue::from_static("false"));
}