#!/usr/bin/env bats # Tests for scripts/install.sh (REQ-098: fallback walk + --check dry-run). # Hermetic: tests the argument parsing, arch detection, and --check # output formatting without hitting the Gitea API. The network-dependent # fallback walk is tested via a mock curl in a separate test. load test_helper @test "install.sh --help exits 0 and shows usage" { run "$SCRIPTS_DIR/install.sh" --help assert_status 0 "$status" assert_contains "$output" "--system" assert_contains "$output" "--version" assert_contains "$output" "--check" assert_contains "$output" "--help" } @test "install.sh --check flag is parsed without error" { # --check with a pinned version that exists (v0.4.5) should succeed # and print the dry-run block. This is a live integration test against # the public Gitea API; skip if network is unavailable. skip_if_no_network run "$SCRIPTS_DIR/install.sh" --check --version v0.4.5 assert_status 0 "$status" assert_contains "$output" "dry-run (--check)" assert_contains "$output" "would install: orca v0.4.5" assert_contains "$output" "no files will be written" } @test "install.sh --check falls back when latest release has no asset" { # v0.9.0 is a pre-execution release with no binary asset. --check # should walk back and find v0.4.5 (which has an asset), printing # a warning. This is a live integration test; skip if no network. skip_if_no_network run timeout 60 "$SCRIPTS_DIR/install.sh" --check --version v0.9.0 assert_status 0 "$status" assert_contains "$output" "WARNING" assert_contains "$output" "falling back" assert_contains "$output" "dry-run (--check)" } @test "install.sh rejects unknown arguments" { run "$SCRIPTS_DIR/install.sh" --bogus-flag [ "$status" -ne 0 ] assert_contains "$output" "unknown argument" } @test "install.sh --system requires root" { # Only test the root check if we're NOT root (CI may run as root). if [ "$(id -u)" -eq 0 ]; then skip "running as root; --system root check not testable" fi run "$SCRIPTS_DIR/install.sh" --system --version v0.4.5 --check [ "$status" -ne 0 ] assert_contains "$output" "--system requires root" } # Helper: skip if the Gitea instance is unreachable. skip_if_no_network() { curl -fsSL --max-time 5 "https://git.cloudinit.dev/api/v1/repos/coreci/orca/releases/tags/v0.4.5" >/dev/null 2>&1 \ || skip "Gitea API unreachable — network-dependent test skipped" }