greentic-distributor-dev 1.1.1

Dev-only distributor source that serves packs and components from the local filesystem.
Documentation
use std::fs;

use greentic_distributor_client::{
    ComponentId, DistributorError, DistributorSource, PackId, Version,
};
use greentic_distributor_dev::{DevConfig, DevDistributorSource, DevLayout};
use tempfile::tempdir;

#[test]
fn fetches_from_flat_layout() {
    let root = tempdir().unwrap();
    let packs_dir = root.path().join("packs");
    let components_dir = root.path().join("components");
    fs::create_dir_all(&packs_dir).unwrap();
    fs::create_dir_all(&components_dir).unwrap();

    let pack_id = PackId::try_from("dev.local.hello-flow").unwrap();
    let component_id = ComponentId::try_from("dev.greentic.echo").unwrap();
    let version = Version::parse("0.1.0").unwrap();

    fs::write(
        packs_dir.join("dev.local.hello-flow-0.1.0.gtpack"),
        b"pack-bytes",
    )
    .unwrap();
    fs::write(
        components_dir.join("dev.greentic.echo-0.1.0.wasm"),
        b"component-bytes",
    )
    .unwrap();

    let cfg = DevConfig {
        root_dir: root.path().to_path_buf(),
        ..Default::default()
    };
    let source = DevDistributorSource::new(cfg);

    let pack_bytes = source.fetch_pack(&pack_id, &version).unwrap();
    assert_eq!(pack_bytes, b"pack-bytes");

    let component_bytes = source.fetch_component(&component_id, &version).unwrap();
    assert_eq!(component_bytes, b"component-bytes");
}

#[test]
fn fetches_from_nested_layout() {
    let root = tempdir().unwrap();
    let pack_id = PackId::try_from("dev.local.hello-flow").unwrap();
    let component_id = ComponentId::try_from("dev.greentic.echo").unwrap();
    let version = Version::parse("0.1.0").unwrap();

    let pack_path = root
        .path()
        .join("packs")
        .join(pack_id.as_str())
        .join(version.to_string());
    let component_path = root
        .path()
        .join("components")
        .join(component_id.as_str())
        .join(version.to_string());
    fs::create_dir_all(&pack_path).unwrap();
    fs::create_dir_all(&component_path).unwrap();
    fs::write(pack_path.join("pack.gtpack"), b"pack-nested").unwrap();
    fs::write(component_path.join("component.wasm"), b"component-nested").unwrap();

    let cfg = DevConfig {
        root_dir: root.path().to_path_buf(),
        layout: DevLayout::ByIdAndVersion,
        ..Default::default()
    };
    let source = DevDistributorSource::new(cfg);

    let pack_bytes = source.fetch_pack(&pack_id, &version).unwrap();
    assert_eq!(pack_bytes, b"pack-nested");

    let component_bytes = source.fetch_component(&component_id, &version).unwrap();
    assert_eq!(component_bytes, b"component-nested");
}

#[test]
fn returns_not_found_when_missing() {
    let root = tempdir().unwrap();
    fs::create_dir_all(root.path().join("packs")).unwrap();
    fs::create_dir_all(root.path().join("components")).unwrap();

    let cfg = DevConfig {
        root_dir: root.path().to_path_buf(),
        ..Default::default()
    };
    let source = DevDistributorSource::new(cfg);
    let pack_id = PackId::try_from("dev.missing").unwrap();
    let version = Version::parse("0.1.0").unwrap();

    let err = source.fetch_pack(&pack_id, &version).unwrap_err();
    assert!(matches!(err, DistributorError::NotFound));
}