]> git.r.bdr.sh - rbdr/blog/blobdiff - src/generator/txt.rs
Address more of the formatter comments
[rbdr/blog] / src / generator / txt.rs
index f505480489b1533643424fec9d8d6f46185f56ca..ef48c033d347b353c8e5b529868ef4850ac10267 100644 (file)
+use crate::template::{find, parse, Context};
 use std::fs::write;
 use std::io::{Error, ErrorKind::Other, Result};
 use std::fs::write;
 use std::io::{Error, ErrorKind::Other, Result};
-use std::path::PathBuf;
-use crate::template::{find, parse, TemplateContext};
+use std::path::Path;
 
 const FILENAME: &str = "index.txt";
 
 
 const FILENAME: &str = "index.txt";
 
-pub fn generate(_: &PathBuf, template_directory: &PathBuf, target: &PathBuf, context: &TemplateContext) -> Result<()> {
-    match find(template_directory, FILENAME) {
-        Some(template) => {
-            let parsed_template = parse(&template)
-                .ok_or_else(|| Error::new(Other, "Unable to parse TXT template"))?;
-            let rendered_template = parsed_template.render(context)?;
-            let location = target.join(FILENAME);
-            write(location, rendered_template)?;
-        },
-        None => {}
+pub fn generate(
+    _: &Path,
+    template_directory: &Path,
+    target: &Path,
+    context: &Context,
+) -> Result<()> {
+    if let Some(template) = find(template_directory, FILENAME) {
+        let parsed_template =
+            parse(&template).ok_or_else(|| Error::new(Other, "Unable to parse TXT template"))?;
+        let rendered_template = parsed_template.render(context)?;
+        let location = target.join(FILENAME);
+        write(location, rendered_template)?;
     }
     Ok(())
 }
     }
     Ok(())
 }
+
+#[cfg(test)]
+mod tests {
+    use std::collections::HashMap;
+    use std::fs::create_dir_all;
+
+    use super::*;
+
+    use crate::template::Value;
+
+    use test_utilities::*;
+
+    #[test]
+    fn test_generates_txt_with_default_layout() {
+        let test_dir = setup_test_dir();
+        let static_dir = test_dir.join("static");
+        let template_dir = test_dir.join("templates");
+        let output_dir = test_dir.join("output");
+
+        create_dir_all(&static_dir).expect("Could not create static directory");
+        create_dir_all(&template_dir).expect("Could not create template directory");
+        create_dir_all(&output_dir).expect("Could not create output directory");
+
+        let context = HashMap::from([
+            ("has_posts".to_string(), Value::Bool(true)),
+            (
+                "posts".to_string(),
+                Value::Collection(vec![
+                    HashMap::from([(
+                        "raw".to_string(),
+                        Value::String("Contextualization".to_string()),
+                    )]),
+                    HashMap::from([(
+                        "raw".to_string(),
+                        Value::String("Contexternalization".to_string()),
+                    )]),
+                ]),
+            ),
+        ]);
+
+        generate(&static_dir, &template_dir, &output_dir, &context).expect("Generate failed");
+
+        assert_file_contains(&output_dir.join("index.txt"), "Contextualization");
+        assert_file_contains(&output_dir.join("index.txt"), "Contexternalization");
+    }
+
+    #[test]
+    fn test_uses_custom_layout_if_available() {
+        let test_dir = setup_test_dir();
+        let static_dir = test_dir.join("static");
+        let template_dir = test_dir.join("templates");
+        let output_dir = test_dir.join("output");
+
+        create_dir_all(&static_dir).expect("Could not create static directory");
+        create_dir_all(&template_dir).expect("Could not create template directory");
+        create_dir_all(&output_dir).expect("Could not create output directory");
+        create_test_file(
+            &template_dir.join("index.txt"),
+            "\
+{{~ posts:post }}
+    {{= post.raw }}
+{{~}}
+",
+        );
+        let context = HashMap::from([(
+            "posts".to_string(),
+            Value::Collection(vec![
+                HashMap::from([(
+                    "raw".to_string(),
+                    Value::String("Recontextualization".to_string()),
+                )]),
+                HashMap::from([(
+                    "raw".to_string(),
+                    Value::String("Recontexternalization".to_string()),
+                )]),
+            ]),
+        )]);
+
+        generate(&static_dir, &template_dir, &output_dir, &context).expect("Generate failed");
+
+        assert_file_contents(
+            &output_dir.join("index.txt"),
+            "\
+Recontextualization
+
+    Recontexternalization
+",
+        );
+    }
+
+    #[test]
+    fn test_fails_if_txt_is_malformed() {
+        let test_dir = setup_test_dir();
+        let static_dir = test_dir.join("static");
+        let template_dir = test_dir.join("templates");
+        let output_dir = test_dir.join("output");
+
+        create_dir_all(&static_dir).expect("Could not create static directory");
+        create_dir_all(&template_dir).expect("Could not create template directory");
+        create_dir_all(&output_dir).expect("Could not create output directory");
+        create_test_file(
+            &template_dir.join("index.txt"),
+            "\
+{{~ posts:post }}
+    {{ post.raw }}
+{{~}}
+",
+        );
+        let context = HashMap::new();
+
+        let result = generate(&static_dir, &template_dir, &output_dir, &context);
+
+        assert!(result.is_err());
+    }
+
+    #[test]
+    fn test_fails_if_output_is_not_writable() {
+        let test_dir = setup_test_dir();
+        let static_dir = test_dir.join("static");
+        let template_dir = test_dir.join("templates");
+        let output_dir = test_dir.join("output");
+
+        create_dir_all(&template_dir).expect("Could not create template directory");
+        create_test_file(
+            &template_dir.join("index.txt"),
+            "\
+{{~ posts:post }}
+    {{= post.raw }}
+{{~}}
+",
+        );
+        let context = HashMap::from([(
+            "posts".to_string(),
+            Value::Collection(vec![
+                HashMap::from([(
+                    "raw".to_string(),
+                    Value::String("Recontextualization".to_string()),
+                )]),
+                HashMap::from([(
+                    "raw".to_string(),
+                    Value::String("Recontexternalization".to_string()),
+                )]),
+            ]),
+        )]);
+
+        let result = generate(&static_dir, &template_dir, &output_dir, &context);
+
+        assert!(result.is_err());
+    }
+}