docker-command 5.0.1

Library for creating Docker commands
Documentation
use docker_command::*;
use std::path::{Path, PathBuf};

fn new_path(s: &str) -> PathBuf {
    Path::new(s).into()
}

#[test]
fn test_is_program() {
    assert!(Launcher::from(BaseCommand::Docker).is_docker());
    assert!(Launcher::from(BaseCommand::SudoDocker).is_docker());
    assert!(!Launcher::from(BaseCommand::Podman).is_docker());
    assert!(Launcher::from(BaseCommand::Podman).is_podman());
}

#[test]
fn test_build() {
    assert_eq!(
        Launcher::from(BaseCommand::Docker)
            .build(BuildOpt {
                build_args: vec![("barg1".into(), "bval1".into()),
                                 ("barg2".into(), "bval2".into())],
                context: new_path("/myContext"),
                dockerfile: Some(new_path("/myContext/myDockerfile")),
                iidfile: Some(new_path("/myIidfile")),
                no_cache: true,
                pull: true,
                quiet: true,
                tag: Some("myTag".into()),
            })
            .command_line_lossy(),
        "docker build --build-arg barg1=bval1 --build-arg barg2=bval2 --file /myContext/myDockerfile --iidfile /myIidfile --no-cache --pull --quiet --tag myTag /myContext"
    );
}

#[test]
fn test_create_network() {
    assert_eq!(
        Launcher::from(BaseCommand::Docker)
            .create_network(CreateNetworkOpt {
                name: "myNetwork".into(),
            })
            .command_line_lossy(),
        "docker network create myNetwork"
    );
}

#[test]
fn test_remove_network() {
    assert_eq!(
        Launcher::from(BaseCommand::Docker)
            .remove_network("myNetwork".into())
            .command_line_lossy(),
        "docker network rm myNetwork"
    );
}

#[test]
fn test_user() {
    let mut user = UserAndGroup {
        user: NameOrId::Name("myUser".into()),
        group: None,
    };
    assert_eq!(user.arg(), "myUser");

    user.group = Some(NameOrId::Name("myGroup".into()));
    assert_eq!(user.arg(), "myUser:myGroup");

    user.user = NameOrId::Id(1000);
    assert_eq!(user.arg(), "1000:myGroup");
}

#[test]
fn test_run() {
    assert_eq!(
        Launcher::from(BaseCommand::Docker)
            .run(RunOpt {
                image: "myImage".into(),
                detach: true,
                env: vec![("key1".into(), "val1".into()),
                          ("key2".into(), "val2".into())],
                init: true,
                interactive: true,
                name: Some("myName".into()),
                network: Some("myNetwork".into()),
                publish: vec![PublishPorts {
                    ip: Some("1.2.3.4".into()),
                    container: 5678.into(),
                    host: Some(987.into()),
                }, PublishPorts {
                    ip: Some("1.2.3.4".into()),
                    container: 5678.into(),
                    host: None,
                }, PublishPorts {
                    ip: None,
                    container: 5678.into(),
                    host: Some(987.into()),
                }, PublishPorts {
                    container: 5678.into(),
                    ..Default::default()
                }],
                read_only: true,
                remove: true,
                tty: true,
                user: Some(UserAndGroup {
                    user: NameOrId::Name("myUser".into()),
                    group: Some(NameOrId::Name("myGroup".into())),
                }),
                volumes: vec![
                    // Read-write volume
                    Volume {
                        src: new_path("/mySrc"),
                        dst: new_path("/myDst"),
                        read_write: true,
                        ..Default::default()
                    },
                    // Read-only volume with extra options
                    Volume {
                        src: new_path("/mySrc"),
                        dst: new_path("/myDst"),
                        options: vec!["cached".into(), "z".into()],
                        ..Default::default()
                    }
                ],
                command: Some(Path::new("myCmd").into()),
                args: vec!["arg1".into(), "arg2".into()],
            })
            .command_line_lossy(),
        "docker run --detach --env key1=val1 --env key2=val2 --init --interactive --name myName --network myNetwork --publish 1.2.3.4:987:5678 --publish 1.2.3.4::5678 --publish 987:5678 --publish 5678 --read-only --rm --tty --user myUser:myGroup --volume /mySrc:/myDst:rw --volume /mySrc:/myDst:ro,cached,z myImage myCmd arg1 arg2"
    );
}

#[test]
fn test_stop() {
    assert_eq!(
        Launcher::from(BaseCommand::Docker)
            .stop(StopOpt {
                containers: vec!["abc".into(), "def".into()],
                time: Some(123),
            })
            .command_line_lossy(),
        "docker stop --time 123 abc def"
    );
}

/// Test that tests/example.rs is faithfully reproduced in the readme.
#[test]
fn test_readme_example() {
    let source = include_str!("../tests/example.rs");

    // Extract the example code between two comments and de-indent
    let mut example = Vec::new();
    let mut copy = false;
    for line in source.lines() {
        if line.contains("Begin readme example") {
            copy = true;
        } else if line.contains("End readme example") {
            break;
        } else if copy {
            // De-indent
            let line = &line[4..];
            example.push(line);
        }
    }
    let example = example.join("\n");

    let readme = include_str!("../README.md");
    assert!(readme.contains(&example));
}