name: fast-browser scenarios on: push: paths: - "extensions/fast-browser/**" - "package.json" - "bun.lock" - ".github/workflows/fast-browser-scenarios.yml" pull_request: paths: - "extensions/fast-browser/**" - "package.json" - "bun.lock" - ".github/workflows/fast-browser-scenarios.yml" workflow_dispatch: permissions: contents: read jobs: offline: name: Offline scenario contract tests runs-on: ubuntu-latest timeout-minutes: 10 steps: - uses: actions/checkout@v4 - uses: oven-sh/setup-bun@v2 with: bun-version: "1.3.14" - uses: actions/setup-python@v5 with: python-version: "3.12" - name: Install pinned dependencies run: | bun install --frozen-lockfile python -m pip install --disable-pip-version-check 'browser-harness==0.1.13' - name: Run offline scenario contract tests run: | node --test --experimental-strip-types \ extensions/fast-browser/scenario-cli.test.ts \ extensions/fast-browser/scenarios.test.ts \ extensions/fast-browser/reports.test.ts python -m unittest discover -s extensions/fast-browser -p 'test_*.py' - name: Validate local scenario examples without a browser run: | node --experimental-strip-types extensions/fast-browser/scenario-cli.ts --check --format json extensions/fast-browser/scenarios/examples/local-form.json node --experimental-strip-types extensions/fast-browser/scenario-cli.ts --check --format json extensions/fast-browser/scenarios/examples/local-login.json node --experimental-strip-types extensions/fast-browser/scenario-cli.ts --check --format json extensions/fast-browser/scenarios/examples/local-popup.json live-headless: name: Local Chromium headless scenarios runs-on: ubuntu-latest timeout-minutes: 15 steps: - uses: actions/checkout@v4 - uses: oven-sh/setup-bun@v2 with: bun-version: "1.3.14" - uses: actions/setup-python@v5 with: python-version: "3.12" - name: Install pinned browser dependencies run: | sudo apt-get update sudo apt-get install --yes --no-install-recommends chromium python -m venv .pi/fast-browser-demo/venv .pi/fast-browser-demo/venv/bin/python -m pip install --disable-pip-version-check 'browser-harness==0.1.13' bun install --frozen-lockfile - name: Run declarative CLI scenarios against local Chromium env: FAST_BROWSER_FIXTURE_MODE: "local" FAST_BROWSER_TEST_PASSWORD: "demo-password" FAST_BROWSER_PYTHON: "${{ github.workspace }}/.pi/fast-browser-demo/venv/bin/python" run: | report_dir="$RUNNER_TEMP/fast-browser-scenario-reports" mkdir -m 700 -p "$report_dir" node --experimental-strip-types extensions/fast-browser/scenario-cli.ts --headless --capture-on-request --format json --report "$report_dir/local-form.json" extensions/fast-browser/scenarios/examples/local-form.json node --experimental-strip-types extensions/fast-browser/scenario-cli.ts --headless --capture-on-request --format json --report "$report_dir/local-login.json" extensions/fast-browser/scenarios/examples/local-login.json node --experimental-strip-types extensions/fast-browser/scenario-cli.ts --headless --capture-on-request --format json --report "$report_dir/local-popup.json" extensions/fast-browser/scenarios/examples/local-popup.json node --input-type=module -e 'import { readFileSync, accessSync } from "node:fs"; for (const name of ["local-form", "local-login", "local-popup"]) { const report = JSON.parse(readFileSync(`${process.env.RUNNER_TEMP}/fast-browser-scenario-reports/${name}.json`, "utf8")); for (const evidence of report.evidence ?? []) if (evidence.status === "captured") accessSync(evidence.retainedPath); }'