use super::*;
use serde_json::json;
#[test]
fn title_falls_back_to_first_h1_heading_when_no_frontmatter_title() {
let body = "# Getting Started\n\nSome intro text.\n";
let title = resolve_title(&json!({}), body, "fallback-slug");
assert_eq!(title, "Getting Started");
}
#[test]
fn frontmatter_title_takes_priority_over_heading() {
let body = "# Getting Started\n";
let title = resolve_title(&json!({"title": "Custom Title"}), body, "fallback-slug");
assert_eq!(title, "Custom Title");
}
#[test]
fn falls_back_to_filename_when_no_title_or_heading() {
let body = "Just a paragraph, no heading.\n";
let title = resolve_title(&json!({}), body, "fallback-slug");
assert_eq!(title, "fallback-slug");
}
#[test]
fn template_falls_back_to_default_when_no_frontmatter_key() {
let template = resolve_template(&json!({}), Some("page.html"));
assert_eq!(template, Some("page.html".to_string()));
}
#[test]
fn frontmatter_template_overrides_default() {
let template = resolve_template(&json!({"template": "custom.html"}), Some("page.html"));
assert_eq!(template, Some("custom.html".to_string()));
}
#[test]
fn no_default_and_no_frontmatter_template_resolves_to_none() {
let template = resolve_template(&json!({}), None);
assert_eq!(template, None);
}
#[test]
fn render_markdown_produces_expected_html() {
let html_out = render_markdown("# Title\n\nA *paragraph*.\n", None, false);
assert_eq!(
html_out,
"<h1 id=\"title\">Title</h1>\n<p>A <em>paragraph</em>.</p>\n"
);
}
#[test]
fn heading_with_punctuation_gets_slugified_anchor_id() {
let html_out = render_markdown("## Getting Started: A Guide!\n", None, false);
assert_eq!(
html_out,
"<h2 id=\"getting-started-a-guide\">Getting Started: A Guide!</h2>\n"
);
}
#[test]
fn duplicate_heading_text_gets_deduplicated_anchor_ids() {
let html_out = render_markdown("# Overview\n\ntext\n\n# Overview\n", None, false);
assert!(html_out.contains("<h1 id=\"overview\">Overview</h1>"));
assert!(html_out.contains("<h1 id=\"overview-1\">Overview</h1>"));
}
#[test]
fn slugify_lowercases_and_drops_punctuation() {
assert_eq!(
slugify("Getting Started: A Guide!"),
"getting-started-a-guide"
);
}
#[test]
fn slugify_collapses_repeated_separators_and_trims_ends() {
assert_eq!(
slugify(" Multiple Spaces--and__underscores_ "),
"multiple-spaces-and-underscores"
);
}
#[test]
fn page_url_defaults_to_root_relative_without_link_base() {
assert_eq!(page_url("guide/setup.html", None), "/guide/setup.html");
}
#[test]
fn page_url_joins_under_configured_link_base() {
assert_eq!(
page_url("guide/setup.html", Some("/docs")),
"/docs/guide/setup.html"
);
}
#[test]
fn rewrites_relative_md_link_to_the_html_file_it_names() {
let html_out = render_markdown("[Setup](setup.md)\n", Some("/"), false);
assert_eq!(html_out, "<p><a href=\"/setup.html\">Setup</a></p>\n");
}
#[test]
fn rewrites_relative_md_link_to_a_directory_url_under_pretty_urls() {
let html_out = render_markdown("[Setup](setup.md)\n", Some("/"), true);
assert_eq!(html_out, "<p><a href=\"/setup/\">Setup</a></p>\n");
}
#[test]
fn rewrites_nested_md_link_under_link_base() {
let html_out = render_markdown("[Setup](guide/setup.md)\n", Some("/docs"), false);
assert_eq!(
html_out,
"<p><a href=\"/docs/guide/setup.html\">Setup</a></p>\n"
);
}
#[test]
fn leaves_md_link_untouched_when_no_link_base_set() {
let html_out = render_markdown("[Setup](setup.md)\n", None, false);
assert_eq!(html_out, "<p><a href=\"setup.md\">Setup</a></p>\n");
}
#[test]
fn leaves_external_md_link_untouched_even_with_link_base_set() {
let html_out = render_markdown("[Spec](https://example.com/README.md)\n", Some("/"), false);
assert_eq!(
html_out,
"<p><a href=\"https://example.com/README.md\">Spec</a></p>\n"
);
}
#[test]
fn leaves_non_md_link_untouched_with_link_base_set() {
let html_out = render_markdown("[Home](/index.html)\n", Some("/"), false);
assert_eq!(html_out, "<p><a href=\"/index.html\">Home</a></p>\n");
}