use hyper::{
header::{HeaderName, HeaderValue},
HeaderMap,
};
pub trait HeadersExistMatcher {
fn exist(&self, response_headers: &HeaderMap);
}
pub trait HeadersAbsentMatcher {
fn absent(&self, response_headers: &HeaderMap);
}
macro_rules! exist {
($t:ty) => {
impl HeadersExistMatcher for $t {
fn exist(&self, response_headers: &HeaderMap) {
let mut exist = true;
let expected_empty = self.is_empty();
let actual_empty = response_headers.is_empty();
if !expected_empty && actual_empty {
exist = false;
}
assert_eq!(
exist,
true,
"One or more headers missing in the http response. Expected : {:#?}, Found : {:#?}",
self,
response_headers,
);
for (key, expected_val) in self {
match response_headers.get(key) {
Some(val) if val.eq(expected_val) => continue,
_ => {
exist = false;
break;
}
}
}
assert_eq!(
exist,
true,
"One or more headers missing from the http response. Expected : {:#?}, Found : {:#?}",
self,
response_headers,
);
}
}
};
}
macro_rules! absent {
($t:ty) => {
impl HeadersAbsentMatcher for $t {
fn absent(&self, response_headers: &HeaderMap) {
let mut header_present = false;
for (key, absent_val) in self {
match response_headers.get(key) {
Some(val) if val.eq(absent_val) => {
header_present = true;
break;
}
_ => continue,
}
}
assert_eq!(
header_present, false,
"One or more unexpected headers found in the http response : {:#?}, Response headers : {:#?}",
self, response_headers,
);
}
}
};
}
exist!(Vec<(HeaderName, HeaderValue)>);
exist!(HeaderMap);
absent!(Vec<(HeaderName, HeaderValue)>);
absent!(HeaderMap);