Add comprehensive load testing infrastructure: - k6 auth-dashboard flow (login → profile → dashboard KPIs → widgets → refresh → logout) - k6 CRUD flow (units, vendors, journal entries, payments, reports) - Environment configs with staging/production/local thresholds - Parameterized user pool CSV matching app roles - New Relic NRQL query library (25+ queries for perf analysis) - Empty baseline.json structure for all tested endpoints - CLAUDE.md documenting full stack, auth, route map, and conventions Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
142 lines
5.4 KiB
JSON
142 lines
5.4 KiB
JSON
{
|
||
"_meta": {
|
||
"capturedAt": null,
|
||
"environment": "staging",
|
||
"k6Version": null,
|
||
"vus": null,
|
||
"duration": null,
|
||
"notes": "Empty baseline – populate after first stable load test run"
|
||
},
|
||
"auth": {
|
||
"POST /api/auth/login": {
|
||
"p50": null,
|
||
"p95": null,
|
||
"p99": null,
|
||
"errorRate": null,
|
||
"rps": null
|
||
},
|
||
"POST /api/auth/refresh": {
|
||
"p50": null,
|
||
"p95": null,
|
||
"p99": null,
|
||
"errorRate": null,
|
||
"rps": null
|
||
},
|
||
"POST /api/auth/logout": {
|
||
"p50": null,
|
||
"p95": null,
|
||
"p99": null,
|
||
"errorRate": null,
|
||
"rps": null
|
||
},
|
||
"GET /api/auth/profile": {
|
||
"p50": null,
|
||
"p95": null,
|
||
"p99": null,
|
||
"errorRate": null,
|
||
"rps": null
|
||
}
|
||
},
|
||
"dashboard": {
|
||
"GET /api/reports/dashboard": {
|
||
"p50": null,
|
||
"p95": null,
|
||
"p99": null,
|
||
"errorRate": null,
|
||
"rps": null
|
||
},
|
||
"GET /api/reports/balance-sheet": {
|
||
"p50": null,
|
||
"p95": null,
|
||
"p99": null,
|
||
"errorRate": null,
|
||
"rps": null
|
||
},
|
||
"GET /api/reports/income-statement": {
|
||
"p50": null,
|
||
"p95": null,
|
||
"p99": null,
|
||
"errorRate": null,
|
||
"rps": null
|
||
},
|
||
"GET /api/reports/aging": {
|
||
"p50": null,
|
||
"p95": null,
|
||
"p99": null,
|
||
"errorRate": null,
|
||
"rps": null
|
||
},
|
||
"GET /api/health-scores/latest": {
|
||
"p50": null,
|
||
"p95": null,
|
||
"p99": null,
|
||
"errorRate": null,
|
||
"rps": null
|
||
},
|
||
"GET /api/reports/cash-flow": {
|
||
"p50": null,
|
||
"p95": null,
|
||
"p99": null,
|
||
"errorRate": null,
|
||
"rps": null
|
||
},
|
||
"GET /api/reports/cash-flow-forecast": {
|
||
"p50": null,
|
||
"p95": null,
|
||
"p99": null,
|
||
"errorRate": null,
|
||
"rps": null
|
||
}
|
||
},
|
||
"crud": {
|
||
"units": {
|
||
"GET /api/units": { "p50": null, "p95": null, "p99": null, "errorRate": null, "rps": null },
|
||
"POST /api/units": { "p50": null, "p95": null, "p99": null, "errorRate": null, "rps": null },
|
||
"GET /api/units/:id": { "p50": null, "p95": null, "p99": null, "errorRate": null, "rps": null },
|
||
"PUT /api/units/:id": { "p50": null, "p95": null, "p99": null, "errorRate": null, "rps": null },
|
||
"DELETE /api/units/:id": { "p50": null, "p95": null, "p99": null, "errorRate": null, "rps": null }
|
||
},
|
||
"vendors": {
|
||
"GET /api/vendors": { "p50": null, "p95": null, "p99": null, "errorRate": null, "rps": null },
|
||
"POST /api/vendors": { "p50": null, "p95": null, "p99": null, "errorRate": null, "rps": null },
|
||
"GET /api/vendors/:id": { "p50": null, "p95": null, "p99": null, "errorRate": null, "rps": null },
|
||
"PUT /api/vendors/:id": { "p50": null, "p95": null, "p99": null, "errorRate": null, "rps": null }
|
||
},
|
||
"journalEntries": {
|
||
"GET /api/journal-entries": { "p50": null, "p95": null, "p99": null, "errorRate": null, "rps": null },
|
||
"POST /api/journal-entries": { "p50": null, "p95": null, "p99": null, "errorRate": null, "rps": null },
|
||
"GET /api/journal-entries/:id": { "p50": null, "p95": null, "p99": null, "errorRate": null, "rps": null },
|
||
"POST /api/journal-entries/:id/post": { "p50": null, "p95": null, "p99": null, "errorRate": null, "rps": null },
|
||
"POST /api/journal-entries/:id/void": { "p50": null, "p95": null, "p99": null, "errorRate": null, "rps": null }
|
||
},
|
||
"payments": {
|
||
"GET /api/payments": { "p50": null, "p95": null, "p99": null, "errorRate": null, "rps": null },
|
||
"POST /api/payments": { "p50": null, "p95": null, "p99": null, "errorRate": null, "rps": null },
|
||
"GET /api/payments/:id": { "p50": null, "p95": null, "p99": null, "errorRate": null, "rps": null },
|
||
"PUT /api/payments/:id": { "p50": null, "p95": null, "p99": null, "errorRate": null, "rps": null },
|
||
"DELETE /api/payments/:id": { "p50": null, "p95": null, "p99": null, "errorRate": null, "rps": null }
|
||
},
|
||
"accounts": {
|
||
"GET /api/accounts": { "p50": null, "p95": null, "p99": null, "errorRate": null, "rps": null },
|
||
"GET /api/accounts/trial-balance": { "p50": null, "p95": null, "p99": null, "errorRate": null, "rps": null },
|
||
"POST /api/accounts": { "p50": null, "p95": null, "p99": null, "errorRate": null, "rps": null },
|
||
"PUT /api/accounts/:id": { "p50": null, "p95": null, "p99": null, "errorRate": null, "rps": null }
|
||
},
|
||
"invoices": {
|
||
"GET /api/invoices": { "p50": null, "p95": null, "p99": null, "errorRate": null, "rps": null },
|
||
"GET /api/invoices/:id": { "p50": null, "p95": null, "p99": null, "errorRate": null, "rps": null },
|
||
"POST /api/invoices/generate-bulk": { "p50": null, "p95": null, "p99": null, "errorRate": null, "rps": null }
|
||
}
|
||
},
|
||
"boardPlanning": {
|
||
"GET /api/board-planning/scenarios": { "p50": null, "p95": null, "p99": null, "errorRate": null, "rps": null },
|
||
"POST /api/board-planning/scenarios": { "p50": null, "p95": null, "p99": null, "errorRate": null, "rps": null },
|
||
"GET /api/board-planning/scenarios/:id/projection": { "p50": null, "p95": null, "p99": null, "errorRate": null, "rps": null },
|
||
"GET /api/board-planning/budget-plans": { "p50": null, "p95": null, "p99": null, "errorRate": null, "rps": null }
|
||
},
|
||
"organizations": {
|
||
"GET /api/organizations": { "p50": null, "p95": null, "p99": null, "errorRate": null, "rps": null },
|
||
"GET /api/organizations/members": { "p50": null, "p95": null, "p99": null, "errorRate": null, "rps": null }
|
||
}
|
||
}
|