Skip to content

Commit 87c2752

Browse files
committed
test(bolt12): Add tests for CurrencyCode validation
Tests cover UTF-8 validation, ASCII uppercase validation, case sensitivity, length checks, and API consistency between new() and from_str().
1 parent 46cbed5 commit 87c2752

File tree

1 file changed

+79
-0
lines changed

1 file changed

+79
-0
lines changed

lightning/src/offers/offer.rs

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2186,6 +2186,85 @@ mod tests {
21862186
}
21872187
}
21882188

2189+
2190+
#[cfg(test)]
2191+
mod currency_code_tests {
2192+
use super::{CurrencyCode, CurrencyCodeError};
2193+
2194+
#[test]
2195+
fn creates_valid_currency_codes() {
2196+
let usd = CurrencyCode::new(*b"USD").unwrap();
2197+
assert_eq!(usd.as_str(), "USD");
2198+
assert_eq!(usd.as_bytes(), b"USD");
2199+
2200+
let eur = CurrencyCode::new(*b"EUR").unwrap();
2201+
assert_eq!(eur.as_str(), "EUR");
2202+
assert_eq!(eur.as_bytes(), b"EUR");
2203+
}
2204+
2205+
#[test]
2206+
fn rejects_invalid_utf8() {
2207+
let invalid_utf8 = [0xFF, 0xFE, 0xFD];
2208+
assert_eq!(CurrencyCode::new(invalid_utf8), Err(CurrencyCodeError::InvalidUtf8));
2209+
}
2210+
2211+
#[test]
2212+
fn rejects_lowercase_letters() {
2213+
match CurrencyCode::new(*b"usd") {
2214+
Err(CurrencyCodeError::NotAsciiUppercase { code }) => {
2215+
assert_eq!(code, "usd");
2216+
},
2217+
_ => panic!("Expected NotAsciiUppercase error"),
2218+
}
2219+
2220+
assert!(matches!(
2221+
CurrencyCode::new(*b"Eur"),
2222+
Err(CurrencyCodeError::NotAsciiUppercase { .. })
2223+
));
2224+
}
2225+
2226+
#[test]
2227+
fn rejects_non_letters() {
2228+
assert!(matches!(
2229+
CurrencyCode::new(*b"US1"),
2230+
Err(CurrencyCodeError::NotAsciiUppercase { .. })
2231+
));
2232+
2233+
assert!(matches!(
2234+
CurrencyCode::new(*b"U$D"),
2235+
Err(CurrencyCodeError::NotAsciiUppercase { .. })
2236+
));
2237+
}
2238+
2239+
#[test]
2240+
fn from_str_validates_length() {
2241+
assert!(matches!(
2242+
"US".parse::<CurrencyCode>(),
2243+
Err(CurrencyCodeError::InvalidLength { actual: 2 })
2244+
));
2245+
2246+
assert!(matches!(
2247+
"USDA".parse::<CurrencyCode>(),
2248+
Err(CurrencyCodeError::InvalidLength { actual: 4 })
2249+
));
2250+
2251+
assert!("USD".parse::<CurrencyCode>().is_ok());
2252+
}
2253+
2254+
#[test]
2255+
fn works_with_real_currency_codes() {
2256+
let codes = ["USD", "EUR", "GBP", "JPY", "CNY"];
2257+
2258+
for code_str in &codes {
2259+
let code1 = CurrencyCode::new(code_str.as_bytes().try_into().unwrap()).unwrap();
2260+
let code2 = code_str.parse::<CurrencyCode>().unwrap();
2261+
2262+
assert_eq!(code1, code2);
2263+
assert_eq!(code1.as_str(), *code_str);
2264+
}
2265+
}
2266+
}
2267+
21892268
#[cfg(test)]
21902269
mod bolt12_tests {
21912270
use super::{Bolt12ParseError, Bolt12SemanticError, Offer};

0 commit comments

Comments
 (0)