greentic-deploy-spec 0.2.0

Greentic deployment object-model schemas (Environment, Revision, TrafficSplit, BundleDeployment, Credentials, PackConfig, RuntimeConfig)
Documentation
use greentic_deploy_spec::{PackDescriptor, PackDescriptorParseError};

#[test]
fn parses_canonical_descriptor() {
    let d = PackDescriptor::try_new("greentic.deployer.k8s@1.0.0").unwrap();
    assert_eq!(d.path(), "greentic.deployer.k8s");
    assert_eq!(d.version().to_string(), "1.0.0");
    assert_eq!(d.as_str(), "greentic.deployer.k8s@1.0.0");
}

#[test]
fn parses_three_part_path() {
    let d = PackDescriptor::try_new("greentic.secrets.dev-store@0.5.12").unwrap();
    assert_eq!(d.path(), "greentic.secrets.dev-store");
    assert_eq!(d.version().to_string(), "0.5.12");
}

#[test]
fn rejects_missing_version() {
    let err = PackDescriptor::try_new("greentic.deployer.k8s").unwrap_err();
    assert_eq!(err, PackDescriptorParseError::MissingVersion);
}

#[test]
fn rejects_empty_path() {
    let err = PackDescriptor::try_new("@1.0.0").unwrap_err();
    assert_eq!(err, PackDescriptorParseError::EmptyPath);
}

#[test]
fn rejects_path_without_dot() {
    let err = PackDescriptor::try_new("deployer@1.0.0").unwrap_err();
    assert_eq!(err, PackDescriptorParseError::PathMissingDot);
}

#[test]
fn rejects_uppercase_path() {
    let err = PackDescriptor::try_new("greentic.Deployer.k8s@1.0.0").unwrap_err();
    assert_eq!(err, PackDescriptorParseError::InvalidPathChar('D'));
}

#[test]
fn rejects_multiple_at() {
    let err = PackDescriptor::try_new("a.b@1.0.0@extra").unwrap_err();
    assert!(matches!(err, PackDescriptorParseError::InvalidSemver(_)));
}

#[test]
fn rejects_invalid_semver() {
    let err = PackDescriptor::try_new("a.b@not-a-version").unwrap_err();
    assert!(matches!(err, PackDescriptorParseError::InvalidSemver(_)));
}

#[test]
fn round_trips_through_json() {
    let d = PackDescriptor::try_new("greentic.telemetry.stdout@0.5.0").unwrap();
    let json = serde_json::to_string(&d).unwrap();
    assert_eq!(json, "\"greentic.telemetry.stdout@0.5.0\"");
    let back: PackDescriptor = serde_json::from_str(&json).unwrap();
    assert_eq!(back, d);
}