{"numTotalTests":32,"numPassedTests":30,"numFailedTests":2,"numPendingTests":0,"testResults":[{"testFilePath":"/home/user/project/src/__tests__/api.test.js","status":"failed","startTime":1716900000000,"endTime":1716900001234,"message":"","testResults":[{"fullName":"GET /users returns list of users","status":"passed","failureMessages":[],"ancestorTitles":["GET /users"],"title":"returns list of users","duration":45},{"fullName":"GET /users filters by role","status":"passed","failureMessages":[],"ancestorTitles":["GET /users"],"title":"filters by role","duration":23},{"fullName":"POST /users creates new user","status":"failed","failureMessages":["Error: expected 201, received 400\n  Body: {\"error\":\"email already exists\"}\n    at Object.<anonymous> (src/__tests__/api.test.js:67:18)\n    at Promise.resolve (native)"],"ancestorTitles":["POST /users"],"title":"creates new user","duration":89},{"fullName":"DELETE /users/:id soft deletes user","status":"passed","failureMessages":[],"ancestorTitles":["DELETE /users/:id"],"title":"soft deletes user","duration":34}]},{"testFilePath":"/home/user/project/src/__tests__/auth.test.js","status":"failed","startTime":1716900001300,"endTime":1716900002100,"message":"","testResults":[{"fullName":"JWT verify accepts valid token","status":"passed","failureMessages":[],"ancestorTitles":["JWT"],"title":"verify accepts valid token","duration":12},{"fullName":"JWT verify rejects expired token","status":"passed","failureMessages":[],"ancestorTitles":["JWT"],"title":"verify rejects expired token","duration":11},{"fullName":"JWT refresh rotates token","status":"failed","failureMessages":["TypeError: Cannot read properties of undefined (reading 'accessToken')\n    at refreshToken (src/auth.js:45:23)\n    at Object.<anonymous> (src/__tests__/auth.test.js:88:5)"],"ancestorTitles":["JWT"],"title":"refresh rotates token","duration":156}]},{"testFilePath":"/home/user/project/src/__tests__/utils.test.js","status":"passed","startTime":1716900002200,"endTime":1716900002800,"message":"","testResults":[{"fullName":"slugify converts spaces to hyphens","status":"passed","failureMessages":[],"ancestorTitles":["slugify"],"title":"converts spaces to hyphens","duration":3},{"fullName":"slugify lowercases string","status":"passed","failureMessages":[],"ancestorTitles":["slugify"],"title":"lowercases string","duration":2},{"fullName":"truncate cuts at word boundary","status":"passed","failureMessages":[],"ancestorTitles":["truncate"],"title":"cuts at word boundary","duration":2}]}],"success":false,"startTime":1716900000000,"wasInterrupted":false}
