1 use crate::template::{find, parse, Context};
3 use std::io::{Error, ErrorKind::Other, Result};
6 const FILENAME: &str = "index.html";
10 template_directory: &Path,
14 if let Some(template) = find(template_directory, FILENAME) {
16 parse(&template).ok_or_else(|| Error::new(Other, "Unable to parse HTML template"))?;
17 let rendered_template = parsed_template.render(context)?;
18 let location = target.join(FILENAME);
19 write(location, rendered_template)?;
26 use std::collections::HashMap;
27 use std::fs::create_dir_all;
31 use crate::template::Value;
33 use test_utilities::*;
36 fn test_generates_html_with_default_layout() {
37 let test_dir = setup_test_dir();
38 let static_dir = test_dir.join("static");
39 let template_dir = test_dir.join("templates");
40 let output_dir = test_dir.join("output");
42 create_dir_all(&static_dir).expect("Could not create static directory");
43 create_dir_all(&template_dir).expect("Could not create template directory");
44 create_dir_all(&output_dir).expect("Could not create output directory");
46 let context = HashMap::from([
47 ("has_posts".to_string(), Value::Bool(true)),
50 Value::Collection(vec![
52 ("index".to_string(), Value::Unsigned(2828)),
55 Value::String("<p>Contextualization</p>".to_string()),
59 ("index".to_string(), Value::Unsigned(2828)),
62 Value::String("<p>Contexternalization</p>".to_string()),
69 generate(&static_dir, &template_dir, &output_dir, &context).expect("Generate failed");
71 assert_file_contains(&output_dir.join("index.html"), "<p>Contextualization</p>");
72 assert_file_contains(&output_dir.join("index.html"), "<p>Contexternalization</p>");
76 fn test_uses_custom_layout_if_available() {
77 let test_dir = setup_test_dir();
78 let static_dir = test_dir.join("static");
79 let template_dir = test_dir.join("templates");
80 let output_dir = test_dir.join("output");
82 create_dir_all(&static_dir).expect("Could not create static directory");
83 create_dir_all(&template_dir).expect("Could not create template directory");
84 create_dir_all(&output_dir).expect("Could not create output directory");
86 &template_dir.join("index.html"),
93 let context = HashMap::from([(
95 Value::Collection(vec![
98 Value::String("<p>Recontextualization</p>".to_string()),
102 Value::String("<p>Recontexternalization</p>".to_string()),
107 generate(&static_dir, &template_dir, &output_dir, &context).expect("Generate failed");
109 assert_file_contents(
110 &output_dir.join("index.html"),
112 <p>Recontextualization</p>
114 <p>Recontexternalization</p>
120 fn test_fails_if_html_is_malformed() {
121 let test_dir = setup_test_dir();
122 let static_dir = test_dir.join("static");
123 let template_dir = test_dir.join("templates");
124 let output_dir = test_dir.join("output");
126 create_dir_all(&static_dir).expect("Could not create static directory");
127 create_dir_all(&template_dir).expect("Could not create template directory");
128 create_dir_all(&output_dir).expect("Could not create output directory");
130 &template_dir.join("index.html"),
137 let context = HashMap::new();
139 let result = generate(&static_dir, &template_dir, &output_dir, &context);
141 assert!(result.is_err());
145 fn test_fails_if_output_is_not_writable() {
146 let test_dir = setup_test_dir();
147 let static_dir = test_dir.join("static");
148 let template_dir = test_dir.join("templates");
149 let output_dir = test_dir.join("output");
151 create_dir_all(&template_dir).expect("Could not create template directory");
153 &template_dir.join("index.html"),
160 let context = HashMap::from([(
162 Value::Collection(vec![
165 Value::String("<p>Recontextualization</p>".to_string()),
169 Value::String("<p>Recontexternalization</p>".to_string()),
174 let result = generate(&static_dir, &template_dir, &output_dir, &context);
176 assert!(result.is_err());