forked from molecule-ai/molecule-core
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>
115 lines
4.3 KiB
Bash
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 ]]
|