opencrabs 0.5.10

The autonomous, self-improving AI agent. Single Rust binary. Every channel. Recommended: the 40MB prebuilt binary for macOS, Linux and Windows: https://github.com/opencrabs/opencrabs/releases
Documentation
use crate::config::{Config, TelegramConfig};

#[test]
fn test_telegram_config_default_struct_booleans() {
    let cfg = TelegramConfig::default();
    assert!(cfg.rich_messages, "rich_messages must default to true");
    assert!(
        !cfg.inline_markdown_documents,
        "inline_markdown_documents must default to false (#1968)"
    );
    assert!(cfg.mermaid_render, "mermaid_render must default to true");
    assert!(
        cfg.silence_group_start,
        "silence_group_start must default to true"
    );
    assert!(!cfg.enabled, "enabled must default to false");
    assert!(cfg.token.is_none(), "token must default to None");
    assert!(
        cfg.allowed_users.is_empty(),
        "allowed_users must default to empty"
    );
    assert!(
        cfg.allowed_channels.is_empty(),
        "allowed_channels must default to empty"
    );
    assert!(cfg.bot_owner.is_empty(), "bot_owner must default to empty");
    assert!(cfg.groups.is_empty(), "groups must default to empty");
    assert!(
        cfg.rate_limiter.enabled,
        "rate_limiter must default to enabled"
    );
}

#[test]
fn test_config_missing_channels_table_toml() {
    let toml_str = r#"
        # Complete absence of [channels] and [channels.telegram]
        [agent]
        max_tool_iterations = 10
    "#;
    let cfg: Config = toml::from_str(toml_str).expect("config must parse without channels table");
    let tg = cfg.channels.telegram;
    assert!(
        tg.rich_messages,
        "rich_messages must be true when [channels] is omitted"
    );
    assert!(
        !tg.inline_markdown_documents,
        "inline_markdown_documents must be false when [channels] is omitted"
    );
    assert!(
        tg.mermaid_render,
        "mermaid_render must be true when [channels] is omitted"
    );
    assert!(
        tg.silence_group_start,
        "silence_group_start must be true when [channels] is omitted"
    );
}

#[test]
fn test_config_missing_channels_telegram_table_toml() {
    let toml_str = r#"
        [channels]
        # [channels.telegram] omitted
    "#;
    let cfg: Config = toml::from_str(toml_str).expect("config must parse with empty [channels]");
    let tg = cfg.channels.telegram;
    assert!(
        tg.rich_messages,
        "rich_messages must be true when [channels.telegram] is omitted"
    );
    assert!(
        !tg.inline_markdown_documents,
        "inline_markdown_documents must be false when [channels.telegram] is omitted"
    );
    assert!(
        tg.mermaid_render,
        "mermaid_render must be true when [channels.telegram] is omitted"
    );
    assert!(
        tg.silence_group_start,
        "silence_group_start must be true when [channels.telegram] is omitted"
    );
}

#[test]
fn test_config_empty_channels_telegram_table_toml() {
    let toml_str = r#"
        [channels.telegram]
        # no keys specified inside table
    "#;
    let cfg: Config =
        toml::from_str(toml_str).expect("config must parse with bare [channels.telegram]");
    let tg = cfg.channels.telegram;
    assert!(
        tg.rich_messages,
        "rich_messages must be true when [channels.telegram] is empty"
    );
    assert!(
        !tg.inline_markdown_documents,
        "inline_markdown_documents must be false when [channels.telegram] is empty"
    );
    assert!(
        tg.mermaid_render,
        "mermaid_render must be true when [channels.telegram] is empty"
    );
    assert!(
        tg.silence_group_start,
        "silence_group_start must be true when [channels.telegram] is empty"
    );
}

#[test]
fn test_config_explicit_overrides_respected() {
    let toml_str = r#"
        [channels.telegram]
        rich_messages = false
        inline_markdown_documents = true
        mermaid_render = false
        silence_group_start = false
    "#;
    let cfg: Config =
        toml::from_str(toml_str).expect("config must parse with explicit false overrides");
    let tg = cfg.channels.telegram;
    assert!(
        !tg.rich_messages,
        "explicit rich_messages = false must be respected"
    );
    assert!(
        tg.inline_markdown_documents,
        "explicit inline_markdown_documents = true must be respected"
    );
    assert!(
        !tg.mermaid_render,
        "explicit mermaid_render = false must be respected"
    );
    assert!(
        !tg.silence_group_start,
        "explicit silence_group_start = false must be respected"
    );
}

#[test]
fn test_config_partial_override_preserves_other_defaults() {
    let toml_str = r#"
        [channels.telegram]
        rich_messages = false
    "#;
    let cfg: Config = toml::from_str(toml_str).expect("config must parse with partial override");
    let tg = cfg.channels.telegram;
    assert!(!tg.rich_messages, "rich_messages = false must be applied");
    assert!(
        !tg.inline_markdown_documents,
        "inline_markdown_documents must remain false default"
    );
    assert!(tg.mermaid_render, "mermaid_render must remain true default");
    assert!(
        tg.silence_group_start,
        "silence_group_start must remain true default"
    );
}