Menu
Public repository / d7eb6622a4697643ecf906b39e64b71c72e8a69b
AkurAI-EC2 / tests/test_manifest_helper.sh
Latest change d7eb6622a4697643ecf906b39e64b71c72e8a69b - fix: harden v2 manifest install and parsing by Claude Code
#!/usr/bin/env bash
set -euo pipefail
ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
CLI="$ROOT/bin/akurai-ec2"
HELPER="$ROOT/libexec/akurai-ec2-manifest.py"
FIXTURES="$ROOT/tests/fixtures"
TMPDIR="$(mktemp -d)"
trap 'rm -rf "$TMPDIR"' EXIT
check_helper() {
local name="$1"
local out="$TMPDIR/$name.tsv"
python3 "$HELPER" "$FIXTURES/$name.toml" > "$out"
diff -u "$FIXTURES/$name.expected.tsv" "$out"
}
make_app_fixture() {
local name="$1"
local version="$2"
local dest="$TMPDIR/$name-app"
mkdir -p "$dest"
cp "$FIXTURES/$name.toml" "$dest/akurai-deploy.toml"
printf '%s\n' "$version" > "$dest/VERSION"
printf '%s\n' "$dest"
}
check_release_dry_run() {
local name="$1"
local version="$2"
local expect_release="$3"
local expect_action="$4"
local appdir out
shift 4
appdir="$(make_app_fixture "$name" "$version")"
out="$TMPDIR/$name.release.out"
"$CLI" release --dry-run -C "$appdir" > "$out" 2>&1
grep -F "$expect_release" "$out" >/dev/null
grep -F "$expect_action" "$out" >/dev/null
for expected in "$@"; do
grep -F "$expected" "$out" >/dev/null
done
}
check_release_failure() {
local name="$1"
local version="$2"
local appdir out status
shift 2
appdir="$(make_app_fixture "$name" "$version")"
out="$TMPDIR/$name.release.err"
set +e
"$CLI" release --dry-run -C "$appdir" > "$out" 2>&1
status=$?
set -e
[ "$status" -ne 0 ]
for expected in "$@"; do
grep -F "$expected" "$out" >/dev/null
done
if grep -F "[dry-run] would: deploy-binary" "$out" >/dev/null; then
printf 'unexpected deploy preview for failed manifest: %s\n' "$name" >&2
return 1
fi
}
check_copy_install() {
local prefix="$TMPDIR/copy-prefix"
local target="$prefix/bin/akurai-ec2"
local helper="$prefix/libexec/akurai-ec2-manifest.py"
local appdir out
AKURAI_EC2_INSTALL_TARGET="$target" "$ROOT/install.sh" --copy > "$TMPDIR/install-copy.out" 2>&1
[ -x "$target" ]
[ -x "$helper" ]
appdir="$(make_app_fixture "v2-framework" "2.3.4")"
out="$TMPDIR/install-copy.release.out"
"$target" release --dry-run -C "$appdir" > "$out" 2>&1
grep -F "release: framework-site" "$out" >/dev/null
grep -F "[dry-run] would: deploy-binary framework-site target/x86_64-unknown-linux-musl/release/framework-site 8112 ." "$out" >/dev/null
}
check_space_array_publish() {
local fakebin="$TMPDIR/fakebin"
local log="$TMPDIR/fake-remote.log"
local appdir out
mkdir -p "$fakebin"
ln -s "$CLI" "$fakebin/akurai-ec2"
cat > "$fakebin/ssh" <<'EOF'
#!/usr/bin/env bash
set -euo pipefail
log="${AKURAI_FAKE_REMOTE_LOG:?}"
cmd="${*: -1}"
printf 'ssh\t%s\n' "$cmd" >> "$log"
cat >/dev/null || true
if [[ "$cmd" == *"curl -s -o /dev/null -w '%{http_code}'"* ]]; then
printf '200\n'
fi
EOF
cat > "$fakebin/scp" <<'EOF'
#!/usr/bin/env bash
set -euo pipefail
log="${AKURAI_FAKE_REMOTE_LOG:?}"
printf 'scp\t%s\n' "${*: -1}" >> "$log"
EOF
chmod 755 "$fakebin/ssh" "$fakebin/scp"
appdir="$(make_app_fixture "v2-space-array" "0.0.1")"
out="$TMPDIR/v2-space-array.publish.out"
AKURAI_FAKE_REMOTE_LOG="$log" PATH="$fakebin:$PATH" AKURAI_EC2_SSH="fake-remote" \
"$CLI" release publish -C "$appdir" > "$out" 2>&1
grep -F "publish: space-array" "$out" >/dev/null
grep -F "sudo mkdir -p '/srv/space dir' && sudo chown spacey:spacey '/srv/space dir'" "$log" >/dev/null
grep -F "sudo mkdir -p '/srv/plain' && sudo chown spacey:spacey '/srv/plain'" "$log" >/dev/null
[ "$(grep -c "^ssh sudo mkdir -p '/srv/" "$log")" -eq 2 ]
}
bash -n "$CLI"
check_helper "v1-flat"
check_helper "v2-rust"
check_helper "v2-framework"
check_helper "v2-space-array"
check_release_dry_run \
"v1-flat" \
"0.1.2" \
"release: akurai-vpn" \
"[dry-run] would: deploy-binary akurai-vpn target/x86_64-unknown-linux-musl/release/akurai-vpn 8098 ." \
"release (dry-run): akurai-vpn → v0.1.3"
check_release_dry_run \
"v2-rust" \
"1.4.9" \
"release: akurai-rust" \
"[dry-run] would: deploy-binary akurai-rust target/x86_64-unknown-linux-musl/release/akurai-rust 8104 ." \
"[dry-run] would: nginx-proxy rust.akurai.test 8104; tls rust.akurai.test"
check_release_dry_run \
"v2-framework" \
"2.3.4" \
"release: framework-site" \
"[dry-run] would: deploy-binary framework-site target/x86_64-unknown-linux-musl/release/framework-site 8112 ." \
"data='[\"/opt/framework-site/cache\",\"/opt/framework-site/uploads\"]'" \
"[dry-run] nginx: leaving existing site.akurai.test vhost untouched (manage_nginx=false)"
check_release_failure \
"v2-helper-error" \
"0.0.1" \
"error: nested arrays or inline tables are not supported" \
"manifest helper failed: akurai-deploy.toml"
check_copy_install
check_space_array_publish
grep -F "publish: framework-site" "$TMPDIR/v2-framework.release.out" >/dev/null