codewhale-tui 0.8.66

Terminal UI for open-source and open-weight coding models
use std::path::PathBuf;

use super::manifest::{PluginManifest, PluginMeta};
use super::registry::PluginRegistry;

#[test]
fn test_manifest_parsing() {
    let toml_content = r#"
[plugin]
name = "test-plugin"
description = "A test plugin"
version = "1.0.0"
author = "Test Author"

[when]
os = ["windows", "linux"]
binaries = ["cargo"]
"#;

    let manifest: PluginManifest = toml::from_str(toml_content).unwrap();
    assert_eq!(manifest.plugin.name, "test-plugin");
    assert_eq!(manifest.plugin.description.unwrap(), "A test plugin");
    assert_eq!(manifest.plugin.version.unwrap(), "1.0.0");
    assert_eq!(manifest.plugin.author.unwrap(), "Test Author");
}

#[test]
fn test_manifest_when_os_filter() {
    let manifest = PluginManifest {
        plugin: PluginMeta {
            name: "test".to_string(),
            description: None,
            version: None,
            author: None,
        },
        skills: None,
        mcp_servers: None,
        when: Some(super::manifest::PluginWhen {
            os: Some(vec![std::env::consts::OS.to_string()]),
            binaries: None,
        }),
    };

    assert!(manifest.check_when());
}

#[test]
fn test_manifest_when_os_mismatch() {
    let manifest = PluginManifest {
        plugin: PluginMeta {
            name: "test".to_string(),
            description: None,
            version: None,
            author: None,
        },
        skills: None,
        mcp_servers: None,
        when: Some(super::manifest::PluginWhen {
            os: Some(vec!["nonexistent-os".to_string()]),
            binaries: None,
        }),
    };

    assert!(!manifest.check_when());
}

#[test]
fn test_registry_enable_disable() {
    let mut registry = PluginRegistry::new();

    let manifest = PluginManifest {
        plugin: PluginMeta {
            name: "test-plugin".to_string(),
            description: None,
            version: None,
            author: None,
        },
        skills: None,
        mcp_servers: None,
        when: None,
    };

    let plugin = super::manifest::LoadedPlugin {
        manifest,
        base_path: PathBuf::new(),
        enabled: false,
    };

    registry.register("test-plugin".to_string(), plugin);

    assert!(!registry.is_enabled("test-plugin"));
    assert!(registry.enable("test-plugin"));
    assert!(registry.is_enabled("test-plugin"));
    assert!(registry.disable("test-plugin"));
    assert!(!registry.is_enabled("test-plugin"));
}

#[test]
fn test_registry_list() {
    let mut registry = PluginRegistry::new();

    let manifest1 = PluginManifest {
        plugin: PluginMeta {
            name: "plugin-1".to_string(),
            description: None,
            version: None,
            author: None,
        },
        skills: None,
        mcp_servers: None,
        when: None,
    };

    let manifest2 = PluginManifest {
        plugin: PluginMeta {
            name: "plugin-2".to_string(),
            description: None,
            version: None,
            author: None,
        },
        skills: None,
        mcp_servers: None,
        when: None,
    };

    let plugin1 = super::manifest::LoadedPlugin {
        manifest: manifest1,
        base_path: PathBuf::new(),
        enabled: true,
    };

    let plugin2 = super::manifest::LoadedPlugin {
        manifest: manifest2,
        base_path: PathBuf::new(),
        enabled: false,
    };

    registry.register("plugin-1".to_string(), plugin1);
    registry.register("plugin-2".to_string(), plugin2);

    assert_eq!(registry.len(), 2);
    assert_eq!(registry.enabled_plugins().len(), 1);
    assert_eq!(registry.list_enabled().len(), 1);
    assert!(registry.is_enabled("plugin-1"));
    assert!(!registry.is_enabled("plugin-2"));
}