openauth-core 0.0.2

Core types and primitives for OpenAuth.
Documentation
use openauth_core::utils::ip::{
    create_rate_limit_key, is_valid_ip, normalize_ip, normalize_ip_with_options, Ipv6Subnet,
    NormalizeIpOptions,
};

#[test]
fn is_valid_ip_accepts_ipv4_and_ipv6() {
    assert!(is_valid_ip("192.0.2.1"));
    assert!(is_valid_ip("2001:db8::1"));
}

#[test]
fn is_valid_ip_rejects_invalid_values() {
    assert!(!is_valid_ip("example.com"));
    assert!(!is_valid_ip("999.999.999.999"));
}

#[test]
fn normalize_ip_leaves_ipv4_unchanged() {
    assert_eq!(normalize_ip("192.0.2.1"), "192.0.2.1");
}

#[test]
fn normalize_ip_converts_ipv4_mapped_ipv6_to_ipv4() {
    assert_eq!(normalize_ip("::ffff:192.0.2.1"), "192.0.2.1");
    assert_eq!(normalize_ip("::ffff:c000:0201"), "192.0.2.1");
}

#[test]
fn normalize_ip_uses_ipv6_64_subnet_by_default() {
    assert_eq!(
        normalize_ip("2001:DB8::1"),
        "2001:0db8:0000:0000:0000:0000:0000:0000"
    );
}

#[test]
fn normalize_ip_can_keep_full_ipv6_address() {
    assert_eq!(
        normalize_ip_with_options(
            "2001:DB8::1",
            NormalizeIpOptions {
                ipv6_subnet: Ipv6Subnet::Full,
            },
        ),
        "2001:0db8:0000:0000:0000:0000:0000:0001"
    );
}

#[test]
fn normalize_ip_can_apply_ipv6_48_subnet() {
    assert_eq!(
        normalize_ip_with_options(
            "2001:db8:abcd:1234::1",
            NormalizeIpOptions {
                ipv6_subnet: Ipv6Subnet::Prefix48,
            },
        ),
        "2001:0db8:abcd:0000:0000:0000:0000:0000"
    );
}

#[test]
fn normalize_ip_lowercases_invalid_values() {
    assert_eq!(normalize_ip("Not-An-IP"), "not-an-ip");
}

#[test]
fn create_rate_limit_key_uses_collision_safe_separator() {
    assert_eq!(
        create_rate_limit_key("192.0.2.1", "/sign-in"),
        "192.0.2.1|/sign-in"
    );
}