rusty-commit 1.0.27

Rust-powered AI commit message generator - Write impressive commits in seconds
Documentation
#![allow(
    clippy::field_reassign_with_default,
    clippy::assertions_on_constants,
    clippy::overly_complex_bool_expr,
    clippy::useless_vec
)]

use rusty_commit::config::Config;
use rusty_commit::providers::create_provider;
use rusty_commit::providers::prompt::build_prompt;

#[test]
fn test_build_prompt_conventional() {
    let mut config = Config::default();
    config.commit_type = Some("conventional".to_string());
    config.language = Some("en".to_string());
    config.description_capitalize = Some(true);
    config.description_add_period = Some(false);
    config.description_max_length = Some(100);

    let diff = "diff --git a/test.txt b/test.txt\n+hello world";
    let prompt = build_prompt(diff, None, &config, false);

    assert!(prompt.contains("conventional commit format"));
    assert!(prompt.contains("Capitalize the first letter"));
    assert!(prompt.contains("Do not end the description with a period"));
    assert!(prompt.contains("under 100 characters"));
    assert!(prompt.contains(diff));
}

#[test]
fn test_build_prompt_gitmoji() {
    let mut config = Config::default();
    config.commit_type = Some("gitmoji".to_string());

    let diff = "test diff";
    let prompt = build_prompt(diff, None, &config, false);

    assert!(prompt.contains("GitMoji format"));
    assert!(prompt.contains("🐛"));
    assert!(prompt.contains(""));

    // Test full gitmoji spec
    let prompt_full = build_prompt(diff, None, &config, true);
    assert!(prompt_full.contains("full emoji specification"));
}

#[test]
fn test_build_prompt_with_context() {
    let config = Config::default();
    let diff = "test diff";
    let context = "Fixed authentication bug";

    let prompt = build_prompt(diff, Some(context), &config, false);

    assert!(prompt.contains("Additional context: Fixed authentication bug"));
}

#[test]
fn test_build_prompt_with_language() {
    let mut config = Config::default();
    config.language = Some("es".to_string());

    let diff = "test diff";
    let prompt = build_prompt(diff, None, &config, false);

    assert!(prompt.contains("Generate the commit message in es language"));
}

#[test]
fn test_create_provider_openai() {
    let mut config = Config::default();
    config.ai_provider = Some("openai".to_string());
    config.api_key = Some("test_key".to_string());

    let provider = create_provider(&config);
    assert!(provider.is_ok());
}

#[test]
fn test_create_provider_anthropic() {
    let mut config = Config::default();
    config.ai_provider = Some("anthropic".to_string());
    config.api_key = Some("test_key".to_string());

    let provider = create_provider(&config);
    assert!(provider.is_ok());
}

#[test]
fn test_create_provider_ollama() {
    let mut config = Config::default();
    config.ai_provider = Some("ollama".to_string());

    let provider = create_provider(&config);
    assert!(provider.is_ok());
}

#[test]
fn test_create_provider_gemini() {
    let mut config = Config::default();
    config.ai_provider = Some("gemini".to_string());
    config.api_key = Some("test_key".to_string());

    let provider = create_provider(&config);
    assert!(provider.is_ok());
}

#[cfg(feature = "azure")]
#[test]
fn test_create_provider_azure() {
    let mut config = Config::default();
    config.ai_provider = Some("azure".to_string());
    config.api_key = Some("test_key".to_string());
    config.api_url = Some("https://test.openai.azure.com".to_string());

    let provider = create_provider(&config);
    assert!(
        provider.is_ok(),
        "Azure provider creation failed: {:?}",
        provider.err()
    );
}

#[test]
fn test_create_provider_invalid() {
    let mut config = Config::default();
    config.ai_provider = Some("invalid_provider".to_string());

    let provider = create_provider(&config);
    assert!(provider.is_err());
}

#[test]
fn test_create_provider_missing_api_key() {
    let mut config = Config::default();
    config.ai_provider = Some("openai".to_string());
    config.api_key = None;

    let provider = create_provider(&config);
    assert!(provider.is_err());
}