devcontainer-env 0.3.2

Bridge devcontainers and the host environment — run host commands with devcontainer service environments and automatically rewrite container service URLs to host ports
use assert_cmd::cargo::cargo_bin_cmd;
use predicates::prelude::*;
use std::path::{Path, PathBuf};

fn devcontainer_working_dir() -> PathBuf {
    Path::new(env!("CARGO_MANIFEST_DIR"))
        .canonicalize()
        .unwrap()
}

fn devcontainer_env() -> assert_cmd::Command {
    let mut cmd = cargo_bin_cmd!();
    cmd.current_dir(devcontainer_working_dir());
    cmd
}

#[test]
fn inspect_default() {
    devcontainer_env()
        .args(["inspect"])
        .assert()
        .success()
        .stdout(predicate::str::contains("No running devcontainers found"));
}

#[test]
fn inspect_with_workspace_folder() {
    let workspace = devcontainer_working_dir();
    cargo_bin_cmd!()
        .args([
            "inspect",
            "--workspace-folder",
            workspace.to_str().unwrap(),
            "--config",
            workspace
                .join(".devcontainer/devcontainer.json")
                .to_str()
                .unwrap(),
        ])
        .assert()
        .success()
        .stdout(predicate::str::contains("No running devcontainers found"));
}

#[test]
fn inspect_fails_when_config_missing() {
    let tmp = std::env::temp_dir();
    cargo_bin_cmd!()
        .current_dir(tmp)
        .args(["inspect"])
        .assert()
        .failure()
        .stderr(predicate::str::contains("No such file or directory"));
}

#[test]
fn export_writes_bash_statements() {
    devcontainer_env()
        .args(["export", "--format", "bash"])
        .assert()
        .success();
}

#[test]
fn export_writes_json_object() {
    devcontainer_env()
        .args(["export", "--format", "json"])
        .assert()
        .success();
}

#[test]
fn exec_runs_command_with_env() {
    devcontainer_env()
        .args(["exec", "true"])
        .assert()
        .success();
}

#[test]
fn exec_fails_when_command_exits_nonzero() {
    devcontainer_env()
        .args(["exec", "sh", "-c", "exit 1"])
        .assert()
        .failure()
        .stderr(predicate::str::contains("command exited with status"));
}

#[test]
fn exec_fails_when_command_not_found() {
    devcontainer_env()
        .args(["exec", "non-existent-command-12345"])
        .assert()
        .failure()
        .stderr(predicate::str::contains("No such file or directory"));
}