chore: update gitignore, Makefile, skills route, and test scaffolding
This commit is contained in:
Executable
+171
@@ -0,0 +1,171 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
set -euo pipefail
|
||||
|
||||
ROOT_DIR="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")/.." && pwd)"
|
||||
cd "$ROOT_DIR"
|
||||
|
||||
PROFILE="neo"
|
||||
RUN_SYNC=true
|
||||
RUN_LINT=true
|
||||
RUN_SMOKE=true
|
||||
RUN_DASHBOARD=false
|
||||
|
||||
usage() {
|
||||
cat <<'EOF'
|
||||
Usage:
|
||||
scripts/pr_test_env.sh [options]
|
||||
|
||||
Options:
|
||||
--profile <neo|full> Test profile. Default: neo
|
||||
--with-dashboard Build dashboard before finishing checks
|
||||
--no-dashboard Disable dashboard build (even for full profile)
|
||||
--skip-sync Skip `uv sync`
|
||||
--skip-lint Skip `ruff format --check` and `ruff check`
|
||||
--skip-smoke Skip startup smoke test
|
||||
-h, --help Show this help message
|
||||
|
||||
Environment:
|
||||
PYTEST_ARGS Extra args appended to pytest command
|
||||
EOF
|
||||
}
|
||||
|
||||
while (($# > 0)); do
|
||||
case "$1" in
|
||||
--profile)
|
||||
PROFILE="${2:-}"
|
||||
if [[ "$PROFILE" != "neo" && "$PROFILE" != "full" ]]; then
|
||||
echo "Unsupported profile: $PROFILE" >&2
|
||||
exit 1
|
||||
fi
|
||||
shift 2
|
||||
;;
|
||||
--with-dashboard)
|
||||
RUN_DASHBOARD=true
|
||||
shift
|
||||
;;
|
||||
--skip-sync)
|
||||
RUN_SYNC=false
|
||||
shift
|
||||
;;
|
||||
--skip-lint)
|
||||
RUN_LINT=false
|
||||
shift
|
||||
;;
|
||||
--skip-smoke)
|
||||
RUN_SMOKE=false
|
||||
shift
|
||||
;;
|
||||
--no-dashboard)
|
||||
RUN_DASHBOARD=false
|
||||
shift
|
||||
;;
|
||||
-h | --help)
|
||||
usage
|
||||
exit 0
|
||||
;;
|
||||
*)
|
||||
echo "Unknown option: $1" >&2
|
||||
usage
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
done
|
||||
|
||||
if [[ "$PROFILE" == "full" && "$RUN_DASHBOARD" == false ]]; then
|
||||
RUN_DASHBOARD=true
|
||||
fi
|
||||
|
||||
echo "==> Profile: $PROFILE"
|
||||
echo "==> Sync dependencies: $RUN_SYNC"
|
||||
echo "==> Run lint: $RUN_LINT"
|
||||
echo "==> Run smoke test: $RUN_SMOKE"
|
||||
echo "==> Build dashboard: $RUN_DASHBOARD"
|
||||
|
||||
if [[ "$RUN_SYNC" == true ]]; then
|
||||
echo "==> Syncing dependencies with uv"
|
||||
uv sync --group dev
|
||||
fi
|
||||
|
||||
echo "==> Preparing test directories"
|
||||
mkdir -p data/plugins data/config data/temp data/skills
|
||||
export TESTING="${TESTING:-true}"
|
||||
export ZHIPU_API_KEY="${ZHIPU_API_KEY:-test-api-key}"
|
||||
|
||||
if [[ "$RUN_LINT" == true ]]; then
|
||||
echo "==> Running Ruff format check"
|
||||
uv run ruff format --check .
|
||||
echo "==> Running Ruff lint check"
|
||||
uv run ruff check .
|
||||
fi
|
||||
|
||||
echo "==> Running pytest"
|
||||
if [[ "$PROFILE" == "neo" ]]; then
|
||||
NEO_TESTS=(
|
||||
"tests/test_neo_skill_sync.py"
|
||||
"tests/test_neo_skill_tools.py"
|
||||
"tests/test_computer_skill_sync.py"
|
||||
"tests/test_skill_manager_sandbox_cache.py"
|
||||
"tests/test_dashboard.py::test_neo_skills_routes"
|
||||
)
|
||||
uv run pytest -q "${NEO_TESTS[@]}" ${PYTEST_ARGS:-}
|
||||
else
|
||||
uv run pytest --cov=. -v -o log_cli=true -o log_level=DEBUG ${PYTEST_ARGS:-}
|
||||
fi
|
||||
|
||||
run_smoke_test() {
|
||||
if ! command -v curl >/dev/null 2>&1; then
|
||||
echo "curl is required for smoke test." >&2
|
||||
return 1
|
||||
fi
|
||||
|
||||
local smoke_port="6185"
|
||||
local smoke_log
|
||||
smoke_log="$(mktemp -t astrbot-smoke.XXXXXX.log)"
|
||||
|
||||
echo "==> Starting smoke test on http://localhost:${smoke_port}"
|
||||
uv run main.py >"$smoke_log" 2>&1 &
|
||||
local app_pid=$!
|
||||
|
||||
for _ in $(seq 1 60); do
|
||||
if curl -sf "http://localhost:${smoke_port}" >/dev/null 2>&1; then
|
||||
echo "==> Smoke test passed"
|
||||
kill "$app_pid" 2>/dev/null || true
|
||||
wait "$app_pid" 2>/dev/null || true
|
||||
rm -f "$smoke_log"
|
||||
return 0
|
||||
fi
|
||||
|
||||
if ! kill -0 "$app_pid" 2>/dev/null; then
|
||||
echo "AstrBot process exited before becoming healthy." >&2
|
||||
tail -n 60 "$smoke_log" || true
|
||||
rm -f "$smoke_log"
|
||||
return 1
|
||||
fi
|
||||
|
||||
sleep 1
|
||||
done
|
||||
|
||||
echo "Smoke test failed: health endpoint did not become ready in time." >&2
|
||||
tail -n 60 "$smoke_log" || true
|
||||
kill "$app_pid" 2>/dev/null || true
|
||||
wait "$app_pid" 2>/dev/null || true
|
||||
rm -f "$smoke_log"
|
||||
return 1
|
||||
}
|
||||
|
||||
if [[ "$RUN_SMOKE" == true ]]; then
|
||||
run_smoke_test
|
||||
fi
|
||||
|
||||
if [[ "$RUN_DASHBOARD" == true ]]; then
|
||||
if ! command -v pnpm >/dev/null 2>&1; then
|
||||
echo "pnpm is required for dashboard build. Install it with: npm install -g pnpm" >&2
|
||||
exit 1
|
||||
fi
|
||||
echo "==> Building dashboard"
|
||||
pnpm --dir dashboard install --frozen-lockfile
|
||||
pnpm --dir dashboard run build
|
||||
fi
|
||||
|
||||
echo "==> PR checks completed successfully"
|
||||
Reference in New Issue
Block a user