Files
claude-plugin-inference-arb…/tests/inventory.test.sh
T

57 lines
2.2 KiB
Bash
Executable File

#!/usr/bin/env bash
# Asserts bin/plugin-inventory against tests/fixtures/sample-plugin, whose
# every signal value is known by construction (see the fixture files
# themselves for what each one is designed to trigger).
set -euo pipefail
cd "$(dirname "${BASH_SOURCE[0]}")/.."
OUT=$(python3 bin/plugin-inventory tests/fixtures/sample-plugin --json)
fail=0
check() {
local desc="$1" expr="$2"
if ! python3 -c "
import json, sys
d = json.loads('''$OUT''')
assert ($expr), 'FAILED: $desc'
"; then
echo "FAIL: $desc" >&2
fail=1
else
echo "ok: $desc"
fi
}
check "plugin name resolved from manifest" "d['plugin']['name'] == 'sample-plugin'"
check "two skills found" "len(d['skills']) == 2"
check "dupe-a verb_ratio is 0.5 (2 script, 2 judgment)" "d['skills'][0]['verb_ratio'] == 0.5"
check "dupe-a rule_tables counted" "d['skills'][0]['rule_tables'] == 1"
check "dupe-b has no rule table" "d['skills'][1]['rule_tables'] == 0"
check "duplicated command block found across dupe-a and dupe-b" "
any(b['sig'] == 'git status --short' and sorted(b['skills']) == ['dupe-a', 'dupe-b']
for b in d['aggregate']['duplicated_command_blocks'])
"
check "one agent found" "len(d['agents']) == 1"
check "fetcher mechanical_tool_share is 0.8 (4 of 5 tools)" "d['agents'][0]['mechanical_tool_share'] == 0.8"
check "one hook found" "len(d['hooks']) == 1 and d['hooks'][0]['file'] == 'guard.sh'"
check "hook LOC matches file" "d['hooks'][0]['loc'] == 8"
check "one bin script found, bash detected" "d['scripts'][0]['lang'] == 'bash' and d['scripts'][0]['loc'] == 3"
check "hook_prose_drift catches FIXTURE_ENV_VAR/fixture_check restated in dupe-a" "
any(p['hook'] == 'guard.sh' and p['skill'] == 'dupe-a'
and {'fixture_env_var', 'fixture_check'} <= set(p['shared_tokens'])
for p in d['aggregate']['hook_prose_drift'])
"
check "hook_prose_drift does NOT fire for dupe-b (no shared identifiers)" "
not any(p['skill'] == 'dupe-b' for p in d['aggregate']['hook_prose_drift'])
"
# Target resolution: bare name against a nonexistent cache entry fails loudly.
if python3 bin/plugin-inventory this-plugin-does-not-exist >/dev/null 2>&1; then
echo "FAIL: unresolvable target should exit non-zero" >&2
fail=1
else
echo "ok: unresolvable target exits non-zero"
fi
exit "$fail"