SignalMint v3.3 test matrix. All backend scripts run from server/ with Postgres up (docker compose up -d).
Set-Location "D:\SMS Marketing App"
docker compose up -d
Set-Location "D:\SMS Marketing App\server"
Copy-Item .env.example .env # first time only
npm install
npm run migrate
npm run seed
npm run dev # terminal 1Optional worker (browser lane):
docker compose up -d automation-worker
# or: cd automation-worker && uvicorn main:app --port 5055| Command | What it checks |
|---|---|
npm run smoke |
End-to-end API: auth, send, webhooks, STOP, campaigns, audit |
npm run test:all |
Full automated suite (see below) |
Set-Location "D:\SMS Marketing App\server"
npm run test:state # Message/campaign/conversation state machines
npm run test:message-audit # Audit log on status transitions
npm run test:dialers:unit # All 9 adapter unit tests (no API)
npm run test:dialers # Integration send per adapter (API running)
npm run test:browser # Browser lane dispatch (worker required)
npm run test:browser-session # Session store + re-login detection
npm run test:campaign-queue # Async campaign enqueue
npm run test:campaign-fanout # Multi-recipient fan-out
npm run test:campaign-bullmq # BullMQ + Redis (skips without REDIS_URL)
npm run test:compliance # Suppression summary + export API
npm run test:live-readiness # Live mode blockers checklist
npm run test:webhook-replay # Dead-letter retry
npm run test:deploy-readiness # Deploy blueprint + health
npm run test:enterprise # Org isolation, branding, API keys
# Or run the bundled suite:
npm run test:all
# Load (adjust counts for your machine)
$env:LOAD_TEST_COUNT=50; $env:LOAD_TEST_CONCURRENCY=5; npm run test:load
npm run test:load:stress # 1000 messagesSmoke test refuses live SMS unless SMOKE_ALLOW_LIVE=true.
CI runs the full suite on push (see .github/workflows/deploy.yml).
Set-Location "D:\SMS Marketing App\client-app"
npm install
npm run build
npm start # http://localhost:3000Playwright E2E (optional):
npx playwright install chromium
npm run test:e2e- Login:
user1@demo.local/password123(after seed). - Messages → open conversation → send reply.
- Contacts → add opted-in contact.
- Numbers → add sender, set default.
- New Text → send → status
sent_mock. - Compliance → view suppressions, export CSV.
- Reports → filter by date range.
- Mobile: narrow viewport → inbox list/chat toggle.
- Rotate any exposed secrets first (SECRETS-RUNBOOK.md).
- Set in
server/.env:SMS_SANDBOX_MODE=false,VONAGE_MOCK_MODE=false- Provider credentials +
PUBLIC_BACKEND_URL
- Restart API.
- Super Admin → Providers → connection test → one live SMS.
- Configure provider webhooks to URLs shown in Super Admin.
ngrok http 5000- Set Vonage inbound URL to
https://<ngrok>/webhooks/vonage/inbound - SMS your sender number → appears in Messages.
- Reply
STOP→ contact unsubscribed, future sends blocked.
- With
VONAGE_SIGNATURE_SECRET: unsigned requests →401. - Without secret in development: allowed with warning.
- Production without secret:
401.
POST /webhooks/vonage/status with provider message ID + delivered → message status updates.
Failed webhook processing → webhook_dead_letters table. Super Admin observability → replay.
| Role | Password | |
|---|---|---|
| Super Admin | super_admin@signalmint.local |
password123 |
| Admin | admin@ftsolutions.local |
password123 |
| User | user1@demo.local |
password123 |