#![allow(
clippy::unwrap_used,
clippy::expect_used,
reason = "tests assert on known-good values"
)]
use cerberust::scanner::substitute::Substituter;
use cerberust::Vault;
use proptest::prelude::*;
proptest! {
#[test]
fn tokenize_then_detokenize_is_identity(
values in proptest::collection::vec("[a-zA-Z0-9@._+-]{1,40}", 1..12),
) {
let mut vault = Vault::new();
let sentinels: Vec<String> =
values.iter().map(|v| vault.intern("VAL", v, true)).collect();
let redacted = sentinels.join(" ");
for (sentinel, value) in sentinels.iter().zip(&values) {
prop_assert_eq!(vault.original_for(sentinel), Some(value.as_str()));
}
let pairs: Vec<(String, String)> = vault
.entries()
.map(|(s, o)| (s.to_owned(), o.to_owned()))
.collect();
let sub = Substituter::from_pairs(pairs.iter().map(|(s, o)| (s.as_str(), o.as_str())));
let restored = sub.substitute(&redacted);
let expected: Vec<&str> = sentinels
.iter()
.map(|s| vault.original_for(s).unwrap_or(""))
.collect();
prop_assert_eq!(restored, expected.join(" "));
}
#[test]
fn same_value_is_stable(value in "[a-zA-Z0-9]{1,30}") {
let mut vault = Vault::new();
let a = vault.intern("VAL", &value, true);
let b = vault.intern("VAL", &value, true);
prop_assert_eq!(a, b);
prop_assert_eq!(vault.len(), 1);
}
}