name: Tests on: push: branches: [main] pull_request: branches: [main] jobs: test: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: Set up Python uses: actions/setup-python@v5 with: python-version: "3.x" - name: Install dependencies run: pip install -r requirements.txt - name: Run tests with coverage run: python -m pytest -v # The pytest suite replaces the whole `tk` module so it can never reach a # display, which means the lock-screen widget behaviour it guards cannot be # asserted there. This job runs the real-Tk half against a throwaway X # server. See scripts/verify_lock_popup_safety.py. lock-popup-safety: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - uses: actions/setup-python@v5 with: python-version: "3.x" - name: Install dependencies run: | sudo apt-get update sudo apt-get install -y xvfb python3-tk pip install -r requirements.txt # The script imports screen_locker directly rather than through # pytest, which would put the rootdir on sys.path for it. pip install -e . --no-deps - name: Sport selector survives gatelock's recovery tick # Run as a module (like the screen-fits gate) so scripts/ resolves as a # package and the check can import the helpers it was split into. run: python3 -m scripts.verify_lock_popup_safety # The two coverage bars below used to run only in the local pre-push hook, # which became a 1-second stamp check on 2026-09-20 (pre-commit's manual # stage holds them now). Nothing else in CI runs the Flutter or web suites, # so these jobs are the only place the 100% bars are enforced on every push. flutter-coverage: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - uses: subosito/flutter-action@v2 with: flutter-version: 3.47.5 channel: stable - name: flutter test --coverage, 100% of lib/ (workout app) run: bash scripts/check_flutter_coverage.sh web-coverage: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - uses: actions/setup-node@v4 with: node-version: 24.21.0 cache: npm cache-dependency-path: web/package-lock.json - name: vitest --coverage, 100% (status web UI) run: | npm --prefix web ci npm --prefix web run coverage