#!/usr/bin/env bats # ----------------------------------------------------------------------------- # Unit tests for hack/select-e2e.sh # # cozytest.sh's awk parser recognizes only @test blocks and a bare `}` on its # own line; there is no bats `run` or `$status`. Each test runs as a shell # function under `set -eu -x`, so assertions are direct shell tests that exit # non-zero on failure. setup()/teardown() are not honored — each test creates # and cleans its own scratch dir. # # Run with: hack/cozytest.sh hack/select-e2e_test.bats # ----------------------------------------------------------------------------- @test "single app diff selects only that suite" { tmp=$(mktemp -d) trap 'rm -rf "$tmp"' EXIT cp -r packages/core/platform/sources "$tmp/sources" echo "packages/apps/postgres/values.yaml" > "$tmp/diff" output=$(hack/select-e2e.sh "$tmp/diff" "$tmp/sources") [ "$output" = "postgres" ] } @test "operator diff selects all dependent app suites" { # postgres-operator is depended on by postgres-application, harbor-application # (Harbor uses postgres as its backing DB), and monitoring-application (Grafana # DB). monitoring has no chainsaw suite so it's filtered out by the selector. tmp=$(mktemp -d) trap 'rm -rf "$tmp"' EXIT cp -r packages/core/platform/sources "$tmp/sources" echo "packages/system/postgres-operator/values.yaml" > "$tmp/diff" output=$(hack/select-e2e.sh "$tmp/diff" "$tmp/sources") echo "$output" | grep -wq postgres echo "$output" | grep -wq harbor if echo "$output" | grep -wq kafka; then echo "operator diff must not trigger full suite; got: $output" >&2 exit 1 fi } @test "engine-dependency change does not fan out via the ordering edge" { # cert-manager is a dependency of cozystack-engine, and every app declares # dependsOn cozystack-engine purely as an INSTALL-ORDERING edge (the app's # *-rd HelmRelease waits for the ApplicationDefinition CRD). That edge must # not propagate test selection: a cert-manager change selects only its # genuine direct dependents (postgres, harbor, ...), never unrelated apps # like kafka that reach cert-manager solely through the engine. tmp=$(mktemp -d) trap 'rm -rf "$tmp"' EXIT cp -r packages/core/platform/sources "$tmp/sources" echo "packages/system/cert-manager/values.yaml" > "$tmp/diff" output=$(hack/select-e2e.sh "$tmp/diff" "$tmp/sources") echo "$output" | grep -wq postgres echo "$output" | grep -wq harbor if echo "$output" | grep -wq kafka; then echo "cert-manager change must not fan out via engine; got: $output" >&2 exit 1 fi } @test "networking change triggers full suite" { tmp=$(mktemp -d) trap 'rm -rf "$tmp"' EXIT cp -r packages/core/platform/sources "$tmp/sources" echo "packages/system/cilium/values.yaml" > "$tmp/diff" output=$(hack/select-e2e.sh "$tmp/diff" "$tmp/sources") # Full suite means more than 5 suites [ "$(echo "$output" | wc -w)" -gt 5 ] } @test "library change triggers full suite" { tmp=$(mktemp -d) trap 'rm -rf "$tmp"' EXIT cp -r packages/core/platform/sources "$tmp/sources" echo "packages/library/cozy-lib/templates/_helpers.tpl" > "$tmp/diff" output=$(hack/select-e2e.sh "$tmp/diff" "$tmp/sources") [ "$(echo "$output" | wc -w)" -gt 5 ] } @test "docs-only diff selects nothing" { tmp=$(mktemp -d) trap 'rm -rf "$tmp"' EXIT cp -r packages/core/platform/sources "$tmp/sources" echo "docs/README.md" > "$tmp/diff" output=$(hack/select-e2e.sh "$tmp/diff" "$tmp/sources") [ -z "$output" ] } @test "kubernetes-application maps to the four kubernetes suites" { tmp=$(mktemp -d) trap 'rm -rf "$tmp"' EXIT cp -r packages/core/platform/sources "$tmp/sources" echo "packages/apps/kubernetes/values.yaml" > "$tmp/diff" output=$(hack/select-e2e.sh "$tmp/diff" "$tmp/sources") echo "$output" | grep -q "kubernetes-latest" echo "$output" | grep -q "kubernetes-previous" # The OIDC render-side suites exercise the same kubernetes app chart, so a # chart-only change must select them too. echo "$output" | grep -q "kubernetes-oidc-system" echo "$output" | grep -q "kubernetes-oidc-customconfig" } @test "dashboards-only diff selects nothing (path is plural)" { tmp=$(mktemp -d) trap 'rm -rf "$tmp"' EXIT cp -r packages/core/platform/sources "$tmp/sources" echo "dashboards/gpu/gpu-fleet.json" > "$tmp/diff" output=$(hack/select-e2e.sh "$tmp/diff" "$tmp/sources") [ -z "$output" ] } @test "shared E2E helper script triggers full suite" { tmp=$(mktemp -d) trap 'rm -rf "$tmp"' EXIT cp -r packages/core/platform/sources "$tmp/sources" echo "hack/e2e-chainsaw/_lib/run-kubernetes.sh" > "$tmp/diff" output=$(hack/select-e2e.sh "$tmp/diff" "$tmp/sources") [ "$(echo "$output" | wc -w)" -gt 5 ] } @test "chainsaw config change triggers full suite" { tmp=$(mktemp -d) trap 'rm -rf "$tmp"' EXIT cp -r packages/core/platform/sources "$tmp/sources" echo "hack/e2e-chainsaw/.chainsaw.yaml" > "$tmp/diff" output=$(hack/select-e2e.sh "$tmp/diff" "$tmp/sources") [ "$(echo "$output" | wc -w)" -gt 5 ] } @test "install bats triggers full suite" { tmp=$(mktemp -d) trap 'rm -rf "$tmp"' EXIT cp -r packages/core/platform/sources "$tmp/sources" echo "hack/e2e-install-cozystack.bats" > "$tmp/diff" output=$(hack/select-e2e.sh "$tmp/diff" "$tmp/sources") [ "$(echo "$output" | wc -w)" -gt 5 ] } @test "per-suite edit selects only that suite, never escalates" { tmp=$(mktemp -d) trap 'rm -rf "$tmp"' EXIT cp -r packages/core/platform/sources "$tmp/sources" echo "hack/e2e-chainsaw/redis/chainsaw-test.yaml" > "$tmp/diff" output=$(hack/select-e2e.sh "$tmp/diff" "$tmp/sources") [ "$output" = "redis" ] } @test "pull-requests workflow change triggers full suite" { tmp=$(mktemp -d) trap 'rm -rf "$tmp"' EXIT cp -r packages/core/platform/sources "$tmp/sources" echo ".github/workflows/pull-requests.yaml" > "$tmp/diff" output=$(hack/select-e2e.sh "$tmp/diff" "$tmp/sources") [ "$(echo "$output" | wc -w)" -gt 5 ] } @test "backup example harness edit selects its app suite" { tmp=$(mktemp -d) trap 'rm -rf "$tmp"' EXIT cp -r packages/core/platform/sources "$tmp/sources" echo "examples/backups/postgres/run-all.sh" > "$tmp/diff" output=$(hack/select-e2e.sh "$tmp/diff" "$tmp/sources") [ "$output" = "postgres" ] } @test "backup example without a matching suite selects nothing" { tmp=$(mktemp -d) trap 'rm -rf "$tmp"' EXIT cp -r packages/core/platform/sources "$tmp/sources" echo "examples/backups/no-such-app/run.sh" > "$tmp/diff" output=$(hack/select-e2e.sh "$tmp/diff" "$tmp/sources") || true [ -z "$output" ] }