frappe_docker/tests/easy-docker/10_cli_smoke.bats

106 lines
3.4 KiB
Bash
Executable file

#!/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:"* ]]
}