# Phase 11: Testing & Deployment

**Status:** ⏳ Todo
**Progress:** 0/15 tasks (0%)
**Started:** -
**Completed:** -
**Assigned to:** -

---

## Overview

Setup testing frameworks (Vitest, Playwright), write tests, create production Docker setup, configure CI/CD pipeline, and deploy to staging/production.

**Goal:** Fully tested MVP deployed to production with automated CI/CD.

---

## Dependencies

- ✅ All previous phases should be completed

---

## Tasks

### Unit Testing Setup

- [ ] Setup Vitest for unit tests

  ```bash
  pnpm add -D vitest @vue/test-utils happy-dom
  ```

  - Configure vitest.config.ts
  - Add test scripts to package.json: `"test": "vitest"`
  - Create `tests/` folder structure

- [ ] Write tests for auth utilities
  - Test: `server/utils/pkce.ts`
    - Test PKCE generation (verifier, challenge)
    - Test challenge is base64url encoded SHA-256
  - Test: `server/utils/jwt.ts`
    - Test JWT validation (mock JWKS)
    - Test expired token rejection
    - Test invalid issuer/audience rejection

- [ ] Write tests for API endpoints
  - Test: `/api/products/index.get.ts`
    - Test returns active products only
    - Test filtering by category
  - Test: `/api/cart/items.post.ts`
    - Test add item to cart
    - Test validation (invalid product ID)
  - Test: `/api/orders/index.post.ts`
    - Test order creation
    - Test requires authentication
  - Use: `@nuxt/test-utils` for API testing

### E2E Testing Setup

- [ ] Setup Playwright for E2E

  ```bash
  pnpm add -D @playwright/test
  npx playwright install
  ```

  - Configure playwright.config.ts
  - Add e2e script: `"test:e2e": "playwright test"`
  - Create `tests/e2e/` folder

- [ ] Write E2E test: user registration
  - Navigate to /auth
  - Click "Register" tab
  - Fill registration form
  - Submit form
  - Verify success message (or redirect to Cidaas)
  - Note: May need to mock Cidaas for E2E

- [ ] Write E2E test: complete checkout flow
  - Login as user (or create test user)
  - Navigate to /produkte
  - Click product
  - Click "In den Warenkorb"
  - Navigate to /warenkorb
  - Click "Zur Kasse"
  - Fill checkout form
  - Mock PayPal payment (or use sandbox)
  - Verify order confirmation page

### Production Docker Setup

- [ ] Create Dockerfile (production)
  - File: `Dockerfile`
  - Multi-stage build (see docs/TECH_STACK.md#dockerfile)
  - Build stage: Install deps, build Nuxt
  - Production stage: Copy .output, run server
  - Optimize for size (alpine, minimal layers)

- [ ] Create docker-compose.yml (production)
  - File: `docker-compose.yml`
  - Services: app, db, redis, worker (BullMQ worker)
  - Volumes: postgres_data, redis_data
  - Networks: app-network
  - Health checks for all services
  - Secrets for sensitive data
  - See: docs/TECH_STACK.md#docker-compose

### CI/CD Pipeline

- [ ] Configure GitLab CI/CD
  - File: `.gitlab-ci.yml`
  - Stages: build, test, deploy-staging, deploy-production
  - Build stage:
    - Build Docker image
    - Push to registry
  - Test stage:
    - Run unit tests
    - Run E2E tests
    - Check test coverage
  - Deploy-staging stage:
    - Deploy to staging automatically on main branch
  - Deploy-production stage:
    - Manual trigger required
  - See: docs/TECH_STACK.md#gitlab-ci

- [ ] Test production build

  ```bash
  pnpm build
  pnpm preview
  ```

  - Verify build completes without errors
  - Verify production server runs
  - Test production build locally with Docker:

  ```bash
  docker build -t experimenta-app:latest .
  docker run -p 3000:3000 experimenta-app:latest
  ```

### Deployment

- [ ] Setup staging environment
  - Server: Hetzner VPS or VM (Proxmox)
  - Domain: staging.my.experimenta.science
  - SSL: Let's Encrypt (automatic)
  - Reverse Proxy: Nginx or Traefik
  - Docker Compose with staging config
  - Environment: STAGING

- [ ] Deploy to staging
  - Use GitLab CI/CD or manual deploy
  - Verify deployment successful
  - Run smoke tests on staging
  - Test full user flow on staging

- [ ] Final QA on staging
  - Test all features:
    - User registration & login
    - Product browsing
    - Add to cart
    - Checkout
    - PayPal payment (sandbox)
    - Order confirmation
    - Order history
  - Test on multiple devices/browsers
  - Test language switching (DE/EN)
  - Test error scenarios

- [ ] Document deployment process
  - Document staging deployment steps
  - Document production deployment steps
  - Document rollback procedure
  - Document database migration process
  - Document secrets management
  - Document monitoring and logging

- [ ] Deploy to production 🚀
  - Server: Hetzner dedicated/VPS
  - Domain: my.experimenta.science
  - SSL: Let's Encrypt
  - Reverse Proxy: Nginx or Traefik
  - Docker Compose with production config
  - Environment: PRODUCTION
  - PayPal: LIVE mode
  - X-API: Production endpoint
  - Cidaas: Production credentials
  - Database backups enabled

---

## Acceptance Criteria

- [x] Vitest is set up and running
- [x] Unit tests cover critical utilities and endpoints
- [x] Playwright is set up and running
- [x] E2E tests cover registration and checkout flows
- [x] Production Dockerfile is optimized and working
- [x] docker-compose.yml for production is complete
- [x] GitLab CI/CD pipeline is configured
- [x] Production build works locally
- [x] Staging environment is set up and accessible
- [x] Deployed to staging successfully
- [x] QA testing on staging passes
- [x] Deployment process is documented
- [x] Deployed to production successfully 🎉
- [x] Production app is accessible and functional
- [x] Monitoring and error tracking are active

---

## Notes

- **Test Coverage Goal:** 70%+ for critical code paths
- **E2E Testing:** Focus on happy path for MVP (error scenarios in later phases)
- **Docker Production:** Use Docker Secrets for sensitive data (not env vars)
- **CI/CD:** Auto-deploy to staging, manual approval for production
- **Monitoring:** Setup Sentry or similar for error tracking (optional for MVP)
- **Backups:** Daily automated database backups with 7-day retention

---

## Blockers

- ⚠️ **Production Servers:** Need access to production servers
- ⚠️ **Production Credentials:** Need production credentials for Cidaas, PayPal, X-API
- ⚠️ **Domain DNS:** Need to point domain to production server

---

## Related Documentation

- [docs/TECH_STACK.md: Testing](../docs/TECH_STACK.md#12-testing)
- [docs/TECH_STACK.md: Docker](../docs/TECH_STACK.md#11-deployment--infrastructure)
- [docs/TECH_STACK.md: CI/CD](../docs/TECH_STACK.md#cicd-mit-gitlab)
- [README.md: Development Setup](../README.md#lokale-entwicklung)

---

## Post-Launch

After successful production launch:

- [ ] Monitor error rates (Sentry or logs)
- [ ] Monitor queue performance (BullBoard)
- [ ] Monitor PayPal transaction success rate
- [ ] Monitor X-API submission success rate
- [ ] Gather user feedback
- [ ] Plan Phase 2 features (Educator roles, etc.)

---

**🎉 Congratulations on launching the MVP! 🎉**
