marmite 0.4.2

Marmite is the easiest static site generator.
use super::*;
use std::sync::Arc;

fn test_cli() -> crate::cli::Cli {
    crate::cli::Cli {
        input_folder: Some(std::path::PathBuf::from("test")),
        output_folder: None,
        verbose: 0,
        watch: false,
        serve: false,
        bind: "0.0.0.0:8000".to_string(),
        config: "marmite.yaml".to_string(),
        debug: false,
        init_templates: false,
        start_theme: None,
        set_theme: None,
        generate_config: false,
        init_site: false,
        force: false,
        shortcodes: false,
        show_urls: false,
        skill: false,
        skill_install: false,
        skill_install_claude: false,
        create: crate::cli::Create {
            new: None,
            edit: false,
            page: false,
            tags: None,
            directory: None,
            lang: None,
            translates: None,
            site: None,
        },
        configuration: crate::cli::Configuration {
            name: None,
            tagline: None,
            url: None,
            https: None,
            footer: None,
            language: None,
            pagination: None,
            enable_search: None,
            search_show_matches: None,
            search_match_count: None,
            enable_related_content: None,
            content_path: None,
            templates_path: None,
            static_path: None,
            media_path: None,
            default_date_format: None,
            colorscheme: None,
            toc: None,
            json_feed: None,
            show_next_prev_links: None,
            publish_md: None,
            source_repository: None,
            image_provider: None,
            theme: None,
            build_sitemap: None,
            publish_urls_json: None,
            enable_shortcodes: None,
            shortcode_pattern: None,
            skip_image_resize: None,
            enable_toolbar: None,
            check_internal_links: None,
            strict_internal_links: None,
            check_media_links: None,
            native_mermaid_render: None,
        },
        subcommand: None,
    }
}

#[test]
fn test_marmite_new_defaults() {
    let m = Marmite::new();
    assert_eq!(m.name, "Home");
    assert_eq!(m.pagination, 10);
    assert_eq!(m.content_path, "content");
    assert_eq!(m.templates_path, "templates");
    assert_eq!(m.static_path, "static");
    assert_eq!(m.media_path, "media");
    assert_eq!(m.default_date_format, "%b %e, %Y");
    assert_eq!(m.pages_title, "Pages");
    assert_eq!(m.tags_title, "Tags");
    assert_eq!(m.archives_title, "Archive");
    assert_eq!(m.streams_title, "Streams");
    assert_eq!(m.series_title, "Series");
    assert_eq!(m.authors_title, "Authors");
    assert!(m.show_next_prev_links);
    assert!(m.enable_shortcodes);
    assert!(m.build_sitemap);
    assert!(m.publish_urls_json);
    assert!(m.gallery_create_thumbnails);
    assert_eq!(m.gallery_thumb_size, 50);
    assert_eq!(m.gallery_path, "gallery");
    assert!(!m.toc);
    assert!(!m.json_feed);
    assert!(!m.publish_md);
    assert!(!m.enable_search);
    assert!(!m.skip_image_resize);
    assert!(!m.check_internal_links);
    assert!(!m.strict_internal_links);
    assert!(!m.check_media_links);
    assert!(m.native_mermaid_render);
}

#[test]
fn test_marmite_serde_defaults_language() {
    let m: Marmite = serde_yaml::from_str("{}").unwrap();
    assert_eq!(m.language, "en");
}

#[test]
fn test_marmite_serde_roundtrip() {
    let original = Marmite::new();
    let yaml = serde_yaml::to_string(&original).unwrap();
    let deserialized: Marmite = serde_yaml::from_str(&yaml).unwrap();
    assert_eq!(original, deserialized);
}

#[test]
fn test_marmite_deserialize_empty_yaml() {
    let m: Marmite = serde_yaml::from_str("{}").unwrap();
    assert_eq!(m.name, "Home");
    assert_eq!(m.pagination, 10);
    assert_eq!(m.language, "en");
    assert_eq!(m.content_path, "content");
}

#[test]
fn test_marmite_deserialize_partial_yaml() {
    let m: Marmite = serde_yaml::from_str("name: MySite\npagination: 20\n").unwrap();
    assert_eq!(m.name, "MySite");
    assert_eq!(m.pagination, 20);
    assert_eq!(m.language, "en");
    assert_eq!(m.content_path, "content");
}

#[test]
fn test_override_from_cli_args_name() {
    let mut m = Marmite::new();
    let mut args = test_cli();
    args.configuration.name = Some("CLI Name".to_string());
    m.override_from_cli_args(&Arc::new(args));
    assert_eq!(m.name, "CLI Name");
}

#[test]
fn test_override_from_cli_args_pagination() {
    let mut m = Marmite::new();
    let mut args = test_cli();
    args.configuration.pagination = Some(25);
    m.override_from_cli_args(&Arc::new(args));
    assert_eq!(m.pagination, 25);
}

