pipedash-plugin-api 0.14.0

Plugin API for Pipedash - CI/CD pipeline dashboard
Documentation
use std::collections::HashMap;

use super::*;
use crate::testing::{
    manifest,
    Stub,
};
use crate::PluginCapabilities;

fn plugin() -> Box<dyn Plugin> {
    Box::new(Stub::new(PluginCapabilities::default()))
}

fn self_describing() -> Box<dyn Plugin> {
    let mut metadata = Stub::new(PluginCapabilities::standard()).metadata().clone();
    metadata.name = "Own name".to_string();
    metadata.provider_type = "own-type".to_string();
    metadata.version = "own-version".to_string();
    metadata.description = "own description".to_string();
    metadata.author = Some("own author".to_string());
    metadata.icon = Some("own icon".to_string());
    Box::new(Stub::with_metadata(metadata))
}

fn registered() -> PluginRegistry {
    let mut registry = PluginRegistry::new();
    registry.register(plugin, manifest("alpha"));
    registry.register(plugin, manifest("beta"));
    registry
}

#[test]
fn test_registry_creation() {
    let registry = PluginRegistry::new();
    assert_eq!(registry.count(), 0);
}

#[tokio::test]
async fn create_returns_separate_instances() {
    let registry = registered();

    let mut first = registry.create("alpha").expect("registered");
    let second = registry.create("alpha").expect("registered");
    first
        .initialize(1, HashMap::new(), None)
        .expect("initialize");

    assert!(first.validate_credentials().await.expect("first"));
    assert!(!second.validate_credentials().await.expect("second"));
    assert!(registry.create("missing").is_none());
}

#[test]
fn metadata_matches_the_registered_set() {
    let registry = registered();

    let mut from_metadata: Vec<String> = registry
        .metadata()
        .map(|metadata| metadata.provider_type.clone())
        .collect();
    let mut registered = registry.provider_types();
    from_metadata.sort();
    registered.sort();

    assert_eq!(from_metadata, ["alpha", "beta"]);
    assert_eq!(registered, from_metadata);
    assert_eq!(registry.count(), 2);
    assert!(registry.is_registered("alpha"));
    assert!(registry.get("beta").is_some());
    assert!(!registry.is_registered("gamma"));
}

#[test]
fn manifest_fields_override_the_plugins_own_values() {
    let mut registry = PluginRegistry::new();
    registry.register(
        self_describing,
        PluginManifest {
            package_name: "pipedash-plugin-merged",
            ..manifest("ignored")
        },
    );
    let merged = registry.metadata_of("merged").expect("keyed by manifest");

    assert_eq!(merged.provider_type, "merged");
    assert_eq!(merged.version, "1.2.3");
    assert_eq!(merged.description, "Stub provider");
    assert_eq!(merged.author.as_deref(), Some("Stub Team"));
    assert_eq!(
        merged.icon.as_deref(),
        Some("data:image/svg+xml,%3Csvg/%3E")
    );
    assert_eq!(merged.name, "Own name");
    assert!(merged.capabilities.trigger);
    assert_eq!(registry.metadata().count(), 1);
    assert!(registry.metadata_of("own-type").is_none());
    assert!(registry.metadata_of("missing").is_none());
}