From b3407e4fbcdcf1cb287fe610e1a0b0b14d7b53e8 Mon Sep 17 00:00:00 2001 From: "google-labs-jules[bot]" <161369871+google-labs-jules[bot]@users.noreply.github.com> Date: Sat, 6 Jun 2026 01:57:11 +0000 Subject: [PATCH] Extract test duplicate variables and check function to helper file Refactored `PASS`, `FAIL`, `TOTAL` tracking variables and the `check` function from all 4 test scripts into a unified `test_helper.sh`. Updated test scripts to source this helper, improving maintainability and reducing boilerplate duplication. Co-authored-by: savvides <1580637+savvides@users.noreply.github.com> --- test/integration-test.sh | 15 +-------- test/smoke-test.sh | 15 +-------- test/test-manifest-merge.sh | 45 +++++++++---------------- test/test-version-classifier.sh | 60 ++++++++++++++++----------------- test/test_helper.sh | 16 +++++++++ 5 files changed, 63 insertions(+), 88 deletions(-) create mode 100755 test/test_helper.sh diff --git a/test/integration-test.sh b/test/integration-test.sh index bf45ca7..2dc6a61 100755 --- a/test/integration-test.sh +++ b/test/integration-test.sh @@ -2,25 +2,12 @@ # idstack integration tests — behavioral tests for bin scripts set -e -PASS=0 -FAIL=0 -TOTAL=0 +. "$(dirname "$0")/test_helper.sh" IDSTACK_DIR="$(cd "$(dirname "$0")/.." && pwd)" TEST_DIR=$(mktemp -d) trap "rm -rf $TEST_DIR" EXIT -check() { - TOTAL=$((TOTAL + 1)) - if eval "$2" 2>/dev/null; then - echo " PASS: $1" - PASS=$((PASS + 1)) - else - echo " FAIL: $1" - FAIL=$((FAIL + 1)) - fi -} - echo "idstack integration tests" echo " test dir: $TEST_DIR" echo "" diff --git a/test/smoke-test.sh b/test/smoke-test.sh index b18ec85..9099c09 100755 --- a/test/smoke-test.sh +++ b/test/smoke-test.sh @@ -2,25 +2,12 @@ # idstack smoke test — verifies installation is correct set -e -PASS=0 -FAIL=0 -TOTAL=0 +. "$(dirname "$0")/test_helper.sh" # Verify the repo this script lives in (test/smoke-test.sh -> repo root is ".."). # Override with $1 to point at a different checkout (CI fixtures, etc.). IDSTACK_DIR="${1:-$(cd "$(dirname "$0")/.." && pwd -P)}" -check() { - TOTAL=$((TOTAL + 1)) - if eval "$2" 2>/dev/null; then - echo " PASS: $1" - PASS=$((PASS + 1)) - else - echo " FAIL: $1" - FAIL=$((FAIL + 1)) - fi -} - echo "idstack smoke test" echo " idstack dir: $IDSTACK_DIR" echo "" diff --git a/test/test-manifest-merge.sh b/test/test-manifest-merge.sh index 51206c0..7072c63 100755 --- a/test/test-manifest-merge.sh +++ b/test/test-manifest-merge.sh @@ -4,24 +4,11 @@ set -e -PASS=0 -FAIL=0 -TOTAL=0 +. "$(dirname "$0")/test_helper.sh" REPO_ROOT="$(cd "$(dirname "$0")/.." && pwd)" MERGE="$REPO_ROOT/bin/idstack-manifest-merge" -assert() { - TOTAL=$((TOTAL + 1)) - if eval "$2" >/dev/null 2>&1; then - PASS=$((PASS + 1)) - echo " PASS: $1" - else - FAIL=$((FAIL + 1)) - echo " FAIL: $1" - fi -} - # Skip the suite if python3 is missing (the tool requires python3). if ! command -v python3 >/dev/null 2>&1; then echo "test-manifest-merge: python3 not available, skipping" @@ -58,25 +45,25 @@ echo "" seed_manifest echo '{"confidence_score": 75}' > "$WORK/payload.json" "$MERGE" --section red_team_audit --payload "$WORK/payload.json" --manifest "$WORK/project.json" --quiet -assert "section replaced" \ +check "section replaced" \ "python3 -c 'import json; d=json.load(open(\"$WORK/project.json\")); assert d[\"red_team_audit\"]=={\"confidence_score\": 75}'" # --- Test 2: foreign sections preserved --- -assert "context preserved" "python3 -c 'import json; d=json.load(open(\"$WORK/project.json\")); assert d[\"context\"]=={\"modality\": \"online\"}'" -assert "needs_analysis preserved" "python3 -c 'import json; d=json.load(open(\"$WORK/project.json\")); assert d[\"needs_analysis\"]=={\"existing\": \"data\"}'" +check "context preserved" "python3 -c 'import json; d=json.load(open(\"$WORK/project.json\")); assert d[\"context\"]=={\"modality\": \"online\"}'" +check "needs_analysis preserved" "python3 -c 'import json; d=json.load(open(\"$WORK/project.json\")); assert d[\"needs_analysis\"]=={\"existing\": \"data\"}'" # --- Test 3: top-level fields preserved (project_name, created) --- -assert "project_name preserved" "python3 -c 'import json; d=json.load(open(\"$WORK/project.json\")); assert d[\"project_name\"]==\"test-project\"'" -assert "created preserved" "python3 -c 'import json; d=json.load(open(\"$WORK/project.json\")); assert d[\"created\"]==\"2026-01-01T00:00:00Z\"'" -assert "version preserved" "python3 -c 'import json; d=json.load(open(\"$WORK/project.json\")); assert d[\"version\"]==\"1.4\"'" +check "project_name preserved" "python3 -c 'import json; d=json.load(open(\"$WORK/project.json\")); assert d[\"project_name\"]==\"test-project\"'" +check "created preserved" "python3 -c 'import json; d=json.load(open(\"$WORK/project.json\")); assert d[\"created\"]==\"2026-01-01T00:00:00Z\"'" +check "version preserved" "python3 -c 'import json; d=json.load(open(\"$WORK/project.json\")); assert d[\"version\"]==\"1.4\"'" # --- Test 4: updated timestamp bumped (not equal to seeded value) --- -assert "updated timestamp bumped" "python3 -c 'import json; d=json.load(open(\"$WORK/project.json\")); assert d[\"updated\"]!=\"2026-01-01T00:00:00Z\"'" +check "updated timestamp bumped" "python3 -c 'import json; d=json.load(open(\"$WORK/project.json\")); assert d[\"updated\"]!=\"2026-01-01T00:00:00Z\"'" # --- Test 5: stdin payload --- seed_manifest echo '{"score": 99}' | "$MERGE" --section quality_review --payload - --manifest "$WORK/project.json" --quiet -assert "stdin payload accepted" "python3 -c 'import json; d=json.load(open(\"$WORK/project.json\")); assert d[\"quality_review\"]=={\"score\": 99}'" +check "stdin payload accepted" "python3 -c 'import json; d=json.load(open(\"$WORK/project.json\")); assert d[\"quality_review\"]=={\"score\": 99}'" # --- Test 6: unknown section rejected with exit 3 --- seed_manifest @@ -84,7 +71,7 @@ set +e "$MERGE" --section bogus_section --payload "$WORK/payload.json" --manifest "$WORK/project.json" --quiet 2>/dev/null EC=$? set -e -assert "unknown section exits 3" "[ $EC -eq 3 ]" +check "unknown section exits 3" "[ $EC -eq 3 ]" # --- Test 7: malformed payload rejected with exit 1 --- seed_manifest @@ -93,7 +80,7 @@ set +e "$MERGE" --section red_team_audit --payload "$WORK/bad.json" --manifest "$WORK/project.json" --quiet 2>/dev/null EC=$? set -e -assert "malformed payload exits 1" "[ $EC -eq 1 ]" +check "malformed payload exits 1" "[ $EC -eq 1 ]" # --- Test 8: malformed manifest rejected with exit 2 --- echo 'not json' > "$WORK/project.json" @@ -101,7 +88,7 @@ set +e echo '{}' | "$MERGE" --section red_team_audit --payload - --manifest "$WORK/project.json" --quiet 2>/dev/null EC=$? set -e -assert "malformed manifest exits 2" "[ $EC -eq 2 ]" +check "malformed manifest exits 2" "[ $EC -eq 2 ]" # --- Test 9: missing manifest rejected with exit 4 --- rm -f "$WORK/project.json" @@ -109,7 +96,7 @@ set +e echo '{}' | "$MERGE" --section red_team_audit --payload - --manifest "$WORK/project.json" --quiet 2>/dev/null EC=$? set -e -assert "missing manifest exits 4" "[ $EC -eq 4 ]" +check "missing manifest exits 4" "[ $EC -eq 4 ]" # --- Test 10: missing payload file rejected with exit 5 --- seed_manifest @@ -117,7 +104,7 @@ set +e "$MERGE" --section red_team_audit --payload "$WORK/nonexistent.json" --manifest "$WORK/project.json" --quiet 2>/dev/null EC=$? set -e -assert "missing payload file exits 5" "[ $EC -eq 5 ]" +check "missing payload file exits 5" "[ $EC -eq 5 ]" # --- Test 11: manifest with non-dict root (list) rejected with exit 2 --- echo '[]' > "$WORK/project.json" @@ -125,7 +112,7 @@ set +e echo '{}' | "$MERGE" --section red_team_audit --payload - --manifest "$WORK/project.json" --quiet 2>/dev/null EC=$? set -e -assert "manifest with list root exits 2" "[ $EC -eq 2 ]" +check "manifest with list root exits 2" "[ $EC -eq 2 ]" # --- Test 12: manifest with non-dict root (string) rejected with exit 2 --- echo '"a string"' > "$WORK/project.json" @@ -133,7 +120,7 @@ set +e echo '{}' | "$MERGE" --section red_team_audit --payload - --manifest "$WORK/project.json" --quiet 2>/dev/null EC=$? set -e -assert "manifest with string root exits 2" "[ $EC -eq 2 ]" +check "manifest with string root exits 2" "[ $EC -eq 2 ]" echo "" echo "manifest-merge: $PASS/$TOTAL passed, $FAIL failed" diff --git a/test/test-version-classifier.sh b/test/test-version-classifier.sh index 312d15f..ee184c3 100755 --- a/test/test-version-classifier.sh +++ b/test/test-version-classifier.sh @@ -16,9 +16,7 @@ set -e -PASS=0 -FAIL=0 -TOTAL=0 +. "$(dirname "$0")/test_helper.sh" # Mirror of the case statement in setup and bin/idstack-doctor. Keep these # patterns in lockstep with both files — if you change one, change all three. @@ -30,7 +28,7 @@ classify_version() { esac } -check() { +check_version() { TOTAL=$((TOTAL + 1)) local version="$1" local expected="$2" @@ -49,41 +47,41 @@ echo "test-version-classifier" echo "" # Legacy versions that ever shipped. -check "0.1.0" legacy -check "0.5.0" legacy -check "1.0.0" legacy -check "1.9.0" legacy -check "2.0.0" legacy -check "2.0.0.0" legacy -check "2.0.0.1" legacy +check_version "0.1.0" legacy +check_version "0.5.0" legacy +check_version "1.0.0" legacy +check_version "1.9.0" legacy +check_version "2.0.0" legacy +check_version "2.0.0.0" legacy +check_version "2.0.0.1" legacy # Modern versions — including multi-digit components that broke the # previous patterns. -check "2.0.1.0" skip -check "2.0.1.5" skip -check "2.0.10.0" skip -check "2.0.99.0" skip -check "2.1.0.0" skip -check "2.4.0.0" skip -check "2.10.0.0" skip -check "2.99.0.0" skip -check "3.0.0.0" skip -check "9.0.0.0" skip -check "10.0.0.0" skip -check "19.0.0.0" skip -check "100.0.0.0" skip +check_version "2.0.1.0" skip +check_version "2.0.1.5" skip +check_version "2.0.10.0" skip +check_version "2.0.99.0" skip +check_version "2.1.0.0" skip +check_version "2.4.0.0" skip +check_version "2.10.0.0" skip +check_version "2.99.0.0" skip +check_version "3.0.0.0" skip +check_version "9.0.0.0" skip +check_version "10.0.0.0" skip +check_version "19.0.0.0" skip +check_version "100.0.0.0" skip # Future major versions where the major itself is multi-digit but does not # start with 1. Caught by Gemini on PR #21 — the previous 1[0-9]* arm # missed these and silently fell through to "unknown". Now classified by # [1-9][0-9]*. -check "20.0.0.0" skip -check "21.5.0" skip -check "25.99.0" skip -check "29.0.0" skip -check "30.0.0" skip -check "200.0.0" skip -check "999.0.0" skip +check_version "20.0.0.0" skip +check_version "21.5.0" skip +check_version "25.99.0" skip +check_version "29.0.0" skip +check_version "30.0.0" skip +check_version "200.0.0" skip +check_version "999.0.0" skip echo "" echo " $PASS/$TOTAL passed" diff --git a/test/test_helper.sh b/test/test_helper.sh new file mode 100755 index 0000000..e3e21ae --- /dev/null +++ b/test/test_helper.sh @@ -0,0 +1,16 @@ +#!/usr/bin/env bash + +PASS=0 +FAIL=0 +TOTAL=0 + +check() { + TOTAL=$((TOTAL + 1)) + if eval "$2" >/dev/null 2>&1; then + PASS=$((PASS + 1)) + echo " PASS: $1" + else + FAIL=$((FAIL + 1)) + echo " FAIL: $1" + fi +}