Testing og deployment

7. Testing og deployment

Vi har ikke automated unit-tests endnu (deliberate trade-off i v1 for at ship hurtigere). Quality-loop'et er: typecheck + manuel smoke-test + GitHub Actions deploy.

Typecheck

Før hver commit:

npx tsc --noEmit

Exit 0 = clean. Hvis det fejler, fix før commit. TypeScript fanger ~70% af klasser-of-fejl der ellers ville være runtime-bugs.

Husk: typecheck er ikke compileskridt — npm run dev bruger ts-loader der ikke giver samme dybe checks. Kør tsc --noEmit separat.

Manuel smoke-test

Før PR/push:

  1. Start dev-server (npm run dev)
  2. Start Azurite (hvis ikke allerede)
  3. Gå igennem golden path for din ændring:
    • Login
    • Create record
    • Edit record
    • View public page
    • Delete (med safety-confirm)
  4. Tjek regression — gå til andre features der bruger samme kode-paths. Brød du noget?
  5. For UI: tjek både desktop og mobile (browser dev-tools responsive-mode)

Dokumentér hvad du testede i PR-beskrivelsen, så reviewers ved hvad der ER og IKKE ER verificeret.

CI/CD via GitHub Actions

.github/workflows/deploy.yml triggerer på push til master:

name: Deploy to Azure Container Apps
on:
  push:
    branches: [master]

jobs:
  build-and-deploy:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-node@v4
        with:
          node-version: '22'
      - run: npm ci
      - run: npx tsc --noEmit
      - run: npm run build
      - name: Build & push Docker
        run: |
          docker build -t ${{ env.ACR }}/tesseracms:${{ github.sha }} .
          docker push ${{ env.ACR }}/tesseracms:${{ github.sha }}
      - uses: azure/login@v2
        with:
          client-id: ${{ vars.AZ_CLIENT_ID }}
          tenant-id: ${{ vars.AZ_TENANT_ID }}
          subscription-id: ${{ vars.AZ_SUBSCRIPTION_ID }}
      - run: az containerapp update --name tesseracms --resource-group rg-palle-portfolio --image ...

Typisk varighed: 3-4 min. Tjek status på Actions-fanen.

Prod env-vars

Lever på Container App's ContainersEnvironment variables-blade. Set via Azure Portal eller az CLI.

Kritiske vars:

  • AZURE_STORAGE_CONNECTION_STRING — peger mod prod-storage
  • AZURE_STORAGE_ACCOUNT_NAME — kort-navn
  • GRAPH_TENANT_ID, GRAPH_CLIENT_ID, GRAPH_CLIENT_SECRET — for user-invite-flowet
  • ACS_CONNECTION_STRING, ACS_SENDER_ADDRESS — for transactional mail

Når du tilføjer en ny env-var i koden:

  1. Tilføj process.env.XXX reference
  2. Tilføj til .env.example med dummy-value
  3. Sæt prod-værdi i Azure Portal
  4. Sæt lokal-værdi i .env.local
  5. Document i docs/aca-setup-runbook.md hvis kritisk

Storage-migration mod prod

Når en migration-script skal køre mod prod:

  1. Test først mod Azurite med --local flag
  2. Test med --dry-run mod prod for at se hvad det vil gøre
  3. Tag backup af affected tenants først via /admin/backups
  4. Kør for real: npx tsx scripts/migrate-xxx.ts (default = prod hvis script bruger .env.production.local)
  5. Verificér i Storage Explorer at data ser rigtig ud
  6. Smoke-test affected pages på prod

Roll-back

Hvis et deploy går galt og siten er broken:

  1. GitHub → Actions → forrige successful run
  2. Re-run all jobs
  3. ~3 min senere er forrige image deployed igen

Storage-roll-back er sværere — vi har ingen point-in-time-recovery i Azure Tables. Hvis en migration korrupted data, må vi restore fra backup-ZIP.

Performance-test

Ingen formal performance-suite. Ad-hoc:

  • Browser dev-tools → Performance tab → record page-load
  • Lighthouse CLI: npx lighthouse https://<url> for Core Web Vitals
  • Container App Metrics for CPU/memory under load

For seriøst performance-arbejde: følg TASK-137 (Performance + Core Web Vitals tracking).