1 use crate::template::{find, parse, Context};
3 use std::io::{Error, ErrorKind::Other, Result};
6 const FILENAME: &str = "feed.xml";
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 RSS 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_rss_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 ("id".to_string(), Value::String("123".to_string())),
54 "created_on_utc".to_string(),
55 Value::String("Last Saturday".to_string()),
59 Value::String("Big words I know.".to_string()),
62 "escaped_html".to_string(),
63 Value::String("<p>Contextualization</p>".to_string()),
67 ("id".to_string(), Value::String("456".to_string())),
69 "created_on_utc".to_string(),
70 Value::String("This Saturday".to_string()),
74 Value::String("Big words I don't know.".to_string()),
77 "escaped_html".to_string(),
78 Value::String("<p>Contexternalization</p>".to_string()),
85 generate(&static_dir, &template_dir, &output_dir, &context).expect("Generate failed");
87 assert_file_contains(&output_dir.join("feed.xml"), "<p>Contextualization</p>");
88 assert_file_contains(&output_dir.join("feed.xml"), "<p>Contexternalization</p>");
92 fn test_uses_custom_layout_if_available() {
93 let test_dir = setup_test_dir();
94 let static_dir = test_dir.join("static");
95 let template_dir = test_dir.join("templates");
96 let output_dir = test_dir.join("output");
98 create_dir_all(&static_dir).expect("Could not create static directory");
99 create_dir_all(&template_dir).expect("Could not create template directory");
100 create_dir_all(&output_dir).expect("Could not create output directory");
102 &template_dir.join("feed.xml"),
109 let context = HashMap::from([(
111 Value::Collection(vec![
114 Value::String("<p>Recontextualization</p>".to_string()),
118 Value::String("<p>Recontexternalization</p>".to_string()),
123 generate(&static_dir, &template_dir, &output_dir, &context).expect("Generate failed");
125 assert_file_contents(
126 &output_dir.join("feed.xml"),
128 <p>Recontextualization</p>
130 <p>Recontexternalization</p>
136 fn test_fails_if_rss_is_malformed() {
137 let test_dir = setup_test_dir();
138 let static_dir = test_dir.join("static");
139 let template_dir = test_dir.join("templates");
140 let output_dir = test_dir.join("output");
142 create_dir_all(&static_dir).expect("Could not create static directory");
143 create_dir_all(&template_dir).expect("Could not create template directory");
144 create_dir_all(&output_dir).expect("Could not create output directory");
146 &template_dir.join("feed.xml"),
153 let context = HashMap::new();
155 let result = generate(&static_dir, &template_dir, &output_dir, &context);
157 assert!(result.is_err());
161 fn test_fails_if_output_is_not_writable() {
162 let test_dir = setup_test_dir();
163 let static_dir = test_dir.join("static");
164 let template_dir = test_dir.join("templates");
165 let output_dir = test_dir.join("output");
167 create_dir_all(&template_dir).expect("Could not create template directory");
169 &template_dir.join("feed.xml"),
176 let context = HashMap::from([(
178 Value::Collection(vec![
181 Value::String("<p>Recontextualization</p>".to_string()),
185 Value::String("<p>Recontexternalization</p>".to_string()),
190 let result = generate(&static_dir, &template_dir, &output_dir, &context);
192 assert!(result.is_err());