# Test Report – T03 Backend Core ## Task T03: Backend Core – FastAPI + DB Models + Equipment API + Redis Cache + Health ## Date 2026-07-09 ## Test Commands Run ### 1. pytest (all tests) ``` cd backend && python -m pytest tests/ -v --cov=app --cov-report=term-missing ``` ### 2. App import check ``` cd backend && python -c 'from app.main import app; print(app.title)' ``` Output: `HMS Licht & Ton API` ## Test Results **28 tests, all passed, 0 warnings** | Test File | Tests | Status | |----------|-------|--------| | test_cache.py | 8 | ALL PASS | | test_contact_router.py | 5 | ALL PASS | | test_equipment_router.py | 9 | ALL PASS | | test_health.py | 1 | ALL PASS | | test_models.py | 5 | ALL PASS | ## Coverage Report ``` Name Stmts Miss Cover Missing ------------------------------------------------------------ app/__init__.py 0 0 100% app/cache.py 62 13 79% app/config.py 19 0 100% app/database.py 11 2 82% app/main.py 18 3 83% app/models/__init__.py 6 0 100% app/models/admin_user.py 10 0 100% app/models/contact.py 14 0 100% app/models/equipment.py 22 0 100% app/models/rental_request.py 40 0 100% app/models/sync_log.py 15 0 100% app/routers/__init__.py 0 0 100% app/routers/contact.py 17 1 94% app/routers/equipment.py 60 15 75% app/routers/health.py 17 3 82% app/schemas/__init__.py 3 0 100% app/schemas/contact.py 16 0 100% app/schemas/equipment.py 33 0 100% ------------------------------------------------------------ TOTAL 363 37 90% ``` **Overall coverage: 90% (target: 80%)** ## Acceptance Criteria Verification 1. ✅ GET /api/health returns 200 with status, db, redis fields 2. ✅ GET /api/equipment returns 200 with paginated response (items, total, page, page_size, total_pages) 3. ✅ GET /api/equipment?search=K2 returns only matching items 4. ✅ GET /api/equipment?category=Lautsprecher returns only matching items 5. ✅ GET /api/equipment?sort=name_desc returns items sorted descending 6. ✅ GET /api/equipment/categories returns 200 with array of category strings 7. ✅ GET /api/equipment/{id} returns 200 with full equipment detail for valid ID 8. ✅ GET /api/equipment/999999 returns 404 9. ✅ Redis caches equipment list (via fakeredis test) 10. ✅ All 6 DB models defined with correct columns and indexes 11. ✅ POST /api/contact returns 201 with valid data 12. ✅ POST /api/contact returns 422 with invalid email 13. ✅ POST /api/contact returns 422 with privacy_consent=False 14. ✅ Rate limiting active (6th request returns 429) ## Smoke Test - App starts: `python -c 'from app.main import app; print(app.title)'` → "HMS Licht & Ton API" - All endpoints tested via ASGITransport with in-memory SQLite + fakeredis - No real Redis or PostgreSQL needed for tests