Skip to content

Commit

Permalink
test: cache-control test cases
Browse files Browse the repository at this point in the history
  • Loading branch information
joseluisq committed Mar 13, 2022
1 parent d57ee2f commit 7b6fc0b
Showing 1 changed file with 68 additions and 3 deletions.
71 changes: 68 additions & 3 deletions src/control_headers.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,12 @@
use headers::{CacheControl, HeaderMapExt};
use hyper::{Body, Response};

// Cache-Control `max-age` variants
const MAX_AGE_ONE_HOUR: u64 = 60 * 60;
const MAX_AGE_ONE_DAY: u64 = 60 * 60 * 24_u64;
const MAX_AGE_ONE_YEAR: u64 = 60 * 60 * 24 * 365;

// `Cache-Control` list of extensions
const CACHE_EXT_ONE_HOUR: [&str; 4] = ["atom", "json", "rss", "xml"];
const CACHE_EXT_ONE_YEAR: [&str; 32] = [
"avif", "bmp", "bz2", "css", "doc", "gif", "gz", "htc", "ico", "jpeg", "jpg", "js", "jxl",
Expand All @@ -15,18 +21,18 @@ const CACHE_EXT_ONE_YEAR: [&str; 32] = [
/// It appends a `Cache-Control` header to a response if that one is part of a set of file types.
pub fn append_headers(uri: &str, resp: &mut Response<Body>) {
// Default max-age value in seconds (one day)
let mut max_age = 60 * 60 * 24_u64;
let mut max_age = MAX_AGE_ONE_DAY;

if CACHE_EXT_ONE_HOUR
.iter()
.any(|x| uri.ends_with(&[".", *x].concat()))
{
max_age = 60 * 60;
max_age = MAX_AGE_ONE_HOUR;
} else if CACHE_EXT_ONE_YEAR
.iter()
.any(|x| uri.ends_with(&[".", *x].concat()))
{
max_age = 60 * 60 * 24 * 365;
max_age = MAX_AGE_ONE_YEAR;
}

let cache_control = CacheControl::new()
Expand All @@ -39,3 +45,62 @@ pub fn append_headers(uri: &str, resp: &mut Response<Body>) {
fn duration_from_secs(secs: u64) -> std::time::Duration {
std::time::Duration::from_secs(std::cmp::min(secs, u32::MAX as u64))
}

#[cfg(test)]
mod tests {
use hyper::{Body, Response, StatusCode};

use super::{
append_headers, CACHE_EXT_ONE_HOUR, CACHE_EXT_ONE_YEAR, MAX_AGE_ONE_DAY, MAX_AGE_ONE_HOUR,
MAX_AGE_ONE_YEAR,
};

#[tokio::test]
async fn headers_one_hour() {
let mut resp = Response::new(Body::empty());
*resp.status_mut() = StatusCode::OK;

for ext in CACHE_EXT_ONE_HOUR.iter() {
append_headers(&["/some.", ext].concat(), &mut resp);

let cache_control = resp.headers().get(http::header::CACHE_CONTROL).unwrap();
assert_eq!(resp.status(), StatusCode::OK);
assert_eq!(
cache_control.to_str().unwrap(),
format!("public, max-age={}", MAX_AGE_ONE_HOUR)
);
}
}

#[tokio::test]
async fn headers_one_day_default() {
let mut resp = Response::new(Body::empty());
*resp.status_mut() = StatusCode::OK;

append_headers("/", &mut resp);

let cache_control = resp.headers().get(http::header::CACHE_CONTROL).unwrap();
assert_eq!(resp.status(), StatusCode::OK);
assert_eq!(
cache_control.to_str().unwrap(),
format!("public, max-age={}", MAX_AGE_ONE_DAY)
);
}

#[tokio::test]
async fn headers_one_year() {
let mut resp = Response::new(Body::empty());
*resp.status_mut() = StatusCode::OK;

for ext in CACHE_EXT_ONE_YEAR.iter() {
append_headers(&["/some.", ext].concat(), &mut resp);

let cache_control = resp.headers().get(http::header::CACHE_CONTROL).unwrap();
assert_eq!(resp.status(), StatusCode::OK);
assert_eq!(
cache_control.to_str().unwrap(),
format!("public, max-age={}", MAX_AGE_ONE_YEAR)
);
}
}
}

0 comments on commit 7b6fc0b

Please sign in to comment.