use crate::Passki;
#[test]
fn test_generate_challenge_multiple_unique() {
let mut challenges = Vec::new();
for _ in 0..10 {
challenges.push(Passki::generate_challenge());
}
for i in 0..challenges.len() {
for j in (i + 1)..challenges.len() {
assert_ne!(
challenges[i], challenges[j],
"All challenges should be unique"
);
}
}
}
#[test]
fn test_generate_challenge_consistency() {
for _ in 0..100 {
let challenge = Passki::generate_challenge();
assert_eq!(challenge.len(), 32);
}
}
#[test]
fn test_base64_encode_empty() {
let data = vec![];
let encoded = Passki::base64_encode(&data);
assert_eq!(encoded, "", "Empty data should encode to empty string");
}
#[test]
fn test_base64_encode_simple() {
let data = b"hello";
let encoded = Passki::base64_encode(data);
assert_eq!(encoded, "aGVsbG8");
}
#[test]
fn test_base64_encode_with_padding() {
let data = b"hi";
let encoded = Passki::base64_encode(data);
assert!(!encoded.contains('='), "Should not contain padding");
assert_eq!(encoded, "aGk");
}
#[test]
fn test_base64_encode_binary_data() {
let data = vec![0x00, 0x01, 0x02, 0xFF, 0xFE];
let encoded = Passki::base64_encode(&data);
for ch in encoded.chars() {
assert!(
ch.is_alphanumeric() || ch == '-' || ch == '_',
"Character {} should be valid base64url",
ch
);
}
}
#[test]
fn test_base64_encode_url_safe() {
let data = vec![0xFB, 0xFF];
let encoded = Passki::base64_encode(&data);
assert!(!encoded.contains('+'), "Should not contain +");
assert!(!encoded.contains('/'), "Should not contain /");
}
#[test]
fn test_base64_encode_32_bytes() {
let data = vec![0xAB; 32];
let encoded = Passki::base64_encode(&data);
assert_eq!(encoded.len(), 43);
}
#[test]
fn test_base64_encode_challenge() {
let challenge = Passki::generate_challenge();
let encoded = Passki::base64_encode(&challenge);
assert!(!encoded.is_empty());
assert!(!encoded.contains('='), "Should not have padding");
assert!(!encoded.contains('+'), "Should be URL-safe");
assert!(!encoded.contains('/'), "Should be URL-safe");
}
#[test]
fn test_base64_decode_empty() {
let result = Passki::base64_decode("");
assert!(result.is_ok());
assert_eq!(result.unwrap(), Vec::<u8>::new());
}
#[test]
fn test_base64_decode_simple() {
let encoded = "aGVsbG8";
let decoded = Passki::base64_decode(encoded).unwrap();
assert_eq!(decoded, b"hello");
}
#[test]
fn test_base64_decode_with_no_padding() {
let encoded = "aGk";
let decoded = Passki::base64_decode(encoded).unwrap();
assert_eq!(decoded, b"hi");
}
#[test]
fn test_base64_decode_binary_data() {
let original = vec![0x00, 0x01, 0x02, 0xFF, 0xFE];
let encoded = Passki::base64_encode(&original);
let decoded = Passki::base64_decode(&encoded).unwrap();
assert_eq!(decoded, original);
}
#[test]
fn test_base64_decode_invalid_characters() {
let invalid = "aGVsbG8@"; let result = Passki::base64_decode(invalid);
assert!(result.is_err(), "Should fail with invalid characters");
assert!(
result
.unwrap_err()
.to_string()
.contains("Base64 decode error")
);
}
#[test]
fn test_base64_decode_with_padding_fails() {
let with_padding = "aGVsbG8=";
let result = Passki::base64_decode(with_padding);
let _ = result;
}
#[test]
fn test_base64_decode_malformed() {
let malformed = "!!!";
let result = Passki::base64_decode(malformed);
assert!(result.is_err(), "Should fail with malformed base64");
}
#[test]
fn test_base64_decode_url_safe_characters() {
let data = vec![0xFB, 0xFF];
let encoded = Passki::base64_encode(&data);
let decoded = Passki::base64_decode(&encoded).unwrap();
assert_eq!(decoded, data);
}
#[test]
fn test_base64_roundtrip_various_lengths() {
for len in 0..100 {
let original: Vec<u8> = (0..len).map(|i| (i % 256) as u8).collect();
let encoded = Passki::base64_encode(&original);
let decoded = Passki::base64_decode(&encoded).unwrap();
assert_eq!(decoded, original, "Failed for length {}", len);
}
}
#[test]
fn test_base64_roundtrip_all_byte_values() {
let original: Vec<u8> = (0..=255).collect();
let encoded = Passki::base64_encode(&original);
let decoded = Passki::base64_decode(&encoded).unwrap();
assert_eq!(decoded, original);
}
#[test]
fn test_base64_encode_decode_consistency() {
let mut data = b"test data".to_vec();
for _ in 0..5 {
let encoded = Passki::base64_encode(&data);
data = Passki::base64_decode(&encoded).unwrap();
}
assert_eq!(data, b"test data");
}
#[test]
fn test_base64_decode_case_sensitive() {
let encoded1 = "YWJj"; let encoded2 = "YWJJ";
let decoded1 = Passki::base64_decode(encoded1).unwrap();
let decoded2 = Passki::base64_decode(encoded2);
assert!(decoded2.is_err() || decoded1 != decoded2.unwrap());
}
#[test]
fn test_generate_and_encode_challenge() {
let challenge = Passki::generate_challenge();
let encoded = Passki::base64_encode(&challenge);
assert!(!encoded.is_empty());
assert_eq!(encoded.len(), 43);
let decoded = Passki::base64_decode(&encoded).unwrap();
assert_eq!(decoded, challenge);
}