extern crate tera;
#[macro_use]
extern crate serde_derive;
use tera::{Context, Result, Tera};
mod common;
use common::{Product, Review};
fn render_tpl(tpl_name: &str) -> Result<String> {
let tera = Tera::new("tests/render-failures/**/*").unwrap();
let mut context = Context::new();
context.insert("product", &Product::new());
context.insert("username", &"bob");
context.insert("friend_reviewed", &true);
context.insert("number_reviews", &2);
context.insert("show_more", &true);
context.insert("reviews", &vec![Review::new(), Review::new()]);
tera.render(tpl_name, &context)
}
#[test]
fn test_error_render_field_unknown() {
let result = render_tpl("field_unknown.html");
assert_eq!(result.is_err(), true);
assert_eq!(
result.unwrap_err().iter().nth(1).unwrap().description(),
"Variable `hey` not found in context while rendering \'field_unknown.html\'"
);
}
#[test]
fn test_error_render_field_unknown_in_forloop() {
let result = render_tpl("field_unknown_forloop.html");
assert_eq!(result.is_err(), true);
let err = result.unwrap_err();
assert_eq!(
err.iter().nth(1).unwrap().description(),
"Variable `r.random` not found in context while rendering \'field_unknown_forloop.html\'"
);
}
#[test]
fn test_error_render_non_math() {
let result = render_tpl("non_math_operation.html");
assert_eq!(result.is_err(), true);
assert_eq!(
result.unwrap_err().iter().nth(1).unwrap().description(),
"Variable `username` was used in a math operation but is not a number"
);
}
#[test]
fn test_error_render_filter_section_invalid() {
let result = render_tpl("filter_section_invalid.html");
assert_eq!(result.is_err(), true);
assert_eq!(
result.unwrap_err().iter().nth(1).unwrap().description(),
"Filter `round` was called on an incorrect value: got `\"hello\"` but expected a f64"
);
}
#[test]
fn test_error_render_iterate_non_array() {
let result = render_tpl("iterate_on_non_array.html");
assert_eq!(result.is_err(), true);
assert_eq!(
result.unwrap_err().iter().nth(1).unwrap().description(),
"Tried to iterate on a container (`username`) that has a unsupported type"
);
}
#[test]
fn test_error_render_serialize_non_object() {
let tera = Tera::new("tests/render-failures/**/*").unwrap();
let result = tera.render("value_render_non_object.html", &[1, 2, 3]);
assert_eq!(result.is_err(), true);
assert_eq!(
result.unwrap_err().iter().nth(0).unwrap().description(),
"Failed to render \'value_render_non_object.html\': context isn\'t a JSON object. \
The value passed needs to be a key-value object: context, struct, hashmap for example."
);
}
#[test]
fn test_error_wrong_args_macros() {
let result = render_tpl("macro_wrong_args.html");
assert_eq!(result.is_err(), true);
assert!(
result
.unwrap_err()
.iter()
.nth(1)
.unwrap()
.description()
.contains("Macro `input` is missing the argument")
);
}
#[test]
fn test_error_macros_self_inexisting() {
let result = render_tpl("macro_self_inexisting.html");
assert_eq!(result.is_err(), true);
assert_eq!(
result.unwrap_err().iter().nth(1).unwrap().description(),
"Macro `self::inexisting` not found in template `macros.html`"
);
}
#[test]
fn test_error_in_child_template_location() {
let result = render_tpl("error-location/error_in_child.html");
assert_eq!(result.is_err(), true);
let errs = result.unwrap_err();
assert_eq!(
errs.iter().nth(0).unwrap().description(),
"Failed to render 'error-location/error_in_child.html'"
);
}
#[test]
fn test_error_in_grandchild_template_location() {
let result = render_tpl("error-location/error_in_grand_child.html");
assert_eq!(result.is_err(), true);
let errs = result.unwrap_err();
assert_eq!(
errs.iter().nth(0).unwrap().description(),
"Failed to render 'error-location/error_in_grand_child.html'"
);
}
#[test]
fn test_error_in_parent_template_location() {
let result = render_tpl("error-location/error_in_parent.html");
assert_eq!(result.is_err(), true);
let errs = result.unwrap_err();
assert_eq!(
errs.iter().nth(0).unwrap().description(),
"Failed to render 'error-location/error_in_parent.html' (error happened in a parent template)"
);
}
#[test]
fn test_error_in_macro_location() {
let result = render_tpl("error-location/error_in_macro.html");
assert_eq!(result.is_err(), true);
let errs = result.unwrap_err();
assert_eq!(
errs.iter().nth(0).unwrap().description(),
"Failed to render 'error-location/error_in_macro.html': error while rendering macro `macros::cause_error`"
);
}