Files
Shutong Wu 89f27f1e3b test(e2e): add headless bridge harness and deterministic no-LLM CI smoke
A one-command, no-API-key end-to-end gate for the Python<->Unity bridge,
runnable locally and in CI.

- tools/local_harness.py: boots a headless Hub-licensed Editor (or attaches
  with --reuse) and runs smoke + EditMode + PlayMode legs over the bridge,
  aggregating JUnit; exit codes 0-5 (pass / regression / unreachable /
  no-compile / no-license / no-editor)
- Server/tests/e2e/bridge_smoke.py: deterministic no-LLM contract driver over
  the real wire path; the no-LLM counterpart to claude-nl-suite.yml
- .github/workflows/e2e-bridge.yml: PR gate booting headless Unity in CI;
  self-skips (warns) when Unity license secrets are absent
- .github/workflows/python-tests.yml: run the hermetic harness unit tests and
  add tools/** to the path triggers
- tools/tests/test_local_harness.py: 69 hermetic unit tests for the harness's
  Unity-free decision logic (discovery, version resolution, exit-code mapping)
- Document the harness in CLAUDE.md and the contributor docs
2026-06-14 22:02:33 -07:00

82 lines
2.1 KiB
YAML

name: Python Tests
on:
push:
# Exclude beta and main: those branches re-trigger this workflow via
# workflow_call from beta-release.yml / release.yml. Without the exclusion,
# a push to beta that touches Server/** fires this workflow twice for the
# same SHA, and GitHub auto-cancels the duplicate.
branches-ignore: [beta, main]
paths:
- Server/**
- tools/**
- .github/workflows/python-tests.yml
pull_request:
branches: [main, beta]
paths:
- Server/**
- tools/**
- .github/workflows/python-tests.yml
workflow_dispatch: {}
workflow_call:
inputs:
ref:
description: "Git ref to test (defaults to the triggering ref)."
type: string
required: false
default: ""
jobs:
test:
name: Run Python Tests
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v4
with:
ref: ${{ inputs.ref || github.ref }}
- name: Install uv
uses: astral-sh/setup-uv@v4
with:
version: "latest"
- name: Set up Python
run: uv python install 3.10
- name: Install dependencies
run: |
cd Server
uv sync
uv pip install -e ".[dev]"
- name: Run tests with coverage
run: |
cd Server
uv run pytest tests/ -v --tb=short --cov --cov-report=xml --cov-report=html --cov-report=term
- name: Run local harness unit tests (hermetic, no Unity)
run: |
cd Server
uv run python -m pytest "$GITHUB_WORKSPACE/tools/tests/" -v --tb=short
- name: Upload coverage reports
uses: codecov/codecov-action@v4
if: always()
with:
files: ./Server/coverage.xml
flags: python
name: python-coverage
fail_ci_if_error: false
- name: Upload test results
uses: actions/upload-artifact@v4
if: always()
with:
name: pytest-results
path: |
Server/.pytest_cache/
Server/tests/
Server/coverage.xml
Server/htmlcov/