From b806d844519a2213e6029ba7ff165da830f3d4a2 Mon Sep 17 00:00:00 2001 From: jutty Date: Wed, 11 Mar 2026 03:57:26 -0300 Subject: [PATCH] Add template and asset fallback tests --- .justfile | 5 +- src/router/handlers/template.rs | 85 +++++++++++++++++++++++++++++++++ 2 files changed, 88 insertions(+), 2 deletions(-) diff --git a/.justfile b/.justfile index f03aae8..4dc2004 100644 --- a/.justfile +++ b/.justfile @@ -352,20 +352,21 @@ alias bm := build-musl [group: 'build'] release-build target=default_target: cargo build --target {{ target }} --locked --release + du -h target/{{ target }}/release/en alias rb := release-build # glibc release build [group: 'build'] release-build-gnu: - cargo build --target {{ glibc_target }} --locked --release + {{ just_cmd }} release-build {{ glibc_target }} alias rbg := release-build-gnu # musl release build [group: 'build'] release-build-musl: - cargo build --target {{ musl_target }} --locked --release + {{ just_cmd }} release-build {{ musl_target }} alias rbm := release-build-musl diff --git a/src/router/handlers/template.rs b/src/router/handlers/template.rs index 1619e14..01bb7ea 100644 --- a/src/router/handlers/template.rs +++ b/src/router/handlers/template.rs @@ -432,4 +432,89 @@ mod tests { assert_eq!(&contents, map_contents); } } + + #[test] + fn rendering_error_html_contains_inner_error() { + let outer_payload = "Gl0c7CyArjlG1Zgvj3D5BFmZT6zRz5Ky"; + let inner_payload = "t53pvXCf0JqUzwiM5BZbYxAQadYSJ9XW"; + let inner_error = tera::Error::msg(inner_payload); + let error = RenderingError::new(outer_payload, 501, &inner_error); + assert!(error.template.html.contains(inner_payload)); + assert!(error.template.html.contains(outer_payload)); + } + + #[test] + fn rendering_error_display() { + let payload = "4LKNOSqfW0Ys3LALDAond8IIp5RgN7vK"; + let error = RenderingError::new(payload, 501, &tera::Error::msg("")); + let display_string = format!("{error}"); + assert!(display_string.contains(payload)); + } + + #[test] + fn empty_template_read_is_an_error() { + let result = read_template("", PathBuf::from("")); + assert!(result.is_err()); + } + + #[test] + fn template_read_without_permissions_is_an_error() { + let result = read_template("", PathBuf::from("/etc/shadow")); + assert!(result.is_err()); + } + + #[test] + fn template_read_without_a_default_is_an_error() { + let result = read_template( + "xkQwFZpqf5iz", + PathBuf::from("templates/Boy5CZQUk2oX"), + ); + assert!(result.is_err()); + } + + #[test] + fn template_read_with_a_default_is_ok() { + let result = + read_template("base.html", PathBuf::from("templates/St1iFgeOrhCK")); + assert!(result.is_ok()); + } + + #[test] + fn template_read_with_a_file_is_ok() { + let result = + read_template("GpzjjAPhCTIr", PathBuf::from("templates/base.html")); + assert!(result.is_ok()); + } +} + +#[cfg(test)] +mod serial_tests { + use super::*; + + #[cfg_attr(not(unix), ignore)] + #[test] + fn invalid_utf8_template_filename() { + use std::{ffi::OsStr, os::unix::ffi::OsStrExt as _, path::PathBuf}; + + let original_working_directory = std::env::current_dir().unwrap(); + let base_dir = PathBuf::from("tests/mocks/encoding/temp"); + let templates_dir = base_dir.clone().join("templates"); + assert!(std::fs::create_dir_all(&base_dir).is_ok()); + assert!( + std::env::set_current_dir(&base_dir) + .is_ok() + ); + assert!(std::fs::create_dir_all(&templates_dir).is_ok()); + + + let invalid_name = OsStr::from_bytes(&[0xff, 0xfe, 0x00]); + let file_path = templates_dir.join(invalid_name); + assert!(std::fs::write(&file_path, b"eNJq4FPUqSKoozdg").is_ok()); + + let result = load_templates(); + assert!(result.is_err()); + + assert!(std::fs::remove_dir_all(&base_dir).is_ok()); + assert!(std::env::set_current_dir(original_working_directory).is_ok()); + } }