molecule-core/workspace/tests/test_gh_wrapper.sh
Hongming Wang d8026347e5 chore: open-source restructure — rename dirs, remove internal files, scrub secrets
Renames:
- platform/ → workspace-server/ (Go module path stays as "platform" for
  external dep compat — will update after plugin module republish)
- workspace-template/ → workspace/

Removed (moved to separate repos or deleted):
- PLAN.md — internal roadmap (move to private project board)
- HANDOFF.md, AGENTS.md — one-time internal session docs
- .claude/ — gitignored entirely (local agent config)
- infra/cloudflare-worker/ → Molecule-AI/molecule-tenant-proxy
- org-templates/molecule-dev/ → standalone template repo
- .mcp-eval/ → molecule-mcp-server repo
- test-results/ — ephemeral, gitignored

Security scrubbing:
- Cloudflare account/zone/KV IDs → placeholders
- Real EC2 IPs → <EC2_IP> in all docs
- CF token prefix, Neon project ID, Fly app names → redacted
- Langfuse dev credentials → parameterized
- Personal runner username/machine name → generic

Community files:
- CONTRIBUTING.md — build, test, branch conventions
- CODE_OF_CONDUCT.md — Contributor Covenant 2.1

All Dockerfiles, CI workflows, docker-compose, railway.toml, render.yaml,
README, CLAUDE.md updated for new directory names.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-18 00:24:44 -07:00

115 lines
4.3 KiB
Bash

#!/usr/bin/env bash
# Smoke-test the gh-wrapper behaviour with a fake gh binary that echoes
# back its argv. Runs entirely in-process (no Docker), so it's cheap to
# run per-CI-job. Tests the behaviour table in scripts/gh-wrapper.sh.
#
# Invoked by CI's Python Lint & Test job via a subprocess shell-out, or
# locally via `bash tests/test_gh_wrapper.sh`.
set -euo pipefail
HERE="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
WRAPPER="$HERE/../scripts/gh-wrapper.sh"
if [[ ! -x "$WRAPPER" ]]; then
echo "FAIL: wrapper not executable: $WRAPPER" >&2
exit 1
fi
# Fake gh: prints every arg on its own line, prefixed by "ARG:". Lets
# tests introspect what the wrapper passed through.
FAKE_GH_DIR=$(mktemp -d)
trap 'rm -rf "$FAKE_GH_DIR"' EXIT
cat > "$FAKE_GH_DIR/gh" <<'EOF'
#!/usr/bin/env bash
for a in "$@"; do
printf 'ARG:%s\n' "$a"
done
EOF
chmod +x "$FAKE_GH_DIR/gh"
# Make the wrapper use the fake gh by overriding the hardcoded path via
# a temporary symlink trick: copy the wrapper to a temp location and
# sed-replace the REAL_GH default with our fake.
WRAPPER_UNDER_TEST=$(mktemp)
trap 'rm -f "$WRAPPER_UNDER_TEST"' EXIT
sed "s|REAL_GH=/usr/bin/gh|REAL_GH=$FAKE_GH_DIR/gh|" "$WRAPPER" > "$WRAPPER_UNDER_TEST"
chmod +x "$WRAPPER_UNDER_TEST"
pass=0
fail=0
assert_contains() {
local name="$1" haystack="$2" needle="$3"
if [[ "$haystack" == *"$needle"* ]]; then
pass=$((pass + 1))
echo " PASS: $name"
else
fail=$((fail + 1))
echo " FAIL: $name" >&2
echo " expected to contain: $needle" >&2
echo " got: $haystack" >&2
fi
}
assert_not_contains() {
local name="$1" haystack="$2" needle="$3"
if [[ "$haystack" == *"$needle"* ]]; then
fail=$((fail + 1))
echo " FAIL: $name — should not contain: $needle" >&2
echo " got: $haystack" >&2
else
pass=$((pass + 1))
echo " PASS: $name"
fi
}
echo "--- passthrough (no subcommand transform) ---"
out=$(GIT_AUTHOR_NAME="Molecule AI Frontend Engineer" "$WRAPPER_UNDER_TEST" pr list --state open)
assert_contains "pr list passthrough" "$out" "ARG:list"
assert_not_contains "pr list no prefix" "$out" "[Frontend"
echo "--- pr create with role ---"
out=$(GIT_AUTHOR_NAME="Molecule AI Backend Engineer" "$WRAPPER_UNDER_TEST" pr create --title "fix: auth" --body "Short description")
assert_contains "pr create title prefix" "$out" "ARG:[Backend Engineer] fix: auth"
assert_contains "pr create body footer" "$out" "_Opened by: Molecule AI Backend Engineer_"
echo "--- issue create with = form ---"
out=$(GIT_AUTHOR_NAME="Molecule AI PM" "$WRAPPER_UNDER_TEST" issue create --title="bug: foo" --body="details")
assert_contains "issue create --title= prefix" "$out" "ARG:--title=[PM] bug: foo"
assert_contains "issue create --body= footer" "$out" "_Opened by: Molecule AI PM_"
echo "--- idempotent title re-prefix ---"
out=$(GIT_AUTHOR_NAME="Molecule AI DevRel Engineer" "$WRAPPER_UNDER_TEST" pr create --title "[DevRel Engineer] already prefixed")
assert_not_contains "no double prefix" "$out" "[DevRel Engineer] [DevRel Engineer]"
echo "--- idempotent body footer ---"
already="original body
---
_Opened by: Molecule AI UIUX Designer_"
out=$(GIT_AUTHOR_NAME="Molecule AI UIUX Designer" "$WRAPPER_UNDER_TEST" pr create --title "x" --body "$already")
# Count how many times the footer marker appears — should be exactly 1.
count=$(echo "$out" | grep -c "_Opened by: Molecule AI UIUX Designer_" || true)
if [[ "$count" -eq 1 ]]; then
pass=$((pass + 1)); echo " PASS: footer not double-appended"
else
fail=$((fail + 1)); echo " FAIL: footer count=$count (want 1)" >&2
fi
echo "--- missing GIT_AUTHOR_NAME — passes through ---"
out=$(unset GIT_AUTHOR_NAME; "$WRAPPER_UNDER_TEST" pr create --title "fix: foo")
assert_not_contains "no role means no prefix" "$out" "[M"
assert_contains "raw title survives" "$out" "ARG:fix: foo"
echo "--- wrong prefix in GIT_AUTHOR_NAME — passes through ---"
out=$(GIT_AUTHOR_NAME="Some Random Human" "$WRAPPER_UNDER_TEST" pr create --title "fix: foo")
assert_not_contains "non-Molecule author means no prefix" "$out" "[S"
assert_contains "raw title survives (wrong prefix)" "$out" "ARG:fix: foo"
echo
echo "================================"
echo "gh-wrapper: $pass passed, $fail failed"
echo "================================"
[[ $fail -eq 0 ]]