leyline-http 0.1.1

HTTP client that mimics browsers on the wire
Documentation
use super::*;

#[test]
fn base64_encode_works() {
    assert_eq!(base64_encode("user:pass"), "dXNlcjpwYXNz");
    assert_eq!(base64_encode("a"), "YQ==");
    assert_eq!(base64_encode("ab"), "YWI=");
}

#[test]
fn percent_decode_roundtrips_common_cases() {
    assert_eq!(percent_decode("a%3Db"), "a=b");
    assert_eq!(percent_decode("plain"), "plain");
    assert_eq!(percent_decode("s3cr3t%21"), "s3cr3t!");
    assert_eq!(percent_decode("bad%"), "bad%");
}

#[test]
fn idempotent_matches_rfc_set() {
    for m in ["GET", "HEAD", "OPTIONS", "PUT", "DELETE", "TRACE"] {
        assert!(is_idempotent(m), "{m}");
        assert!(is_idempotent(&m.to_lowercase()), "{m}");
    }
    for m in ["POST", "PATCH"] {
        assert!(!is_idempotent(m), "{m}");
    }
}

#[test]
fn lock_recovers_after_panic() {
    let cache = std::sync::Arc::new(std::sync::Mutex::new(vec![1u8]));
    let poisoner = cache.clone();
    let _ = std::thread::spawn(move || {
        let _guard = poisoner.lock().unwrap();
        panic!("poison the mutex");
    })
    .join();
    assert!(cache.is_poisoned(), "test setup failed to poison the mutex");

    lock(&cache).push(2);
    assert_eq!(*lock(&cache), vec![1, 2]);
}