# AGENTS.md – HMS Licht & Ton Build & Test Guide
> **Projekt:** hms-licht-ton (ID 30)
> **Stack:** Nuxt 3 (Frontend) + FastAPI (Backend) + PostgreSQL + Redis
> **Deployment:** Coolify (Docker) auf coolify-01
---
## 1. Build & Test Commands
### 1.1 Frontend (Nuxt 3)
```bash
# Install dependencies
cd frontend && npm ci
# Development server (http://localhost:3000)
cd frontend && npm run dev
# Production build
cd frontend && npm run build
# Preview production build
cd frontend && npm run preview
# Generate static site (SSG pages)
cd frontend && npm run generate
# Unit tests (Vitest)
cd frontend && npx vitest run --reporter verbose
# Watch mode
cd frontend && npx vitest
# Coverage report
cd frontend && npx vitest run --coverage
# E2E tests (Playwright)
cd frontend && npx playwright test
# Specific E2E test
cd frontend && npx playwright test --grep 'Mietkatalog'
# Lint
cd frontend && npm run lint
# Type check
cd frontend && npm run typecheck
```
### 1.2 Backend (FastAPI)
```bash
# Install dependencies
cd backend && pip install -r requirements.txt
# Development server (http://localhost:8000)
cd backend && uvicorn app.main:app --reload --host 0.0.0.0 --port 8000
# Run all tests
cd backend && python -m pytest tests/ -v
# Run with coverage
cd backend && python -m pytest tests/ -v --cov=app --cov-report=term-missing
# Specific test file
cd backend && python -m pytest tests/test_equipment_router.py -v
# Specific test
cd backend && python -m pytest tests/test_rentman_import.py::test_paginated_import -v
# Database migrations
cd backend && alembic upgrade head
cd backend && alembic revision --autogenerate -m "description"
# Seed admin user
cd backend && python -m app.scripts.seed_admin
```
### 1.3 Docker / Full Stack
```bash
# Build all containers
docker compose build
# Start all services
docker compose up -d
# View logs
docker compose logs -f backend
docker compose logs -f frontend
# Health check
curl -s http://localhost:8000/api/health
# Stop all services
docker compose down
# Reset volumes (DESTRUCTIVE)
docker compose down -v
```
### 1.4 Integration Tests (Full Stack)
```bash
# Start backend + DB + Redis
docker compose up -d backend postgres redis
# Wait for health
curl -s http://localhost:8000/api/health | grep ok
# Run backend tests
cd backend && python -m pytest tests/ -v
# Start frontend
docker compose up -d frontend
# Run E2E tests
cd frontend && npx playwright test
```
---
## 2. Test Rules (MANDATORY)
### 2.1 TDD Principle
- **Write tests first, then implementation.** Tests define the contract.
- Tests MUST be written before or alongside the implementation code.
- Never commit code without corresponding tests.
- Coverage target: **>= 80%** for all modules.
### 2.2 Do NOT Modify Tests
- **Never modify existing tests to make them pass.**
- If a test fails, fix the implementation, not the test.
- Tests are the source of truth for expected behavior.
- If a test is genuinely wrong, flag it in a PR and explain why.
- Only the original test author or a reviewer may modify tests.
### 2.3 Test File Naming
**Frontend:**
- Unit tests: `frontend/tests/unit/*.test.ts`
- E2E tests: `frontend/tests/e2e/*.spec.ts`
- Fixtures: `frontend/tests/fixtures/*`
- Mocks: `frontend/tests/mocks/*`
**Backend:**
- Unit/Integration tests: `backend/tests/test_*.py`
- Fixtures: `backend/tests/conftest.py`
- Factories: `backend/tests/factories.py`
- Mocks: `backend/tests/mocks/`
### 2.4 Test Categories
| Category | Tool | Scope | When to Run |
|----------|------|-------|-------------|
| Unit | Vitest / Pytest | Functions, composables, stores, services | Every commit |
| Component | Vitest + Vue Test Utils | Vue components, props, emits | Every commit |
| Integration | Pytest + TestClient | API endpoints, DB operations | Every commit |
| E2E | Playwright | Full page flows, forms, navigation | Pre-merge, nightly |
| Smoke | curl scripts | API health, endpoints | Post-deploy |
### 2.5 Mocking Rules
- **Rentman API:** Always mock in tests. Never call live Rentman API.
- Use `unittest.mock.patch` or `responses` library
- Mock `GET /equipment` with paginated test data
- Mock `POST /projectrequests` with fake response IDs
- **SMTP:** Always mock email sending in tests.
- Mock `aiosmtplib.send` to capture sent emails
- Verify email content, not actual delivery
- **Database:** Use SQLite in-memory or test PostgreSQL instance.
- Never run tests against production database
- Use separate test database: `DATABASE_URL=sqlite+aiosqlite:///test.db`
---
## 3. Coding Conventions
### 3.1 Frontend (Vue 3 + TypeScript)
```typescript
// Use Composition API with
```
**Rules:**
- Use `