#[test]
fn test_override_from_cli_args_multiple() {
    let mut m = Marmite::new();
    let mut args = test_cli();
    args.configuration.name = Some("My Blog".to_string());
    args.configuration.language = Some("pt".to_string());
    args.configuration.pagination = Some(5);
    args.configuration.url = Some("https://example.com".to_string());
    args.configuration.enable_search = Some(true);
    args.configuration.toc = Some(true);
    m.override_from_cli_args(&Arc::new(args));
    assert_eq!(m.name, "My Blog");
    assert_eq!(m.language, "pt");
    assert_eq!(m.pagination, 5);
    assert_eq!(m.url, "https://example.com");
    assert!(m.enable_search);
    assert!(m.toc);
}

#[test]
fn test_override_from_cli_args_none_leaves_defaults() {
    let original = Marmite::new();
    let mut m = Marmite::new();
    let args = test_cli();
    m.override_from_cli_args(&Arc::new(args));
    assert_eq!(m, original);
}

#[test]
fn test_code_highlight_config_default() {
    let c = CodeHighlightConfig::default();
    assert!(c.enabled);
    assert_eq!(c.light_theme, "github-light");
    assert_eq!(c.dark_theme, "github-dark");
}

#[test]
fn test_render_options_default() {
    let r = RenderOptions::default();
    assert!(r.unsafe_);
    assert!(r.ignore_empty_links);
    assert!(r.figure_with_caption);
}

#[test]
fn test_extension_options_default() {
    let e = ExtensionOptions::default();
    assert!(!e.tagfilter);
    assert!(e.strikethrough);
    assert!(e.table);
    assert!(e.autolink);
    assert!(e.tasklist);
    assert!(e.footnotes);
    assert!(e.description_lists);
    assert!(e.multiline_block_quotes);
    assert!(e.underline);
    assert!(e.spoiler);
    assert!(!e.greentext);
    assert!(e.shortcodes);
    assert!(e.wikilinks_title_before_pipe);
    assert!(!e.wikilinks_title_after_pipe);
    assert!(e.alerts);
}

#[test]
fn test_parse_options_default() {
    let p = ParseOptions::default();
    assert!(p.relaxed_tasklist_matching);
}

#[test]
fn test_override_from_cli_args_image_provider() {
    let mut m = Marmite::new();
    let mut args = test_cli();
    args.configuration.image_provider = Some("picsum".to_string());
    m.override_from_cli_args(&Arc::new(args));
    assert_eq!(m.image_provider, Some(ImageProvider::Picsum));
}

#[test]
fn test_override_from_cli_args_theme() {
    let mut m = Marmite::new();
    let mut args = test_cli();
    args.configuration.theme = Some("my-theme".to_string());
    m.override_from_cli_args(&Arc::new(args));
    assert_eq!(m.theme, Some("my-theme".to_string()));
}

#[test]
fn test_override_from_cli_args_colorscheme() {
    let mut m = Marmite::new();
    let mut args = test_cli();
    args.configuration.colorscheme = Some("dracula".to_string());
    m.override_from_cli_args(&Arc::new(args));
    let extra = m.extra.unwrap();
    assert_eq!(
        extra.get("colorscheme"),
        Some(&serde_yaml::Value::String("dracula".to_string()))
    );
}

#[test]
fn test_native_mermaid_render_defaults_to_true() {
    let config: Marmite = serde_yaml::from_str("name: Test").unwrap();
    assert!(config.native_mermaid_render);
}

#[test]
fn test_native_mermaid_render_disabled_from_yaml() {
    let config: Marmite = serde_yaml::from_str("native_mermaid_render: false").unwrap();
    assert!(!config.native_mermaid_render);
}

#[test]
fn test_override_from_cli_args_native_mermaid_render() {
    let mut m = Marmite::new();
    let mut args = test_cli();
    args.configuration.native_mermaid_render = Some(false);
    m.override_from_cli_args(&Arc::new(args));
    assert!(!m.native_mermaid_render);
}

#[test]
fn test_mermaid_config_defaults_to_none() {
    let config = Marmite::new();
    assert!(config.mermaid_config.is_none());
}

#[test]
fn test_mermaid_config_none_when_absent_from_yaml() {
    let config: Marmite = serde_yaml::from_str("name: Test").unwrap();
    assert!(config.mermaid_config.is_none());
}

#[test]
fn test_mermaid_config_from_yaml() {
    let config: Marmite = serde_yaml::from_str(
        r#"
mermaid_config:
  theme: dark
  flowchart:
    nodeSpacing: 80
"#,
    )
    .unwrap();
    let mc = config.mermaid_config.unwrap();
    let mapping = mc.as_mapping().unwrap();
    assert_eq!(
        mapping
            .get(serde_yaml::Value::String("theme".into()))
            .unwrap()
            .as_str()
            .unwrap(),
        "dark"
    );
    let flowchart = mapping
        .get(serde_yaml::Value::String("flowchart".into()))
        .unwrap()
        .as_mapping()
        .unwrap();
    assert_eq!(
        flowchart
            .get(serde_yaml::Value::String("nodeSpacing".into()))
            .unwrap()
            .as_u64()
            .unwrap(),
        80
    );
}