name: Quality gates

on:
  push:
    branches: [main]
  pull_request:
    branches: [main]

permissions:
  contents: read

jobs:
  quality:
    runs-on: ubuntu-latest
    timeout-minutes: 15
    steps:
      - name: Check out source
        uses: actions/checkout@v4
        with:
          fetch-depth: 0
      - name: Set up Node.js
        uses: actions/setup-node@v4
        with:
          node-version: 22
          cache: npm
      - name: Install reproducibly
        run: |
          npm ci
          python3 -m pip install --break-system-packages -r requirements-test.txt
      - name: Install browser
        run: npx playwright install --with-deps chromium
      - name: Unit and security tests
        run: |
          npm test
          python3 tests/staging-deploy.test.py -v
      - name: Mobile browser acceptance
        run: |
          npm start > /tmp/timmy-server.log 2>&1 &
          server_pid=$!
          trap 'kill "$server_pid"' EXIT
          for attempt in $(seq 1 30); do
            if curl --fail --silent http://127.0.0.1:4173/ > /dev/null; then
              break
            fi
            if [ "$attempt" -eq 30 ]; then
              cat /tmp/timmy-server.log
              exit 1
            fi
            sleep 1
          done
          npm run test:ui
          npm run test:photo
          npm run test:sleek
      - name: Dependency audit
        run: npm audit --audit-level=high
      - name: Syntax checks
        run: |
          npm run check:syntax
          node --check tests/staging.acceptance.mjs
      - name: Diff hygiene
        run: npm run check:diff
