#!/usr/bin/env bats setup() { ROOT_DIR="$(cd "${BATS_TEST_DIRNAME}/../.." && pwd)" MAIN_SCRIPT="${ROOT_DIR}/scripts/easy-docker/main.sh" SYSTEM_BASH="$(command -v bash)" SYSTEM_CAT="$(command -v cat)" SYSTEM_CHMOD="$(command -v chmod)" SYSTEM_DIRNAME="$(command -v dirname)" SYSTEM_ENV="$(command -v env)" SYSTEM_MKDIR="$(command -v mkdir)" SYSTEM_MKTEMP="$(command -v mktemp)" SYSTEM_RM="$(command -v rm)" TEST_TMPDIR="$("${SYSTEM_MKTEMP}" -d)" STUB_BIN="${TEST_TMPDIR}/bin" "${SYSTEM_MKDIR}" -p "${STUB_BIN}" write_passthrough_stub cat "${SYSTEM_CAT}" write_passthrough_stub dirname "${SYSTEM_DIRNAME}" } teardown() { if [ -n "${TEST_TMPDIR:-}" ] && [ -d "${TEST_TMPDIR}" ]; then "${SYSTEM_RM}" -rf "${TEST_TMPDIR}" fi } write_stub() { local name="$1" shift { printf '#!%s\n' "${SYSTEM_BASH}" printf '%s\n' "$@" } >"${STUB_BIN}/${name}" "${SYSTEM_CHMOD}" +x "${STUB_BIN}/${name}" } write_passthrough_stub() { local name="$1" local target="$2" { printf '#!%s\n' "${SYSTEM_BASH}" printf 'exec "%s" "$@"\n' "${target}" } >"${STUB_BIN}/${name}" "${SYSTEM_CHMOD}" +x "${STUB_BIN}/${name}" } @test "help prints usage and exits cleanly" { run "${SYSTEM_ENV}" "PATH=${STUB_BIN}" "${SYSTEM_BASH}" "${MAIN_SCRIPT}" --help [ "${status}" -eq 0 ] [[ "${output}" == *"Usage: bash easy-docker.sh [options]"* ]] [[ "${output}" == *"--no-installation-fallback"* ]] } @test "unknown option is rejected before startup" { run "${SYSTEM_ENV}" "PATH=${STUB_BIN}" "${SYSTEM_BASH}" "${MAIN_SCRIPT}" --definitely-unknown [ "${status}" -eq 1 ] [[ "${output}" == *"Unknown option: --definitely-unknown"* ]] [[ "${output}" == *"Usage: bash easy-docker.sh [options]"* ]] } @test "missing gum fails without interactive fallback when disabled" { run "${SYSTEM_ENV}" "PATH=${STUB_BIN}" "${SYSTEM_BASH}" "${MAIN_SCRIPT}" --no-installation-fallback [ "${status}" -eq 1 ] [[ "${output}" == *"gum is not installed. Trying package manager installation..."* ]] [[ "${output}" == *"No supported package manager was found."* ]] [[ "${output}" == *"Installation fallback is disabled."* ]] [[ "${output}" == *"Install gum manually:"* ]] } @test "missing docker stops after gum dependency succeeds" { write_stub gum 'exit 0' run "${SYSTEM_ENV}" "PATH=${STUB_BIN}" "${SYSTEM_BASH}" "${MAIN_SCRIPT}" --no-installation-fallback [ "${status}" -eq 1 ] [[ "${output}" == *"docker is not installed."* ]] [[ "${output}" == *"Install Docker first:"* ]] } @test "missing jq stops after gum and docker dependencies succeed" { write_stub gum 'exit 0' # shellcheck disable=SC2016 write_stub docker \ 'if [ "${1:-}" = "compose" ] && [ "${2:-}" = "version" ]; then exit 0; fi' \ 'if [ "${1:-}" = "info" ]; then exit 0; fi' \ 'case "$*" in' \ ' "ps --help"| "exec --help"| "inspect --help"| "cp --help"| "build --help"| "compose config --help"| "compose up --help"| "compose down --help"| "compose logs --help"| "compose exec --help"| "compose pull --help"| "compose ps --help") exit 0 ;;' \ 'esac' \ 'exit 0' run "${SYSTEM_ENV}" "PATH=${STUB_BIN}" "${SYSTEM_BASH}" "${MAIN_SCRIPT}" --no-installation-fallback [ "${status}" -eq 1 ] [[ "${output}" == *"jq is not installed. Trying package manager installation..."* ]] [[ "${output}" == *"No supported package manager was found."* ]] [[ "${output}" == *"Installation fallback is disabled."* ]] [[ "${output}" == *"Install jq first:"* ]] }