use std::num::NonZeroUsize;
use serde::Serialize;
use super::WireBudget;
#[derive(Serialize)]
struct Row<'a> {
value: &'a str,
}
#[test]
fn cumulative_wire_budget_stops_before_the_next_row() -> Result<(), Box<dyn std::error::Error>> {
let first = Row { value: "first" };
let second = Row { value: "second" };
let first_bytes = serde_json::to_vec(&first)?.len();
let mut budget = WireBudget::new(NonZeroUsize::new(first_bytes + 1).ok_or("zero budget")?);
assert!(budget.admit(&first)?);
assert!(!budget.admit(&second)?);
Ok(())
}
#[test]
fn first_row_over_budget_is_an_explicit_refusal() -> Result<(), Box<dyn std::error::Error>> {
let mut budget = WireBudget::new(NonZeroUsize::MIN);
let Err(error) = budget.admit(&Row { value: "too large" }) else {
return Err("oversized first row was accepted".into());
};
assert_eq!(error.code, "response_limit");
Ok(())
}