holger-server-lib 0.4.0

Holger server library: config, wiring, gRPC service, Rust API
//! Unit tests for holger-server-lib config parsing and wiring.

use holger_server_lib::{read_ron_config, wire_holger};
use std::io::Write;
use tempfile::NamedTempFile;

const MINIMAL_CONFIG: &str = r#"(
    repositories: [
        (
            ron_name: "rust-test",
            ron_repo_type: "rust",
            ron_upstreams: [],
            ron_in: None,
            ron_out: Some((
                ron_storage_endpoint: "test-storage",
                ron_exposed_endpoint: "test-ep",
            )),
        ),
    ],
    exposed_endpoints: [
        (
            ron_name: "test-ep",
            ron_url: "127.0.0.1:50051",
        ),
    ],
    storage_endpoints: [
        (
            ron_name: "test-storage",
            ron_storage_type: "rocksdb",
            ron_path: "/tmp/holger-test-data",
        ),
    ],
)"#;

#[test]
fn test_parse_minimal_config() {
    let mut f = NamedTempFile::new().unwrap();
    f.write_all(MINIMAL_CONFIG.as_bytes()).unwrap();

    let holger = read_ron_config(f.path()).unwrap();
    assert_eq!(holger.repositories.len(), 1);
    assert_eq!(holger.exposed_endpoints.len(), 1);
    assert_eq!(holger.storage_endpoints.len(), 1);
    assert_eq!(holger.repositories[0].ron_name, "rust-test");
}

#[test]
fn test_wire_holger() {
    let mut f = NamedTempFile::new().unwrap();
    f.write_all(MINIMAL_CONFIG.as_bytes()).unwrap();

    let mut holger = read_ron_config(f.path()).unwrap();
    holger.instantiate_backends().unwrap();
    wire_holger(&mut holger).unwrap();

    // Route table should be built
    let ep = &holger.exposed_endpoints[0];
    assert!(ep.aggregated_routes.is_some());
}

#[test]
fn test_rust_api_fetch() {
    let mut f = NamedTempFile::new().unwrap();
    f.write_all(MINIMAL_CONFIG.as_bytes()).unwrap();

    let mut holger = read_ron_config(f.path()).unwrap();
    holger.instantiate_backends().unwrap();
    wire_holger(&mut holger).unwrap();

    // Fetch non-existent artifact returns None
    let id = holger_traits::ArtifactId {
        namespace: None,
        name: "nonexistent".into(),
        version: "0.0.0".into(),
    };
    let result = holger.fetch("rust-test", &id).unwrap();
    assert!(result.is_none());
}

#[test]
fn test_list_repositories() {
    let mut f = NamedTempFile::new().unwrap();
    f.write_all(MINIMAL_CONFIG.as_bytes()).unwrap();

    let mut holger = read_ron_config(f.path()).unwrap();
    holger.instantiate_backends().unwrap();
    wire_holger(&mut holger).unwrap();

    let repos = holger.list_repositories();
    assert_eq!(repos, vec!["rust-test"]);
}

#[test]
fn test_fetch_unknown_repo_errors() {
    let mut f = NamedTempFile::new().unwrap();
    f.write_all(MINIMAL_CONFIG.as_bytes()).unwrap();

    let mut holger = read_ron_config(f.path()).unwrap();
    holger.instantiate_backends().unwrap();
    wire_holger(&mut holger).unwrap();

    let id = holger_traits::ArtifactId {
        namespace: None,
        name: "x".into(),
        version: "1".into(),
    };
    assert!(holger.fetch("nonexistent-repo", &id).is_err());
}

#[test]
fn test_maven_config() {
    let config = r#"(
        repositories: [
            (
                ron_name: "maven-prod",
                ron_repo_type: "maven3",
                ron_upstreams: [],
                ron_archive_path: Some("/tmp/nonexistent.znippy"),
                ron_in: None,
                ron_out: Some((
                    ron_storage_endpoint: "storage",
                    ron_exposed_endpoint: "grpc-ep",
                )),
            ),
        ],
        exposed_endpoints: [
            (
                ron_name: "grpc-ep",
                ron_url: "0.0.0.0:50051",
            ),
        ],
        storage_endpoints: [
            (
                ron_name: "storage",
                ron_storage_type: "znippy",
                ron_path: "/tmp/holger-maven",
            ),
        ],
    )"#;

    let mut f = NamedTempFile::new().unwrap();
    f.write_all(config.as_bytes()).unwrap();

    let mut holger = read_ron_config(f.path()).unwrap();
    // instantiate_backends will fail because archive doesn't exist
    let result = holger.instantiate_backends();
    assert!(result.is_err());
}