dkregistry 0.5.0

A pure-Rust asynchronous library for Docker Registry API
Documentation
extern crate spectral;

use dkregistry::reference::Reference;
use spectral::prelude::*;
use std::str::FromStr;

#[test]
fn valid_references() {
    struct Tcase<'a> {
        input: &'a str,
        expected_repo: &'a str,
        expected_registry: &'a str,
    };

    impl<'a> Default for Tcase<'a> {
        fn default() -> Tcase<'a> {
            Tcase {
                input: "",
                expected_repo: "library/busybox",
                expected_registry: dkregistry::reference::DEFAULT_REGISTRY,
            }
        }
    }

    for t in &[
        Tcase {
            input: "library/busybox",
            ..Default::default()
        },
        Tcase {
            input: "busybox",
            ..Default::default()
        },
        Tcase {
            input: "busybox:tag",
            ..Default::default()
        },
        Tcase {
            input: "busybox:5000",
            ..Default::default()
        },
        Tcase {
            input:
                "busybox@sha256:ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
            ..Default::default()
        },
        Tcase {
            input: "quay.io/library/busybox",
            expected_registry: "quay.io",
            ..Default::default()
        },
        Tcase {
            input: "quay.io:5000/library/busybox",
            expected_registry: "quay.io:5000",
            ..Default::default()
        },
        Tcase {
            input: "1.2.3.4/library/busybox:5000",
            expected_registry: "1.2.3.4",
            ..Default::default()
        },
        Tcase {
            input: "1.2.3.4:5000/library/busybox:5000",
            expected_registry: "1.2.3.4:5000",
            ..Default::default()
        },
        Tcase {
            input: "quay.io/busybox",
            expected_registry: "quay.io",
            expected_repo: "busybox",
        },
        Tcase {
            input: "1.2.3.4/busybox:5000",
            expected_registry: "1.2.3.4",
            expected_repo: "busybox",
        },
    ] {
        let r = Reference::from_str(t.input);
        asserting(t.input).that(&r).is_ok();
        let r = r.unwrap();

        asserting(t.input)
            .that(&r.repository().as_str())
            .is_equal_to(t.expected_repo);

        asserting(t.input)
            .that(&r.registry().as_str())
            .is_equal_to(t.expected_registry);
    }
}

#[test]
fn invalid_references() {
    let tcases = vec!["".into(), "L".repeat(128), ":justatag".into()];

    for t in tcases.iter() {
        let r = Reference::from_str(t);
        asserting(t).that(&r).is_err();
    }
}

#[test]
fn hostname_without_namespace() {
    let dkr_ref = Reference::from_str(
        "sat-r220-02.lab.eng.rdu2.redhat.com:5000/default_organization-custom-ocp",
    )
    .unwrap();

    assert_eq!(
        dkr_ref.registry(),
        "sat-r220-02.lab.eng.rdu2.redhat.com:5000"
    );
    assert_eq!(dkr_ref.repository(), "default_organization-custom-ocp");
    assert_eq!(dkr_ref.version(), "latest");
}

#[test]
fn dns_registry_and_library_with_tag() -> Result<(), Box<dyn std::error::Error>> {
    let dkr_ref = Reference::from_str("quay.io/steveej/cincinnati-test-labels:0.0.0")?;

    assert_eq!(dkr_ref.registry(), "quay.io");
    assert_eq!(dkr_ref.repository(), "steveej/cincinnati-test-labels");

    Ok(())
}

#[test]
fn ipv4_registry_and_library_with_tag() -> Result<(), Box<dyn std::error::Error>> {
    let dkr_ref = Reference::from_str("1.2.3.4/steveej/cincinnati-test-labels:0.0.0")?;

    assert_eq!(dkr_ref.registry(), "1.2.3.4");
    assert_eq!(dkr_ref.repository(), "steveej/cincinnati-test-labels");

    Ok(())
}