Tests for ratelimiter config strings
Signed-off-by: Olivier 'reivilibre <olivier@librepush.net>
This commit is contained in:
parent
b8a48541d3
commit
8aeb19b752
@ -184,6 +184,7 @@ pub struct RatelimitsConfig {
|
|||||||
/// - "5 Hz, 20 burst"
|
/// - "5 Hz, 20 burst"
|
||||||
/// - "5 per second, 10 burst"
|
/// - "5 per second, 10 burst"
|
||||||
/// - "10 per hour, 5 burst"
|
/// - "10 per hour, 5 burst"
|
||||||
|
#[derive(Debug)]
|
||||||
pub struct RatelimiterConfig {
|
pub struct RatelimiterConfig {
|
||||||
/// The inner [`Quota`], which this struct is just a wrapper for.
|
/// The inner [`Quota`], which this struct is just a wrapper for.
|
||||||
pub quota: Quota,
|
pub quota: Quota,
|
||||||
@ -196,13 +197,19 @@ impl<'de> Deserialize<'de> for RatelimiterConfig {
|
|||||||
{
|
{
|
||||||
let stringy_format = String::deserialize(deserializer)?;
|
let stringy_format = String::deserialize(deserializer)?;
|
||||||
let Some((left, right)) = stringy_format.split_once(',') else {
|
let Some((left, right)) = stringy_format.split_once(',') else {
|
||||||
return Err(D::Error::custom("no comma. ratelimiter string should be like '5 Hz, 20 burst'"));
|
return Err(D::Error::custom(
|
||||||
|
"no comma. ratelimiter string should be like '5 Hz, 20 burst'",
|
||||||
|
));
|
||||||
};
|
};
|
||||||
let Some((left_val, left_unit)) = left.trim().split_once(' ') else {
|
let Some((left_val, left_unit)) = left.trim().split_once(' ') else {
|
||||||
return Err(D::Error::custom("no units on left. ratelimiter string should be like '5 Hz, 20 burst'"));
|
return Err(D::Error::custom(
|
||||||
|
"no units on left. ratelimiter string should be like '5 Hz, 20 burst'",
|
||||||
|
));
|
||||||
};
|
};
|
||||||
let Some((right_val, right_unit)) = right.trim().split_once(' ') else {
|
let Some((right_val, right_unit)) = right.trim().split_once(' ') else {
|
||||||
return Err(D::Error::custom("no units on right. ratelimiter string should be like '5 Hz, 20 burst'"));
|
return Err(D::Error::custom(
|
||||||
|
"no units on right. ratelimiter string should be like '5 Hz, 20 burst'",
|
||||||
|
));
|
||||||
};
|
};
|
||||||
|
|
||||||
let Ok(left_val) = left_val.parse::<NonZeroU32>() else {
|
let Ok(left_val) = left_val.parse::<NonZeroU32>() else {
|
||||||
@ -237,3 +244,62 @@ impl<'de> Deserialize<'de> for RatelimiterConfig {
|
|||||||
Ok(RatelimiterConfig { quota })
|
Ok(RatelimiterConfig { quota })
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod test {
|
||||||
|
use crate::config::RatelimiterConfig;
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_ratelimiter_deser_errors() {
|
||||||
|
fn deser(s: &str) -> Result<RatelimiterConfig, serde_json::Error> {
|
||||||
|
serde_json::from_value(serde_json::Value::String(s.to_owned()))
|
||||||
|
}
|
||||||
|
|
||||||
|
// this is fine
|
||||||
|
deser("5 Hz, 20 burst").unwrap();
|
||||||
|
|
||||||
|
// no comma
|
||||||
|
assert_eq!(
|
||||||
|
deser("5 Hz 20 burst").unwrap_err().to_string(),
|
||||||
|
"no comma. ratelimiter string should be like '5 Hz, 20 burst'"
|
||||||
|
);
|
||||||
|
|
||||||
|
// bad numbers
|
||||||
|
assert_eq!(
|
||||||
|
deser("five Hz, 20 burst").unwrap_err().to_string(),
|
||||||
|
"bad value on left. ratelimiter string should be like '5 Hz, 20 burst'"
|
||||||
|
);
|
||||||
|
assert_eq!(
|
||||||
|
deser("5 Hz, twenty burst").unwrap_err().to_string(),
|
||||||
|
"bad value on right. ratelimiter string should be like '5 Hz, 20 burst'"
|
||||||
|
);
|
||||||
|
|
||||||
|
// wrong order
|
||||||
|
assert_eq!(
|
||||||
|
deser("20 burst, 5 Hz").unwrap_err().to_string(),
|
||||||
|
"bad units on left. ratelimiter string should be like '5 Hz, 20 burst' or '5 per hour, 20 burst'."
|
||||||
|
);
|
||||||
|
|
||||||
|
// no units
|
||||||
|
assert_eq!(
|
||||||
|
deser("5 Hz, 20").unwrap_err().to_string(),
|
||||||
|
"no units on right. ratelimiter string should be like '5 Hz, 20 burst'"
|
||||||
|
);
|
||||||
|
assert_eq!(
|
||||||
|
deser("5, 20 burst").unwrap_err().to_string(),
|
||||||
|
"no units on left. ratelimiter string should be like '5 Hz, 20 burst'"
|
||||||
|
);
|
||||||
|
|
||||||
|
// bad units
|
||||||
|
assert_eq!(
|
||||||
|
deser("20 per milleniumm, 20 burst")
|
||||||
|
.unwrap_err()
|
||||||
|
.to_string(),
|
||||||
|
"bad units on left. ratelimiter string should be like '5 Hz, 20 burst' or '5 per hour, 20 burst'."
|
||||||
|
);
|
||||||
|
assert_eq!(
|
||||||
|
deser("5 Hz, 20 wombats").unwrap_err().to_string(),
|
||||||
|
"bad units on right. ratelimiter string should be like '5 Hz, 20 burst' or '5 per hour, 20 burst'."
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user