use std::fs;
use std::process::Command;
use tempfile::TempDir;
#[test]
fn test_site_generation_with_static_files() {
let temp_dir = TempDir::new().unwrap();
let input_dir = temp_dir.path().join("input");
let output_dir = temp_dir.path().join("output");
fs::create_dir_all(&input_dir).unwrap();
fs::create_dir_all(input_dir.join("content")).unwrap();
fs::create_dir_all(input_dir.join("static")).unwrap();
let config_path = input_dir.join("marmite.yaml");
fs::write(&config_path, "name: Site").unwrap();
fs::write(
input_dir.join("static").join("style.css"),
"body { color: red; }",
)
.unwrap();
fs::write(
input_dir.join("static").join("script.js"),
"console.log('test');",
)
.unwrap();
fs::write(input_dir.join("content").join("page.md"), "# Page").unwrap();
let output = Command::new("cargo")
.args([
"run",
"--quiet",
"--",
input_dir.to_str().unwrap(),
output_dir.to_str().unwrap(),
])
.output()
.expect("Failed to execute marmite");
assert!(
output.status.success(),
"Command failed: {}",
String::from_utf8_lossy(&output.stderr)
);
assert!(output_dir.join("static").join("style.css").exists());
assert!(output_dir.join("static").join("script.js").exists());
assert!(output_dir.join("static").join("marmite.css").exists());
assert!(output_dir.join("static").join("marmite.js").exists());
assert!(output_dir.join("static").join("pico.min.css").exists());
assert!(output_dir.join("static").join("search.js").exists());
}
#[test]
fn test_static_drift_warning_for_core_files() {
let temp_dir = TempDir::new().unwrap();
let input_dir = temp_dir.path().join("input");
let output_dir = temp_dir.path().join("output");
fs::create_dir_all(&input_dir).unwrap();
fs::create_dir_all(input_dir.join("content")).unwrap();
fs::create_dir_all(input_dir.join("static")).unwrap();
let config_path = input_dir.join("marmite.yaml");
fs::write(&config_path, "name: Site").unwrap();
fs::write(
input_dir.join("static").join("search.js"),
"// my customized search",
)
.unwrap();
fs::write(input_dir.join("content").join("page.md"), "# Page").unwrap();
let output = Command::new("cargo")
.args([
"run",
"--quiet",
"--",
input_dir.to_str().unwrap(),
output_dir.to_str().unwrap(),
])
.output()
.expect("Failed to execute marmite");
assert!(output.status.success());
let output_search_js = fs::read_to_string(output_dir.join("static").join("search.js")).unwrap();
assert_eq!(output_search_js, "// my customized search");
assert!(output_dir.join("static").join("marmite.css").exists());
assert!(output_dir.join("static").join("pico.min.css").exists());
let stderr = String::from_utf8_lossy(&output.stderr);
assert!(
stderr.contains("search.js") && stderr.contains("differs from the embedded version"),
"Expected drift warning for search.js in stderr, got: {stderr}"
);
}
#[test]
fn test_site_generation_with_media() {
let temp_dir = TempDir::new().unwrap();
let input_dir = temp_dir.path().join("input");
let output_dir = temp_dir.path().join("output");
fs::create_dir_all(&input_dir).unwrap();
fs::create_dir_all(input_dir.join("content")).unwrap();
fs::create_dir_all(input_dir.join("content").join("media")).unwrap();
let config_path = input_dir.join("marmite.yaml");
fs::write(&config_path, "name: Site").unwrap();
fs::write(
input_dir.join("content").join("media").join("image.jpg"),
"fake image data",
)
.unwrap();
let content = r"# Post with Image
";
fs::write(input_dir.join("content").join("post.md"), content).unwrap();
let output = Command::new("cargo")
.args([
"run",
"--quiet",
"--",
input_dir.to_str().unwrap(),
output_dir.to_str().unwrap(),
])
.output()
.expect("Failed to execute marmite");
assert!(
output.status.success(),
"Command failed: {}",
String::from_utf8_lossy(&output.stderr)
);
assert!(output_dir.join("media").join("image.jpg").exists());
}
#[test]
fn test_site_generation_with_sitemap() {
let temp_dir = TempDir::new().unwrap();
let input_dir = temp_dir.path().join("input");
let output_dir = temp_dir.path().join("output");
fs::create_dir_all(&input_dir).unwrap();
fs::create_dir_all(input_dir.join("content")).unwrap();
let config_path = input_dir.join("marmite.yaml");
fs::write(
&config_path,
"name: Site\nbuild_sitemap: true\nurl: https://example.com",
)
.unwrap();
fs::write(input_dir.join("content").join("page1.md"), "# Page 1").unwrap();
fs::write(input_dir.join("content").join("page2.md"), "# Page 2").unwrap();
let output = Command::new("cargo")
.args([
"run",
"--quiet",
"--",
input_dir.to_str().unwrap(),
output_dir.to_str().unwrap(),
])
.output()
.expect("Failed to execute marmite");
assert!(
output.status.success(),
"Command failed: {}",
String::from_utf8_lossy(&output.stderr)
);
assert!(output_dir.join("sitemap.xml").exists());
let sitemap_content = fs::read_to_string(output_dir.join("sitemap.xml")).unwrap();
assert!(sitemap_content.contains("<urlset"));
assert!(sitemap_content.contains("page1.html"));
assert!(sitemap_content.contains("page2.html"));
}
#[test]
fn test_series_feature() {
let temp_dir = TempDir::new().unwrap();
let input_dir = temp_dir.path().join("input");
let output_dir = temp_dir.path().join("output");
fs::create_dir_all(&input_dir).unwrap();
fs::create_dir_all(input_dir.join("content")).unwrap();
let config_path = input_dir.join("marmite.yaml");
fs::write(&config_path, "name: Blog").unwrap();
let part1 = r"---
date: 2024-01-01
series: python-tutorial
---
# Python Tutorial Part 1";
fs::write(input_dir.join("content").join("python-part1.md"), part1).unwrap();
let part2 = r"---
date: 2024-01-02
series: python-tutorial
---
# Python Tutorial Part 2";
fs::write(input_dir.join("content").join("python-part2.md"), part2).unwrap();
let output = Command::new("cargo")
.args([
"run",
"--quiet",
"--",
input_dir.to_str().unwrap(),
output_dir.to_str().unwrap(),
])
.output()
.expect("Failed to execute marmite");
assert!(
output.status.success(),
"Command failed: {}",
String::from_utf8_lossy(&output.stderr)
);
assert!(output_dir.join("series-python-tutorial.html").exists());
assert!(output_dir.join("series.html").exists());
}
#[test]
fn test_fragments_feature() {
let temp_dir = TempDir::new().unwrap();
let input_dir = temp_dir.path().join("input");
let output_dir = temp_dir.path().join("output");
fs::create_dir_all(&input_dir).unwrap();
fs::create_dir_all(input_dir.join("content")).unwrap();
let config_path = input_dir.join("marmite.yaml");
fs::write(&config_path, "name: Site").unwrap();
let fragment = "## This is a fragment\n\nIt can be included in templates.";
fs::write(input_dir.join("content").join("_hero.md"), fragment).unwrap();
fs::write(input_dir.join("content").join("page.md"), "# Regular Page").unwrap();
let output = Command::new("cargo")
.args([
"run",
"--quiet",
"--",
input_dir.to_str().unwrap(),
output_dir.to_str().unwrap(),
])
.output()
.expect("Failed to execute marmite");
assert!(
output.status.success(),
"Command failed: {}",
String::from_utf8_lossy(&output.stderr)
);
assert!(!output_dir.join("_hero.html").exists());
assert!(!output_dir.join("hero.html").exists());
assert!(output_dir.join("page.html").exists());
}
#[test]
fn test_authors_feature() {
let temp_dir = TempDir::new().unwrap();
let input_dir = temp_dir.path().join("input");
let output_dir = temp_dir.path().join("output");
fs::create_dir_all(&input_dir).unwrap();
fs::create_dir_all(input_dir.join("content")).unwrap();
let config = r"name: Blog
authors:
alice:
name: Alice Smith
bio: Developer
avatar: alice.jpg
bob:
name: Bob Jones
bio: Designer
avatar: bob.jpg
";
fs::write(input_dir.join("marmite.yaml"), config).unwrap();
let post1 = r"---
date: 2024-01-01
author: alice
---
# Alice's Post";
fs::write(input_dir.join("content").join("alice-post.md"), post1).unwrap();
let post2 = r"---
date: 2024-01-02
authors: [alice, bob]
---
# Collaborative Post";
fs::write(input_dir.join("content").join("collab-post.md"), post2).unwrap();
let output = Command::new("cargo")
.args([
"run",
"--quiet",
"--",
input_dir.to_str().unwrap(),
output_dir.to_str().unwrap(),
])
.output()
.expect("Failed to execute marmite");
assert!(
output.status.success(),
"Command failed: {}",
String::from_utf8_lossy(&output.stderr)
);
assert!(output_dir.join("author-alice.html").exists());
assert!(output_dir.join("author-bob.html").exists());
assert!(output_dir.join("authors.html").exists());
}
#[test]
fn test_file_mapping_feature() {
let temp_dir = TempDir::new().unwrap();
let input_dir = temp_dir.path().join("input");
let output_dir = temp_dir.path().join("output");
fs::create_dir_all(&input_dir).unwrap();
fs::create_dir_all(input_dir.join("content")).unwrap();
let config = r"name: Site
file_mapping:
- source: README.md
dest: about.html
";
fs::write(input_dir.join("marmite.yaml"), config).unwrap();
fs::write(
input_dir.join("README.md"),
"# About\n\nThis is the about page.",
)
.unwrap();
fs::write(input_dir.join("content").join("page.md"), "# Page").unwrap();
let output = Command::new("cargo")
.args([
"run",
"--quiet",
"--",
input_dir.to_str().unwrap(),
output_dir.to_str().unwrap(),
])
.output()
.expect("Failed to execute marmite");
assert!(
output.status.success(),
"Command failed: {}",
String::from_utf8_lossy(&output.stderr)
);
assert!(output_dir.join("about.html").exists());
}