use super::RootArtifact;
use crate::markdown::RenderedSite;
pub(super) struct Robots;
impl RootArtifact for Robots {
fn filename(&self) -> &'static str {
"robots.txt"
}
fn render(&self, rendered: &RenderedSite<'_>) -> Vec<u8> {
tracing::debug!("generating robots.txt");
let sitemap_url = rendered.site().config.absolute_url("/sitemap.xml");
format!("User-agent: *\nAllow: /\n\nSitemap: {sitemap_url}\n").into_bytes()
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::content::Site;
use crate::markdown::MarkdownRenderer;
fn rendered_for(base_url: &str) -> Site {
let config: crate::config::Config = format!("title = \"T\"\nbase_url = \"{base_url}\"")
.parse()
.unwrap();
Site::from_parts(config, vec![], vec![], vec![]).unwrap()
}
#[test]
fn references_sitemap() {
let site = rendered_for("https://example.com");
let rendered = MarkdownRenderer::new(&site).render_site();
let txt = String::from_utf8(Robots.render(&rendered)).unwrap();
assert!(txt.contains("User-agent: *"));
assert!(txt.contains("Allow: /"));
assert!(txt.contains("Sitemap: https://example.com/sitemap.xml"));
}
#[test]
fn strips_trailing_slash() {
let site = rendered_for("https://example.com/");
let rendered = MarkdownRenderer::new(&site).render_site();
let txt = String::from_utf8(Robots.render(&rendered)).unwrap();
assert!(txt.contains("Sitemap: https://example.com/sitemap.xml"));
}
}