Files
hms-licht-ton/backend/test_report.md
T

65 lines
3.5 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Test Report T05: Email Service + Contact & Rental Request Backend
## Test Commands
### Targeted T05 Tests
```bash
python -m pytest tests/test_contact_router.py tests/test_rental_router.py tests/test_email_service.py tests/test_rate_limiting.py -v
```
**Result: 23 passed in 0.81s**
### Full Suite with Coverage
```bash
python -m pytest tests/ -v --cov=app --cov-report=term-missing
```
**Result: 57 passed, 4 warnings in 7.31s**
**Coverage: 78% overall**
## Test Files Created
### tests/test_contact_router.py (6 tests)
- test_contact_valid_returns_200 POST /api/contact valid → 200, success=True
- test_contact_invalid_email_returns_422 invalid email → 422
- test_contact_privacy_consent_false_returns_422 privacy_consent=false → 422
- test_contact_triggers_email mock EmailService.send_contact_email called with correct data
- test_contact_saved_to_db Contact record saved with email_sent=True
- test_contact_email_failure_does_not_break_response email failure still returns 200
### tests/test_rental_router.py (7 tests)
- test_rental_valid_returns_201 valid POST → 201 with HMS-YYYY-NNNNN reference
- test_rental_date_end_before_start_returns_422 date_end < date_start → 422
- test_rental_empty_items_returns_422 empty items array → 422
- test_rental_saved_to_db RentalRequest + RentalRequestItem saved, rentman_sync_status=success
- test_rental_triggers_rentman RentmanService.create_project_request + add_equipment_to_request called
- test_rental_triggers_email EmailService.send_rental_confirmation called with ref + items
- test_rental_rentman_failure_still_returns_201 Rentman failure still returns 201
### tests/test_email_service.py (7 tests)
- test_send_contact_email_success aiosmtplib.send called, MIMEMultipart contains name + message
- test_send_rental_confirmation_success email contains reference_number + items
- test_send_email_smtp_failure_returns_false SMTP exception → returns False, no crash
- test_send_contact_email_smtp_failure_returns_false contact email SMTP failure → False
- test_send_rental_confirmation_smtp_failure_returns_false rental email SMTP failure → False
- test_send_email_failure_saves_to_queue failed email saved to email_queue table
- test_retry_failed_emails_resends_pending retry sends queued email, marks as sent
### tests/test_rate_limiting.py (3 tests)
- test_contact_rate_limit_allows_5_blocks_6th 5 requests OK, 6th → 429
- test_rental_rate_limit_allows_5_blocks_6th 5 requests OK, 6th → 429
- test_contact_rate_window_reset rate window reset allows new requests after TTL
## New Feature: Email Retry Queue
- `app/models/email_queue.py` EmailQueue model (id, to_addr, subject, html_body, text_body, reply_to, status, attempts, created_at, updated_at)
- `app/services/email_service.py` send_email now accepts optional `db` param; on SMTP failure saves to queue
- `EmailService.retry_failed_emails(db)` static method to retry pending emails (max 5 attempts)
- `app/main.py` APScheduler job `run_email_retry` every 15 minutes
- Routers updated to pass `db` to email service methods
## Smoke Test
- All 57 tests pass (23 new T05 + 34 existing)
- No existing tests broken
- Coverage: 78% overall, email_service 90%, contact.py 67%, rental_requests.py 46%
- Rate limiting works via mock cache.incr_rate with sequential return values
- Email queue persistence verified with in-memory SQLite
- Retry mechanism verified: pending → sent on success