Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
44 changes: 6 additions & 38 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -41,35 +41,14 @@ jobs:
test-unit:
name: Unit tests
runs-on: ubuntu-latest
# Pure in-process tests — Pydantic models, observability config, mocked
# FastAPI endpoints. Completes fast so PR authors get quick feedback.
steps:
- uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4
- uses: astral-sh/setup-uv@d4b2f3b6ecc6e67c4457f6d3e41ec42d3d0fcb86 # v5
- uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5
with:
python-version: "3.14"
- run: uv sync --frozen --extra dev
- run: uv run pytest tests/ -v -m "not integration"

test-integration:
name: Integration tests
runs-on: ubuntu-latest
# Tests that touch real external systems (DBs, queues, etc.). The template
# ships none, so this job runs the integration-marked subset and exits 0
# when no tests collect.
steps:
- uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4
- uses: astral-sh/setup-uv@d4b2f3b6ecc6e67c4457f6d3e41ec42d3d0fcb86 # v5
- uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5
with:
python-version: "3.14"
- run: uv sync --frozen --extra dev
- run: uv run pytest tests/ -v -m integration --no-header
# `pytest` exits 5 when no tests are collected — treat that as success
# while the template has no integration suite.
continue-on-error: false
shell: bash
- run: uv run pytest tests/ -v -m "not integration" -o "addopts="

coverage:
name: Coverage
Expand All @@ -78,7 +57,6 @@ jobs:
# under src/, the template has no measurable coverage; pyproject.toml's
# [tool.coverage.report].fail_under stays at 75 (the eventual target),
# while CI uses --cov-fail-under=0 so the empty scaffold doesn't fail.
# When #17 + #18 ship real source + tests, drop the override here.
steps:
- uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4
- uses: astral-sh/setup-uv@d4b2f3b6ecc6e67c4457f6d3e41ec42d3d0fcb86 # v5
Expand All @@ -103,9 +81,6 @@ jobs:
pre-commit:
name: Pre-commit
runs-on: ubuntu-latest
# Runs every hook against all files — ensures a developer who forgot
# `uv run pre-commit install` can't leak unformatted code or a stray
# secret past the first defence layer.
steps:
- uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4
- uses: astral-sh/setup-uv@d4b2f3b6ecc6e67c4457f6d3e41ec42d3d0fcb86 # v5
Expand All @@ -118,7 +93,6 @@ jobs:
frontend-build:
name: Frontend Build
runs-on: ubuntu-latest
# Skips cleanly until ticket #21 lands frontend/package.json.
if: hashFiles('frontend/package.json') != ''
steps:
- uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4
Expand All @@ -132,22 +106,16 @@ jobs:
frontend-quality:
name: Frontend Quality
runs-on: ubuntu-latest
# Lint + format + tsc + vitest. Mirrors the strict posture the backend
# enjoys (ruff + mypy + pytest); the Frontend Build job above validates
# the bundler output, this one validates source quality.
if: hashFiles('frontend/package.json') != ''
defaults:
run:
working-directory: frontend
steps:
- uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4
- uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6
with:
node-version: "24"
cache: npm
cache-dependency-path: frontend/package-lock.json
- run: npm ci
- run: npm run lint
- run: npm run format:check
- run: npm run check
- run: npm run test
- run: cd frontend && npm ci
- run: cd frontend && npm run lint
- run: cd frontend && npm run format:check
- run: cd frontend && npm run check
- run: cd frontend && npm run test