#!/usr/bin/env bash
# Smoke-test the interactive console REPL end-to-end: prompt format,
# stateful cd / home / return / `infinito` jump, relative-then-absolute
# command resolve, and executable-leaf-runs-instead-of-cd. Runs `python
# -m cli.console` with a scripted stdin and asserts the prompt sequence
# the REPL produced.
set -euo pipefail

SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
# shellcheck source=scripts/tests/workspace/utils/common.sh
source "${SCRIPT_DIR}/../utils/common.sh"

cd "${REPO_ROOT}"

log_file="$(mktemp -t infinito-console-smoke.XXXXXX)"
trap 'rm -f "${log_file}"' EXIT

printf '%s\n' \
	'ls' \
	'administration' \
	'ls' \
	'infinito meta' \
	'..' \
	'/administration/deploy' \
	'../..' \
	'infinito administration' \
	'../meta' \
	'/' \
	'exit' |
	"${PYTHON}" -m cli.console \
		>"${log_file}" 2>&1 || true # nocheck: shell-or-true -- grandfathered: worked in practice; TODO: sharpen to catch only the exact tolerated error

assert_log_contains() {
	local needle="${1}"
	if ! grep -qF -- "${needle}" "${log_file}"; then
		echo "[FAIL] console output missing: ${needle}" >&2
		echo "--- captured console output ---" >&2
		cat "${log_file}" >&2
		exit 1
	fi
	echo "[OK] console output contains: ${needle}"
}

assert_log_contains "infinito> "
assert_log_contains "infinito administration> "
assert_log_contains "infinito meta> "
assert_log_contains "infinito administration deploy> "
assert_log_contains "🗂️"
assert_log_contains "⚙️"
assert_log_contains "administration"
assert_log_contains "deploy"

echo "Console smoke test passed."
