{"numTotalTests":47,"numPassedTests":45,"numFailedTests":2,"numPendingTests":0,"testResults":[{"name":"/Users/dev/app/src/auth/auth.test.ts","assertionResults":[{"fullName":"AuthService login succeeds with valid credentials","status":"passed","failureMessages":[],"ancestorTitles":["AuthService"],"title":"login succeeds with valid credentials","duration":12},{"fullName":"AuthService login fails with invalid password","status":"passed","failureMessages":[],"ancestorTitles":["AuthService"],"title":"login fails with invalid password","duration":8},{"fullName":"AuthService token refresh works correctly","status":"failed","failureMessages":["AssertionError: expected 200, received 401\nat Object.<anonymous> (/Users/dev/app/src/auth/auth.test.ts:45:5)"],"ancestorTitles":["AuthService"],"title":"token refresh works correctly","duration":23},{"fullName":"AuthService logout clears session","status":"passed","failureMessages":[],"ancestorTitles":["AuthService"],"title":"logout clears session","duration":5}]},{"name":"/Users/dev/app/src/billing/billing.test.ts","assertionResults":[{"fullName":"BillingService charge processes payment","status":"passed","failureMessages":[],"ancestorTitles":["BillingService"],"title":"charge processes payment","duration":45},{"fullName":"BillingService charge handles declined card","status":"passed","failureMessages":[],"ancestorTitles":["BillingService"],"title":"charge handles declined card","duration":31},{"fullName":"BillingService invoice generation creates correct total","status":"failed","failureMessages":["AssertionError: expected 99.99 to equal 109.99\nat Object.<anonymous> (/Users/dev/app/src/billing/billing.test.ts:88:12)"],"ancestorTitles":["BillingService"],"title":"invoice generation creates correct total","duration":18}]},{"name":"/Users/dev/app/src/utils/format.test.ts","assertionResults":[{"fullName":"formatCurrency rounds to 2 decimal places","status":"passed","failureMessages":[],"ancestorTitles":["formatCurrency"],"title":"rounds to 2 decimal places","duration":2},{"fullName":"formatCurrency handles negative numbers","status":"passed","failureMessages":[],"ancestorTitles":["formatCurrency"],"title":"handles negative numbers","duration":1},{"fullName":"formatDate returns ISO string","status":"passed","failureMessages":[],"ancestorTitles":["formatDate"],"title":"returns ISO string","duration":3}]},{"name":"/Users/dev/app/src/components/Button.test.tsx","assertionResults":[{"fullName":"Button renders with primary variant","status":"passed","failureMessages":[],"ancestorTitles":["Button"],"title":"renders with primary variant","duration":15},{"fullName":"Button renders with secondary variant","status":"passed","failureMessages":[],"ancestorTitles":["Button"],"title":"renders with secondary variant","duration":14},{"fullName":"Button calls onClick handler","status":"passed","failureMessages":[],"ancestorTitles":["Button"],"title":"calls onClick handler","duration":8},{"fullName":"Button shows loading spinner","status":"passed","failureMessages":[],"ancestorTitles":["Button"],"title":"shows loading spinner","duration":11}]}],"startTime":1716900000000,"success":false,"testsuites":{"errors":0,"failures":2,"skipped":0,"tests":47,"time":0.453}}
