mini-docs 0.7.0

A minimal, secure build-time Markdown to HTML generator for the mini-* family.
Documentation
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");
}