test(T05): contact router, rental router, email service, rate limiting tests + retry queue

This commit is contained in:
Implementation Engineer
2026-07-10 01:05:58 +02:00
parent db5080df48
commit e220ff7db9
17 changed files with 780 additions and 89 deletions
+18 -3
View File
@@ -6,11 +6,11 @@ from fastapi.middleware.cors import CORSMiddleware
from apscheduler.schedulers.asyncio import AsyncIOScheduler
from app.config import get_settings
from app.database import engine, init_db
from app.database import engine, init_db, async_session
from app.cache import cache
from app.routers import equipment, health, admin, rental_requests, contact
from app.services.sync_service import SyncService
from app.database import async_session
from app.services.email_service import EmailService
logger = logging.getLogger(__name__)
settings = get_settings()
@@ -27,6 +27,14 @@ async def run_equipment_sync() -> None:
logger.info("Scheduled sync complete: %s", result)
async def run_email_retry() -> None:
"""Scheduled job: retry failed emails every 15 minutes."""
logger.info("Starting scheduled email retry")
async with async_session() as db:
sent = await EmailService.retry_failed_emails(db)
logger.info("Email retry complete: %d emails sent", sent)
@asynccontextmanager
async def lifespan(app: FastAPI):
"""Application lifespan: init DB, start scheduler, connect cache."""
@@ -44,8 +52,15 @@ async def lifespan(app: FastAPI):
id="equipment_sync",
replace_existing=True,
)
scheduler.add_job(
run_email_retry,
trigger="cron",
minute="*/15",
id="email_retry",
replace_existing=True,
)
scheduler.start()
logger.info("APScheduler started with equipment_sync job (every 6h)")
logger.info("APScheduler started with equipment_sync (every 6h) and email_retry (every 15min)")
yield