Smoke Test Checklist
Run this checklist immediately after every deployment — initial migration or subsequent release. Do not hand off to users until every item passes.
Items are ordered by failure impact: the ones at the top will block everything else if they fail.
1. Infrastructure
- [ ] EC2 instance is reachable via SSH
- [ ]
docker compose psshows all containers asrunning(django, celeryworker, celerybeat) - [ ] Django can reach RDS:
docker compose exec django python manage.py dbshellopens a MySQL prompt - [ ] Django can reach Redis:
docker compose exec django python -c "import redis; r=redis.from_url('$CELERY_BROKER_URL'); print(r.ping())"
2. API
- [ ]
https://api.your-domain.com/api/schema/returns HTTP 200 and the OpenAPI JSON - [ ]
https://api.your-domain.com/api/schema/swagger-ui/loads Swagger UI in the browser - [ ] Health check endpoint responds:
https://api.your-domain.com/ping/(or equivalent) - [ ] HTTPS certificate is valid — no browser warning, cert issued by Let's Encrypt
3. Authentication
- [ ] A superuser can log in via the Django admin (
/ADMIN_URL/) - [ ] A superuser can log in via the portals frontend
- [ ] A wrong-password login returns a 400/401 error (not a 500)
- [ ] JWT token refresh works — log in, wait, confirm the session stays alive
4. Multi-tenancy
- [ ] Log in via a Nova Health First org URL (
/login/<nova-token>) — correct org branding appears - [ ] Log in via an Essential Home Health org URL — different org branding appears
- [ ] A MASTER-role user can see all organisations
- [ ] An ADMIN-role user can only see their own organisation's data
5. File storage (S3)
- [ ] Run
collectstaticand confirm static assets load in the browser (no 404s on CSS/JS) - [ ] Upload a file through the portals UI — confirm it lands in the private S3 bucket
- [ ] Access a private file via the presigned URL it generates — confirm it opens and expires after the configured window
- [ ] Public static files are served from the public S3 bucket (check the asset URL in browser devtools)
6. PDF pipeline ⚠️
This is the most common silent failure. The app starts and logs in fine without
nova.p12— the failure only appears when a document is signed.
- [ ] Assign a form to a test user as an admin
- [ ] Complete and submit the form as that user
- [ ] Confirm a PDF is generated (appears in the user's documents section)
- [ ] Open the PDF and confirm it has a digital signature applied
- [ ] Check the Celery worker logs — no
FileNotFoundErrororPKCS12Error:bashdocker compose logs celeryworker | grep -i "error\|nova.p12\|pkcs12"
If this step fails, the symptom is a document stuck in a pending/processing state indefinitely. Fix: verify secrets/nova.p12 is mounted at the correct path and PYHANKO_P12_PASSWORD is correct.
7. Email (SendGrid)
- [ ] Trigger a password reset email — confirm it is received
- [ ] Check the sender address is a Nova Home Care address (not
medicalwebexperts.com) - [ ] Check SendGrid dashboard for delivery status — no bounces or blocks
- [ ] Confirm SPF and DKIM are passing (visible in SendGrid's domain authentication page)
8. Celery
- [ ]
docker compose logs celeryworkershows workers started with no errors - [ ]
docker compose logs celerybeatshows the beat scheduler started - [ ] In Django admin → Periodic Tasks — confirm scheduled tasks are listed
- [ ] Trigger a manual task and confirm it completes:bash
docker compose exec django python manage.py shell -c \ "from celery import current_app; current_app.send_task('your.task.name')"
9. Portals frontend
- [ ] Frontend loads at the production URL with no console errors
- [ ] Organisation-specific login URL routes to the correct branded login page
- [ ] After login, the correct role dashboard is shown (MASTER sees all orgs, ADMIN sees one)
- [ ] API calls from the frontend reach the Django backend (check browser Network tab — no CORS errors)
10. Automated tests
Run the Cypress login suite against the production URL as a final gate:
cd testing
DEV=https://your-domain.com/login/<nova-token> pnpm run:loginExpected: 18/21 passing (3 known failures due to brittle Chakra selector — see To Review).
If passing count drops below 18, investigate before handing off.
Sign-off
| Check | Passed by | Date |
|---|---|---|
| Infrastructure (1) | ||
| API (2) | ||
| Authentication (3) | ||
| Multi-tenancy (4) | ||
| File storage (5) | ||
| PDF pipeline (6) | ||
| Email (7) | ||
| Celery (8) | ||
| Frontend (9) | ||
| Automated tests (10) |