mirror of
https://github.com/obra/superpowers.git
synced 2026-07-24 03:04:02 +08:00
Follow-up to #2011 (which fixed the ./-prefix mismatch for the documented pattern form): strip a leading ./ from the caller's pattern instead of double-prefixing it into a never-matching ././ form, and also match the pattern with '**/' collapsed, since find -path cannot match '**/' against zero directory levels and silently skipped files directly under the base directory (src/top.test.ts vs src/**/*.test.ts). Adds a deterministic test suite for the script with a stubbed npm.
91 lines
2.5 KiB
Bash
Executable File
91 lines
2.5 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
set -euo pipefail
|
|
|
|
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
|
|
REPO_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)"
|
|
SCRIPT_UNDER_TEST="$REPO_ROOT/skills/systematic-debugging/find-polluter.sh"
|
|
|
|
FAILURES=0
|
|
TEST_ROOT="$(mktemp -d)"
|
|
|
|
cleanup() {
|
|
rm -rf "$TEST_ROOT"
|
|
}
|
|
trap cleanup EXIT
|
|
|
|
pass() {
|
|
echo " [PASS] $1"
|
|
}
|
|
|
|
fail() {
|
|
echo " [FAIL] $1"
|
|
FAILURES=$((FAILURES + 1))
|
|
}
|
|
|
|
assert_contains() {
|
|
local haystack="$1"
|
|
local needle="$2"
|
|
local description="$3"
|
|
|
|
if printf '%s' "$haystack" | grep -Fq -- "$needle"; then
|
|
pass "$description"
|
|
else
|
|
fail "$description (expected output to contain: $needle)"
|
|
fi
|
|
}
|
|
|
|
# Toy project: one top-level test, one nested test. A stubbed `npm` on PATH
|
|
# creates the pollution marker whenever any test runs, so the first test file
|
|
# executed is always identified as the polluter.
|
|
setup_project() {
|
|
PROJECT="$TEST_ROOT/project"
|
|
rm -rf "$PROJECT"
|
|
mkdir -p "$PROJECT/src/feature" "$PROJECT/bin"
|
|
echo "test('top')" > "$PROJECT/src/top.test.ts"
|
|
echo "test('nested')" > "$PROJECT/src/feature/nested.test.ts"
|
|
cat > "$PROJECT/bin/npm" <<'EOF'
|
|
#!/usr/bin/env bash
|
|
touch pollution.marker
|
|
EOF
|
|
chmod +x "$PROJECT/bin/npm"
|
|
}
|
|
|
|
# run_polluter <pattern> — runs the script in the toy project with the stub
|
|
# npm first on PATH; captures combined output, never aborts on exit code.
|
|
run_polluter() {
|
|
local pattern="$1"
|
|
rm -f "$PROJECT/pollution.marker"
|
|
(
|
|
cd "$PROJECT"
|
|
PATH="$PROJECT/bin:$PATH" "$SCRIPT_UNDER_TEST" 'pollution.marker' "$pattern" 2>&1
|
|
) || true
|
|
}
|
|
|
|
echo "Test: documented pattern finds nested test files (issue #2008)"
|
|
setup_project
|
|
OUTPUT="$(run_polluter 'src/**/*.test.ts')"
|
|
assert_contains "$OUTPUT" "FOUND POLLUTER" "documented pattern runs tests and detects pollution"
|
|
|
|
echo "Test: documented pattern also finds top-level test files"
|
|
setup_project
|
|
OUTPUT="$(run_polluter 'src/**/*.test.ts')"
|
|
assert_contains "$OUTPUT" "Found 2 test files" "src/**/*.test.ts matches src/top.test.ts and src/feature/nested.test.ts"
|
|
|
|
echo "Test: ./-prefixed pattern matches the same files"
|
|
setup_project
|
|
OUTPUT="$(run_polluter './src/**/*.test.ts')"
|
|
assert_contains "$OUTPUT" "Found 2 test files" "leading ./ on the pattern is accepted"
|
|
|
|
echo "Test: non-matching pattern reports an honest zero"
|
|
setup_project
|
|
OUTPUT="$(run_polluter 'nomatch/**/*.test.ts')"
|
|
assert_contains "$OUTPUT" "Found 0 test files" "empty result counts as 0, not 1"
|
|
assert_contains "$OUTPUT" "No polluter found" "empty result exits via the clean path"
|
|
|
|
echo ""
|
|
if [ "$FAILURES" -gt 0 ]; then
|
|
echo "$FAILURES test(s) failed"
|
|
exit 1
|
|
fi
|
|
echo "All tests passed"
|