diff --git a/backend/.gitignore b/backend/.gitignore index 2eea525d..7edc32fe 100644 --- a/backend/.gitignore +++ b/backend/.gitignore @@ -1 +1,2 @@ -.env \ No newline at end of file +.env +test_results.json \ No newline at end of file diff --git a/backend/test_results.json b/backend/test_results.json deleted file mode 100644 index a6baba9b..00000000 --- a/backend/test_results.json +++ /dev/null @@ -1,2971 +0,0 @@ -{ - "numFailedTestSuites": 0, - "numFailedTests": 0, - "numPassedTestSuites": 29, - "numPassedTests": 161, - "numPendingTestSuites": 2, - "numPendingTests": 14, - "numRuntimeErrorTestSuites": 0, - "numTodoTests": 0, - "numTotalTestSuites": 31, - "numTotalTests": 175, - "openHandles": [], - "snapshot": { - "added": 0, - "didUpdate": false, - "failure": false, - "filesAdded": 0, - "filesRemoved": 0, - "filesRemovedList": [], - "filesUnmatched": 0, - "filesUpdated": 0, - "matched": 0, - "total": 0, - "unchecked": 0, - "uncheckedKeysByFile": [], - "unmatched": 0, - "updated": 0 - }, - "startTime": 1774914675298, - "success": true, - "testResults": [ - { - "assertionResults": [ - { - "ancestorTitles": ["Scores Service - bulk updates"], - "duration": null, - "failing": false, - "failureDetails": [], - "failureMessages": [], - "fullName": "Scores Service - bulk updates skipped: no database", - "invocations": 1, - "location": null, - "numPassingAsserts": 0, - "retryReasons": [], - "startAt": 1774914680139, - "status": "pending", - "title": "skipped: no database" - } - ], - "coverage": {}, - "endTime": 1774914704285, - "message": "", - "name": "C:\\Users\\USER\\Desktop\\drips\\remitlend\\backend\\src\\__tests__\\scoresService.test.ts", - "startTime": 1774914704285, - "status": "skipped", - "summary": "" - }, - { - "assertionResults": [ - { - "ancestorTitles": ["Database Services (skipped: no database)", "UserProfileService"], - "duration": null, - "failing": false, - "failureDetails": [], - "failureMessages": [], - "fullName": "Database Services (skipped: no database) UserProfileService should create a user profile", - "invocations": 1, - "location": null, - "numPassingAsserts": 0, - "retryReasons": [], - "startAt": 1774914680276, - "status": "pending", - "title": "should create a user profile" - }, - { - "ancestorTitles": ["Database Services (skipped: no database)", "UserProfileService"], - "duration": null, - "failing": false, - "failureDetails": [], - "failureMessages": [], - "fullName": "Database Services (skipped: no database) UserProfileService should find profile by public key", - "invocations": 1, - "location": null, - "numPassingAsserts": 0, - "retryReasons": [], - "startAt": 1774914680278, - "status": "pending", - "title": "should find profile by public key" - }, - { - "ancestorTitles": ["Database Services (skipped: no database)", "UserProfileService"], - "duration": null, - "failing": false, - "failureDetails": [], - "failureMessages": [], - "fullName": "Database Services (skipped: no database) UserProfileService should update a user profile", - "invocations": 1, - "location": null, - "numPassingAsserts": 0, - "retryReasons": [], - "startAt": 1774914680278, - "status": "pending", - "title": "should update a user profile" - }, - { - "ancestorTitles": ["Database Services (skipped: no database)", "UserProfileService"], - "duration": null, - "failing": false, - "failureDetails": [], - "failureMessages": [], - "fullName": "Database Services (skipped: no database) UserProfileService should upsert a user profile", - "invocations": 1, - "location": null, - "numPassingAsserts": 0, - "retryReasons": [], - "startAt": 1774914680279, - "status": "pending", - "title": "should upsert a user profile" - }, - { - "ancestorTitles": ["Database Services (skipped: no database)", "UserProfileService"], - "duration": null, - "failing": false, - "failureDetails": [], - "failureMessages": [], - "fullName": "Database Services (skipped: no database) UserProfileService should delete a user profile", - "invocations": 1, - "location": null, - "numPassingAsserts": 0, - "retryReasons": [], - "startAt": 1774914680279, - "status": "pending", - "title": "should delete a user profile" - }, - { - "ancestorTitles": ["Database Services (skipped: no database)", "LoanHistoryService"], - "duration": null, - "failing": false, - "failureDetails": [], - "failureMessages": [], - "fullName": "Database Services (skipped: no database) LoanHistoryService should create a loan history record", - "invocations": 1, - "location": null, - "numPassingAsserts": 0, - "retryReasons": [], - "startAt": 1774914680280, - "status": "pending", - "title": "should create a loan history record" - }, - { - "ancestorTitles": ["Database Services (skipped: no database)", "LoanHistoryService"], - "duration": null, - "failing": false, - "failureDetails": [], - "failureMessages": [], - "fullName": "Database Services (skipped: no database) LoanHistoryService should find loans by borrower", - "invocations": 1, - "location": null, - "numPassingAsserts": 0, - "retryReasons": [], - "startAt": 1774914680280, - "status": "pending", - "title": "should find loans by borrower" - }, - { - "ancestorTitles": ["Database Services (skipped: no database)", "LoanHistoryService"], - "duration": null, - "failing": false, - "failureDetails": [], - "failureMessages": [], - "fullName": "Database Services (skipped: no database) LoanHistoryService should update loan status", - "invocations": 1, - "location": null, - "numPassingAsserts": 0, - "retryReasons": [], - "startAt": 1774914680280, - "status": "pending", - "title": "should update loan status" - }, - { - "ancestorTitles": ["Database Services (skipped: no database)", "IndexedEventsService"], - "duration": null, - "failing": false, - "failureDetails": [], - "failureMessages": [], - "fullName": "Database Services (skipped: no database) IndexedEventsService should create an indexed event", - "invocations": 1, - "location": null, - "numPassingAsserts": 0, - "retryReasons": [], - "startAt": 1774914680281, - "status": "pending", - "title": "should create an indexed event" - }, - { - "ancestorTitles": ["Database Services (skipped: no database)", "IndexedEventsService"], - "duration": null, - "failing": false, - "failureDetails": [], - "failureMessages": [], - "fullName": "Database Services (skipped: no database) IndexedEventsService should find unprocessed events", - "invocations": 1, - "location": null, - "numPassingAsserts": 0, - "retryReasons": [], - "startAt": 1774914680282, - "status": "pending", - "title": "should find unprocessed events" - }, - { - "ancestorTitles": ["Database Services (skipped: no database)", "IndexedEventsService"], - "duration": null, - "failing": false, - "failureDetails": [], - "failureMessages": [], - "fullName": "Database Services (skipped: no database) IndexedEventsService should mark event as processed", - "invocations": 1, - "location": null, - "numPassingAsserts": 0, - "retryReasons": [], - "startAt": 1774914680282, - "status": "pending", - "title": "should mark event as processed" - }, - { - "ancestorTitles": ["Database Services (skipped: no database)", "IndexedEventsService"], - "duration": null, - "failing": false, - "failureDetails": [], - "failureMessages": [], - "fullName": "Database Services (skipped: no database) IndexedEventsService should find events by transaction hash", - "invocations": 1, - "location": null, - "numPassingAsserts": 0, - "retryReasons": [], - "startAt": 1774914680282, - "status": "pending", - "title": "should find events by transaction hash" - }, - { - "ancestorTitles": ["Database Services (skipped: no database)", "DatabaseService"], - "duration": null, - "failing": false, - "failureDetails": [], - "failureMessages": [], - "fullName": "Database Services (skipped: no database) DatabaseService should perform health check", - "invocations": 1, - "location": null, - "numPassingAsserts": 0, - "retryReasons": [], - "startAt": 1774914680283, - "status": "pending", - "title": "should perform health check" - } - ], - "coverage": {}, - "endTime": 1774914704285, - "message": "", - "name": "C:\\Users\\USER\\Desktop\\drips\\remitlend\\backend\\src\\__tests__\\database.test.ts", - "startTime": 1774914704285, - "status": "skipped", - "summary": "" - }, - { - "assertionResults": [ - { - "ancestorTitles": ["pagination and filtering"], - "duration": 248, - "failing": false, - "failureDetails": [], - "failureMessages": [], - "fullName": "pagination and filtering paginates and filters borrower loans with a consistent response envelope", - "invocations": 1, - "location": null, - "numPassingAsserts": 8, - "retryReasons": [], - "startAt": 1774914693887, - "status": "passed", - "title": "paginates and filters borrower loans with a consistent response envelope" - }, - { - "ancestorTitles": ["pagination and filtering"], - "duration": 94, - "failing": false, - "failureDetails": [], - "failureMessages": [], - "fullName": "pagination and filtering applies event filters and returns page_info for borrower transaction history", - "invocations": 1, - "location": null, - "numPassingAsserts": 11, - "retryReasons": [], - "startAt": 1774914694149, - "status": "passed", - "title": "applies event filters and returns page_info for borrower transaction history" - }, - { - "ancestorTitles": ["pagination and filtering"], - "duration": 38, - "failing": false, - "failureDetails": [], - "failureMessages": [], - "fullName": "pagination and filtering supports paginated recent events for admin dashboards", - "invocations": 1, - "location": null, - "numPassingAsserts": 5, - "retryReasons": [], - "startAt": 1774914694244, - "status": "passed", - "title": "supports paginated recent events for admin dashboards" - } - ], - "endTime": 1774914694285, - "message": "", - "name": "C:\\Users\\USER\\Desktop\\drips\\remitlend\\backend\\src\\__tests__\\paginationFiltering.test.ts", - "startTime": 1774914680341, - "status": "passed", - "summary": "" - }, - { - "assertionResults": [ - { - "ancestorTitles": ["GET /health"], - "duration": 181, - "failing": false, - "failureDetails": [], - "failureMessages": [], - "fullName": "GET /health should return 200 or 503 with a status field", - "invocations": 1, - "location": null, - "numPassingAsserts": 2, - "retryReasons": [], - "startAt": 1774914694328, - "status": "passed", - "title": "should return 200 or 503 with a status field" - }, - { - "ancestorTitles": ["GET /health"], - "duration": 26, - "failing": false, - "failureDetails": [], - "failureMessages": [], - "fullName": "GET /health should always report api check as ok", - "invocations": 1, - "location": null, - "numPassingAsserts": 2, - "retryReasons": [], - "startAt": 1774914694511, - "status": "passed", - "title": "should always report api check as ok" - }, - { - "ancestorTitles": ["GET /health"], - "duration": 15, - "failing": false, - "failureDetails": [], - "failureMessages": [], - "fullName": "GET /health should include soroban_rpc in checks", - "invocations": 1, - "location": null, - "numPassingAsserts": 2, - "retryReasons": [], - "startAt": 1774914694537, - "status": "passed", - "title": "should include soroban_rpc in checks" - }, - { - "ancestorTitles": ["GET /health"], - "duration": 16, - "failing": false, - "failureDetails": [], - "failureMessages": [], - "fullName": "GET /health should return uptime as a number", - "invocations": 1, - "location": null, - "numPassingAsserts": 2, - "retryReasons": [], - "startAt": 1774914694553, - "status": "passed", - "title": "should return uptime as a number" - }, - { - "ancestorTitles": ["GET /health"], - "duration": 20, - "failing": false, - "failureDetails": [], - "failureMessages": [], - "fullName": "GET /health should return timestamp as a number", - "invocations": 1, - "location": null, - "numPassingAsserts": 2, - "retryReasons": [], - "startAt": 1774914694570, - "status": "passed", - "title": "should return timestamp as a number" - } - ], - "endTime": 1774914694594, - "message": "", - "name": "C:\\Users\\USER\\Desktop\\drips\\remitlend\\backend\\src\\__tests__\\health.test.ts", - "startTime": 1774914676972, - "status": "passed", - "summary": "" - }, - { - "assertionResults": [ - { - "ancestorTitles": ["GET /api/events/stream"], - "duration": 197, - "failing": false, - "failureDetails": [], - "failureMessages": [], - "fullName": "GET /api/events/stream should reject unauthenticated SSE requests", - "invocations": 1, - "location": null, - "numPassingAsserts": 1, - "retryReasons": [], - "startAt": 1774914694320, - "status": "passed", - "title": "should reject unauthenticated SSE requests" - }, - { - "ancestorTitles": ["GET /api/events/stream"], - "duration": 41, - "failing": false, - "failureDetails": [], - "failureMessages": [], - "fullName": "GET /api/events/stream should reject token passed in query string", - "invocations": 1, - "location": null, - "numPassingAsserts": 1, - "retryReasons": [], - "startAt": 1774914694522, - "status": "passed", - "title": "should reject token passed in query string" - }, - { - "ancestorTitles": ["GET /api/events/stream"], - "duration": 29, - "failing": false, - "failureDetails": [], - "failureMessages": [], - "fullName": "GET /api/events/stream should reject borrower stream access for a different wallet", - "invocations": 1, - "location": null, - "numPassingAsserts": 1, - "retryReasons": [], - "startAt": 1774914694563, - "status": "passed", - "title": "should reject borrower stream access for a different wallet" - }, - { - "ancestorTitles": ["GET /api/events/status"], - "duration": 32, - "failing": false, - "failureDetails": [], - "failureMessages": [], - "fullName": "GET /api/events/status should reject requests without API key", - "invocations": 1, - "location": null, - "numPassingAsserts": 1, - "retryReasons": [], - "startAt": 1774914694593, - "status": "passed", - "title": "should reject requests without API key" - }, - { - "ancestorTitles": ["GET /api/events/status"], - "duration": 18, - "failing": false, - "failureDetails": [], - "failureMessages": [], - "fullName": "GET /api/events/status should return connection counts with valid API key", - "invocations": 1, - "location": null, - "numPassingAsserts": 6, - "retryReasons": [], - "startAt": 1774914694625, - "status": "passed", - "title": "should return connection counts with valid API key" - }, - { - "ancestorTitles": ["EventStreamService"], - "duration": 6, - "failing": false, - "failureDetails": [], - "failureMessages": [], - "fullName": "EventStreamService should track connection counts", - "invocations": 1, - "location": null, - "numPassingAsserts": 3, - "retryReasons": [], - "startAt": 1774914694646, - "status": "passed", - "title": "should track connection counts" - }, - { - "ancestorTitles": ["EventStreamService"], - "duration": 25, - "failing": false, - "failureDetails": [], - "failureMessages": [], - "fullName": "EventStreamService should subscribe and unsubscribe borrower clients", - "invocations": 1, - "location": null, - "numPassingAsserts": 2, - "retryReasons": [], - "startAt": 1774914694656, - "status": "passed", - "title": "should subscribe and unsubscribe borrower clients" - }, - { - "ancestorTitles": ["EventStreamService"], - "duration": 8, - "failing": false, - "failureDetails": [], - "failureMessages": [], - "fullName": "EventStreamService should subscribe and unsubscribe admin clients", - "invocations": 1, - "location": null, - "numPassingAsserts": 1, - "retryReasons": [], - "startAt": 1774914694682, - "status": "passed", - "title": "should subscribe and unsubscribe admin clients" - }, - { - "ancestorTitles": ["EventStreamService"], - "duration": 40, - "failing": false, - "failureDetails": [], - "failureMessages": [], - "fullName": "EventStreamService should broadcast events to borrower clients", - "invocations": 1, - "location": null, - "numPassingAsserts": 5, - "retryReasons": [], - "startAt": 1774914694691, - "status": "passed", - "title": "should broadcast events to borrower clients" - }, - { - "ancestorTitles": ["EventStreamService"], - "duration": 10, - "failing": false, - "failureDetails": [], - "failureMessages": [], - "fullName": "EventStreamService should broadcast events to admin clients", - "invocations": 1, - "location": null, - "numPassingAsserts": 4, - "retryReasons": [], - "startAt": 1774914694732, - "status": "passed", - "title": "should broadcast events to admin clients" - }, - { - "ancestorTitles": ["EventStreamService"], - "duration": 7, - "failing": false, - "failureDetails": [], - "failureMessages": [], - "fullName": "EventStreamService should not broadcast to unrelated borrower clients", - "invocations": 1, - "location": null, - "numPassingAsserts": 1, - "retryReasons": [], - "startAt": 1774914694742, - "status": "passed", - "title": "should not broadcast to unrelated borrower clients" - }, - { - "ancestorTitles": ["EventStreamService"], - "duration": 44, - "failing": false, - "failureDetails": [], - "failureMessages": [], - "fullName": "EventStreamService should enforce a maximum of three connections per user", - "invocations": 1, - "location": null, - "numPassingAsserts": 3, - "retryReasons": [], - "startAt": 1774914694750, - "status": "passed", - "title": "should enforce a maximum of three connections per user" - }, - { - "ancestorTitles": ["EventStreamService"], - "duration": 11, - "failing": false, - "failureDetails": [], - "failureMessages": [], - "fullName": "EventStreamService should close active SSE connections with a shutdown event", - "invocations": 1, - "location": null, - "numPassingAsserts": 5, - "retryReasons": [], - "startAt": 1774914694794, - "status": "passed", - "title": "should close active SSE connections with a shutdown event" - }, - { - "ancestorTitles": ["EventStreamService"], - "duration": 4, - "failing": false, - "failureDetails": [], - "failureMessages": [], - "fullName": "EventStreamService should emit replay-compatible SSE event payload from sendEvent", - "invocations": 1, - "location": null, - "numPassingAsserts": 4, - "retryReasons": [], - "startAt": 1774914694805, - "status": "passed", - "title": "should emit replay-compatible SSE event payload from sendEvent" - } - ], - "endTime": 1774914694814, - "message": "", - "name": "C:\\Users\\USER\\Desktop\\drips\\remitlend\\backend\\src\\__tests__\\eventStream.test.ts", - "startTime": 1774914677023, - "status": "passed", - "summary": "" - }, - { - "assertionResults": [ - { - "ancestorTitles": ["Input Validation", "POST /api/simulate"], - "duration": 229, - "failing": false, - "failureDetails": [], - "failureMessages": [], - "fullName": "Input Validation POST /api/simulate should accept valid input", - "invocations": 1, - "location": null, - "numPassingAsserts": 2, - "retryReasons": [], - "startAt": 1774914694253, - "status": "passed", - "title": "should accept valid input" - }, - { - "ancestorTitles": ["Input Validation", "POST /api/simulate"], - "duration": 39, - "failing": false, - "failureDetails": [], - "failureMessages": [], - "fullName": "Input Validation POST /api/simulate should reject missing userId", - "invocations": 1, - "location": null, - "numPassingAsserts": 3, - "retryReasons": [], - "startAt": 1774914694484, - "status": "passed", - "title": "should reject missing userId" - }, - { - "ancestorTitles": ["Input Validation", "POST /api/simulate"], - "duration": 29, - "failing": false, - "failureDetails": [], - "failureMessages": [], - "fullName": "Input Validation POST /api/simulate should reject missing amount", - "invocations": 1, - "location": null, - "numPassingAsserts": 2, - "retryReasons": [], - "startAt": 1774914694524, - "status": "passed", - "title": "should reject missing amount" - }, - { - "ancestorTitles": ["Input Validation", "POST /api/simulate"], - "duration": 26, - "failing": false, - "failureDetails": [], - "failureMessages": [], - "fullName": "Input Validation POST /api/simulate should reject negative amount", - "invocations": 1, - "location": null, - "numPassingAsserts": 3, - "retryReasons": [], - "startAt": 1774914694553, - "status": "passed", - "title": "should reject negative amount" - }, - { - "ancestorTitles": ["Input Validation", "POST /api/simulate"], - "duration": 25, - "failing": false, - "failureDetails": [], - "failureMessages": [], - "fullName": "Input Validation POST /api/simulate should reject amount exceeding maximum", - "invocations": 1, - "location": null, - "numPassingAsserts": 2, - "retryReasons": [], - "startAt": 1774914694580, - "status": "passed", - "title": "should reject amount exceeding maximum" - }, - { - "ancestorTitles": ["Input Validation", "POST /api/simulate"], - "duration": 20, - "failing": false, - "failureDetails": [], - "failureMessages": [], - "fullName": "Input Validation POST /api/simulate should reject zero amount", - "invocations": 1, - "location": null, - "numPassingAsserts": 2, - "retryReasons": [], - "startAt": 1774914694606, - "status": "passed", - "title": "should reject zero amount" - }, - { - "ancestorTitles": ["Input Validation", "POST /api/simulate"], - "duration": 19, - "failing": false, - "failureDetails": [], - "failureMessages": [], - "fullName": "Input Validation POST /api/simulate should reject empty userId", - "invocations": 1, - "location": null, - "numPassingAsserts": 2, - "retryReasons": [], - "startAt": 1774914694626, - "status": "passed", - "title": "should reject empty userId" - }, - { - "ancestorTitles": ["Input Validation", "POST /api/simulate"], - "duration": 35, - "failing": false, - "failureDetails": [], - "failureMessages": [], - "fullName": "Input Validation POST /api/simulate should reject userId that is too long", - "invocations": 1, - "location": null, - "numPassingAsserts": 2, - "retryReasons": [], - "startAt": 1774914694645, - "status": "passed", - "title": "should reject userId that is too long" - }, - { - "ancestorTitles": ["Input Validation", "POST /api/simulate"], - "duration": 35, - "failing": false, - "failureDetails": [], - "failureMessages": [], - "fullName": "Input Validation POST /api/simulate should reject non-numeric amount", - "invocations": 1, - "location": null, - "numPassingAsserts": 2, - "retryReasons": [], - "startAt": 1774914694680, - "status": "passed", - "title": "should reject non-numeric amount" - }, - { - "ancestorTitles": ["Input Validation", "GET /api/history/:userId"], - "duration": 19, - "failing": false, - "failureDetails": [], - "failureMessages": [], - "fullName": "Input Validation GET /api/history/:userId should accept valid userId", - "invocations": 1, - "location": null, - "numPassingAsserts": 2, - "retryReasons": [], - "startAt": 1774914694715, - "status": "passed", - "title": "should accept valid userId" - }, - { - "ancestorTitles": ["Input Validation", "GET /api/history/:userId"], - "duration": 16, - "failing": false, - "failureDetails": [], - "failureMessages": [], - "fullName": "Input Validation GET /api/history/:userId should reject empty userId", - "invocations": 1, - "location": null, - "numPassingAsserts": 1, - "retryReasons": [], - "startAt": 1774914694735, - "status": "passed", - "title": "should reject empty userId" - } - ], - "endTime": 1774914694755, - "message": "", - "name": "C:\\Users\\USER\\Desktop\\drips\\remitlend\\backend\\src\\__tests__\\validation.test.ts", - "startTime": 1774914680556, - "status": "passed", - "summary": "" - }, - { - "assertionResults": [ - { - "ancestorTitles": ["GET /api/loans/config"], - "duration": 274, - "failing": false, - "failureDetails": [], - "failureMessages": [], - "fullName": "GET /api/loans/config should return configured env values when all required vars are set", - "invocations": 1, - "location": null, - "numPassingAsserts": 2, - "retryReasons": [], - "startAt": 1774914693792, - "status": "passed", - "title": "should return configured env values when all required vars are set" - }, - { - "ancestorTitles": ["GET /api/loans/config"], - "duration": 55, - "failing": false, - "failureDetails": [], - "failureMessages": [], - "fullName": "GET /api/loans/config should return configured env values", - "invocations": 1, - "location": null, - "numPassingAsserts": 2, - "retryReasons": [], - "startAt": 1774914694068, - "status": "passed", - "title": "should return configured env values" - }, - { - "ancestorTitles": ["POST /api/loans/request"], - "duration": 110, - "failing": false, - "failureDetails": [], - "failureMessages": [], - "fullName": "POST /api/loans/request should reject unauthenticated requests", - "invocations": 1, - "location": null, - "numPassingAsserts": 1, - "retryReasons": [], - "startAt": 1774914694124, - "status": "passed", - "title": "should reject unauthenticated requests" - }, - { - "ancestorTitles": ["POST /api/loans/request"], - "duration": 75, - "failing": false, - "failureDetails": [], - "failureMessages": [], - "fullName": "POST /api/loans/request should reject when borrowerPublicKey does not match JWT", - "invocations": 1, - "location": null, - "numPassingAsserts": 1, - "retryReasons": [], - "startAt": 1774914694234, - "status": "passed", - "title": "should reject when borrowerPublicKey does not match JWT" - }, - { - "ancestorTitles": ["POST /api/loans/request"], - "duration": 80, - "failing": false, - "failureDetails": [], - "failureMessages": [], - "fullName": "POST /api/loans/request should return unsigned XDR for valid request", - "invocations": 1, - "location": null, - "numPassingAsserts": 4, - "retryReasons": [], - "startAt": 1774914694309, - "status": "passed", - "title": "should return unsigned XDR for valid request" - }, - { - "ancestorTitles": ["POST /api/loans/request"], - "duration": 39, - "failing": false, - "failureDetails": [], - "failureMessages": [], - "fullName": "POST /api/loans/request should reject missing amount", - "invocations": 1, - "location": null, - "numPassingAsserts": 1, - "retryReasons": [], - "startAt": 1774914694390, - "status": "passed", - "title": "should reject missing amount" - }, - { - "ancestorTitles": ["POST /api/loans/submit"], - "duration": 19, - "failing": false, - "failureDetails": [], - "failureMessages": [], - "fullName": "POST /api/loans/submit should reject unauthenticated requests", - "invocations": 1, - "location": null, - "numPassingAsserts": 1, - "retryReasons": [], - "startAt": 1774914694429, - "status": "passed", - "title": "should reject unauthenticated requests" - }, - { - "ancestorTitles": ["POST /api/loans/submit"], - "duration": 46, - "failing": false, - "failureDetails": [], - "failureMessages": [], - "fullName": "POST /api/loans/submit should submit a signed transaction", - "invocations": 1, - "location": null, - "numPassingAsserts": 4, - "retryReasons": [], - "startAt": 1774914694449, - "status": "passed", - "title": "should submit a signed transaction" - }, - { - "ancestorTitles": ["POST /api/loans/submit"], - "duration": 35, - "failing": false, - "failureDetails": [], - "failureMessages": [], - "fullName": "POST /api/loans/submit should reject missing signedTxXdr", - "invocations": 1, - "location": null, - "numPassingAsserts": 1, - "retryReasons": [], - "startAt": 1774914694495, - "status": "passed", - "title": "should reject missing signedTxXdr" - }, - { - "ancestorTitles": ["GET /api/loans/:loanId"], - "duration": 33, - "failing": false, - "failureDetails": [], - "failureMessages": [], - "fullName": "GET /api/loans/:loanId should return loan details for the authenticated borrower", - "invocations": 1, - "location": null, - "numPassingAsserts": 4, - "retryReasons": [], - "startAt": 1774914694531, - "status": "passed", - "title": "should return loan details for the authenticated borrower" - }, - { - "ancestorTitles": ["GET /api/loans/:loanId"], - "duration": 57, - "failing": false, - "failureDetails": [], - "failureMessages": [], - "fullName": "GET /api/loans/:loanId should return 403 when the loan belongs to another borrower", - "invocations": 1, - "location": null, - "numPassingAsserts": 1, - "retryReasons": [], - "startAt": 1774914694564, - "status": "passed", - "title": "should return 403 when the loan belongs to another borrower" - }, - { - "ancestorTitles": ["GET /api/loans/:loanId"], - "duration": 25, - "failing": false, - "failureDetails": [], - "failureMessages": [], - "fullName": "GET /api/loans/:loanId should return 404 when the loan does not exist", - "invocations": 1, - "location": null, - "numPassingAsserts": 1, - "retryReasons": [], - "startAt": 1774914694622, - "status": "passed", - "title": "should return 404 when the loan does not exist" - }, - { - "ancestorTitles": ["GET /api/loans/:loanId/amortization-schedule"], - "duration": 46, - "failing": false, - "failureDetails": [], - "failureMessages": [], - "fullName": "GET /api/loans/:loanId/amortization-schedule should return amortization schedule for an approved loan", - "invocations": 1, - "location": null, - "numPassingAsserts": 5, - "retryReasons": [], - "startAt": 1774914694648, - "status": "passed", - "title": "should return amortization schedule for an approved loan" - }, - { - "ancestorTitles": ["GET /api/loans/:loanId/amortization-schedule"], - "duration": 23, - "failing": false, - "failureDetails": [], - "failureMessages": [], - "fullName": "GET /api/loans/:loanId/amortization-schedule should return 404 when loan is not fully approved", - "invocations": 1, - "location": null, - "numPassingAsserts": 1, - "retryReasons": [], - "startAt": 1774914694694, - "status": "passed", - "title": "should return 404 when loan is not fully approved" - }, - { - "ancestorTitles": ["POST /api/loans/:loanId/repay"], - "duration": 28, - "failing": false, - "failureDetails": [], - "failureMessages": [], - "fullName": "POST /api/loans/:loanId/repay should reject unauthenticated requests", - "invocations": 1, - "location": null, - "numPassingAsserts": 1, - "retryReasons": [], - "startAt": 1774914694717, - "status": "passed", - "title": "should reject unauthenticated requests" - }, - { - "ancestorTitles": ["POST /api/loans/:loanId/repay"], - "duration": 38, - "failing": false, - "failureDetails": [], - "failureMessages": [], - "fullName": "POST /api/loans/:loanId/repay should return unsigned XDR for valid repayment", - "invocations": 1, - "location": null, - "numPassingAsserts": 4, - "retryReasons": [], - "startAt": 1774914694745, - "status": "passed", - "title": "should return unsigned XDR for valid repayment" - }, - { - "ancestorTitles": ["POST /api/loans/:loanId/repay"], - "duration": 35, - "failing": false, - "failureDetails": [], - "failureMessages": [], - "fullName": "POST /api/loans/:loanId/repay should return 403 when loan does not belong to user", - "invocations": 1, - "location": null, - "numPassingAsserts": 1, - "retryReasons": [], - "startAt": 1774914694783, - "status": "passed", - "title": "should return 403 when loan does not belong to user" - }, - { - "ancestorTitles": ["POST /api/loans/:loanId/repay"], - "duration": 31, - "failing": false, - "failureDetails": [], - "failureMessages": [], - "fullName": "POST /api/loans/:loanId/repay should reject missing amount", - "invocations": 1, - "location": null, - "numPassingAsserts": 1, - "retryReasons": [], - "startAt": 1774914694819, - "status": "passed", - "title": "should reject missing amount" - }, - { - "ancestorTitles": ["POST /api/loans/:loanId/submit"], - "duration": 25, - "failing": false, - "failureDetails": [], - "failureMessages": [], - "fullName": "POST /api/loans/:loanId/submit should submit a signed repayment transaction", - "invocations": 1, - "location": null, - "numPassingAsserts": 3, - "retryReasons": [], - "startAt": 1774914694851, - "status": "passed", - "title": "should submit a signed repayment transaction" - } - ], - "endTime": 1774914694883, - "message": "", - "name": "C:\\Users\\USER\\Desktop\\drips\\remitlend\\backend\\src\\__tests__\\loanEndpoints.test.ts", - "startTime": 1774914676999, - "status": "passed", - "summary": "" - }, - { - "assertionResults": [ - { - "ancestorTitles": ["Centralized Error Handling", "404 catch-all"], - "duration": 304, - "failing": false, - "failureDetails": [], - "failureMessages": [], - "fullName": "Centralized Error Handling 404 catch-all should return 404 with structured JSON including error code", - "invocations": 1, - "location": null, - "numPassingAsserts": 6, - "retryReasons": [], - "startAt": 1774914694538, - "status": "passed", - "title": "should return 404 with structured JSON including error code" - }, - { - "ancestorTitles": ["Centralized Error Handling", "404 catch-all"], - "duration": 52, - "failing": false, - "failureDetails": [], - "failureMessages": [], - "fullName": "Centralized Error Handling 404 catch-all should return 404 for unknown POST routes with error code", - "invocations": 1, - "location": null, - "numPassingAsserts": 3, - "retryReasons": [], - "startAt": 1774914694844, - "status": "passed", - "title": "should return 404 for unknown POST routes with error code" - }, - { - "ancestorTitles": ["Centralized Error Handling", "Zod validation errors"], - "duration": 33, - "failing": false, - "failureDetails": [], - "failureMessages": [], - "fullName": "Centralized Error Handling Zod validation errors should return 400 with validation failed message and error code", - "invocations": 1, - "location": null, - "numPassingAsserts": 9, - "retryReasons": [], - "startAt": 1774914694897, - "status": "passed", - "title": "should return 400 with validation failed message and error code" - }, - { - "ancestorTitles": ["Centralized Error Handling", "Zod validation errors"], - "duration": 24, - "failing": false, - "failureDetails": [], - "failureMessages": [], - "fullName": "Centralized Error Handling Zod validation errors should include field and message in each validation error detail", - "invocations": 1, - "location": null, - "numPassingAsserts": 7, - "retryReasons": [], - "startAt": 1774914694931, - "status": "passed", - "title": "should include field and message in each validation error detail" - }, - { - "ancestorTitles": ["Centralized Error Handling", "Response structure consistency"], - "duration": 21, - "failing": false, - "failureDetails": [], - "failureMessages": [], - "fullName": "Centralized Error Handling Response structure consistency should always include success and error fields in error responses", - "invocations": 1, - "location": null, - "numPassingAsserts": 5, - "retryReasons": [], - "startAt": 1774914694955, - "status": "passed", - "title": "should always include success and error fields in error responses" - }, - { - "ancestorTitles": ["Centralized Error Handling", "Response structure consistency"], - "duration": 54, - "failing": false, - "failureDetails": [], - "failureMessages": [], - "fullName": "Centralized Error Handling Response structure consistency should not expose stack traces in production-like responses", - "invocations": 1, - "location": null, - "numPassingAsserts": 1, - "retryReasons": [], - "startAt": 1774914694989, - "status": "passed", - "title": "should not expose stack traces in production-like responses" - }, - { - "ancestorTitles": ["Centralized Error Handling", "Response structure consistency"], - "duration": 211, - "failing": false, - "failureDetails": [], - "failureMessages": [], - "fullName": "Centralized Error Handling Response structure consistency should expose stack traces only with explicit development opt-in", - "invocations": 1, - "location": null, - "numPassingAsserts": 6, - "retryReasons": [], - "startAt": 1774914695044, - "status": "passed", - "title": "should expose stack traces only with explicit development opt-in" - }, - { - "ancestorTitles": ["Centralized Error Handling", "Specific error scenarios (Diagnostic)"], - "duration": 46, - "failing": false, - "failureDetails": [], - "failureMessages": [], - "fullName": "Centralized Error Handling Specific error scenarios (Diagnostic) should handle operational AppErrors (400 Bad Request) with error code", - "invocations": 1, - "location": null, - "numPassingAsserts": 5, - "retryReasons": [], - "startAt": 1774914695256, - "status": "passed", - "title": "should handle operational AppErrors (400 Bad Request) with error code" - }, - { - "ancestorTitles": ["Centralized Error Handling", "Specific error scenarios (Diagnostic)"], - "duration": 73, - "failing": false, - "failureDetails": [], - "failureMessages": [], - "fullName": "Centralized Error Handling Specific error scenarios (Diagnostic) should handle internal AppErrors (500 Internal Server Error) with error code", - "invocations": 1, - "location": null, - "numPassingAsserts": 5, - "retryReasons": [], - "startAt": 1774914695302, - "status": "passed", - "title": "should handle internal AppErrors (500 Internal Server Error) with error code" - }, - { - "ancestorTitles": ["Centralized Error Handling", "Specific error scenarios (Diagnostic)"], - "duration": 37, - "failing": false, - "failureDetails": [], - "failureMessages": [], - "fullName": "Centralized Error Handling Specific error scenarios (Diagnostic) should handle unexpected exceptions (500 Internal Server Error) with error code", - "invocations": 1, - "location": null, - "numPassingAsserts": 5, - "retryReasons": [], - "startAt": 1774914695375, - "status": "passed", - "title": "should handle unexpected exceptions (500 Internal Server Error) with error code" - }, - { - "ancestorTitles": ["Centralized Error Handling", "Specific error scenarios (Diagnostic)"], - "duration": 77, - "failing": false, - "failureDetails": [], - "failureMessages": [], - "fullName": "Centralized Error Handling Specific error scenarios (Diagnostic) should catch async exceptions via asyncHandler middleware with error code", - "invocations": 1, - "location": null, - "numPassingAsserts": 5, - "retryReasons": [], - "startAt": 1774914695413, - "status": "passed", - "title": "should catch async exceptions via asyncHandler middleware with error code" - }, - { - "ancestorTitles": ["Centralized Error Handling", "Authentication error codes"], - "duration": 46, - "failing": false, - "failureDetails": [], - "failureMessages": [], - "fullName": "Centralized Error Handling Authentication error codes should return VALIDATION_ERROR error code for missing public key (Zod validation)", - "invocations": 1, - "location": null, - "numPassingAsserts": 3, - "retryReasons": [], - "startAt": 1774914695491, - "status": "passed", - "title": "should return VALIDATION_ERROR error code for missing public key (Zod validation)" - }, - { - "ancestorTitles": ["Centralized Error Handling", "Authentication error codes"], - "duration": 28, - "failing": false, - "failureDetails": [], - "failureMessages": [], - "fullName": "Centralized Error Handling Authentication error codes should return INVALID_PUBLIC_KEY error code for invalid key format", - "invocations": 1, - "location": null, - "numPassingAsserts": 3, - "retryReasons": [], - "startAt": 1774914695537, - "status": "passed", - "title": "should return INVALID_PUBLIC_KEY error code for invalid key format" - }, - { - "ancestorTitles": ["Centralized Error Handling", "Authentication error codes"], - "duration": 36, - "failing": false, - "failureDetails": [], - "failureMessages": [], - "fullName": "Centralized Error Handling Authentication error codes should return VALIDATION_ERROR error code for missing signature in login (Zod validation)", - "invocations": 1, - "location": null, - "numPassingAsserts": 3, - "retryReasons": [], - "startAt": 1774914695566, - "status": "passed", - "title": "should return VALIDATION_ERROR error code for missing signature in login (Zod validation)" - } - ], - "endTime": 1774914695607, - "message": "", - "name": "C:\\Users\\USER\\Desktop\\drips\\remitlend\\backend\\src\\__tests__\\errorHandling.test.ts", - "startTime": 1774914677032, - "status": "passed", - "summary": "" - }, - { - "assertionResults": [ - { - "ancestorTitles": ["Auth API", "POST /api/auth/challenge"], - "duration": 590, - "failing": false, - "failureDetails": [], - "failureMessages": [], - "fullName": "Auth API POST /api/auth/challenge should generate a challenge for a valid public key", - "invocations": 1, - "location": null, - "numPassingAsserts": 5, - "retryReasons": [], - "startAt": 1774914694366, - "status": "passed", - "title": "should generate a challenge for a valid public key" - }, - { - "ancestorTitles": ["Auth API", "POST /api/auth/challenge"], - "duration": 137, - "failing": false, - "failureDetails": [], - "failureMessages": [], - "fullName": "Auth API POST /api/auth/challenge should reject invalid public key", - "invocations": 1, - "location": null, - "numPassingAsserts": 1, - "retryReasons": [], - "startAt": 1774914694958, - "status": "passed", - "title": "should reject invalid public key" - }, - { - "ancestorTitles": ["Auth API", "POST /api/auth/challenge"], - "duration": 28, - "failing": false, - "failureDetails": [], - "failureMessages": [], - "fullName": "Auth API POST /api/auth/challenge should reject missing public key", - "invocations": 1, - "location": null, - "numPassingAsserts": 1, - "retryReasons": [], - "startAt": 1774914695096, - "status": "passed", - "title": "should reject missing public key" - }, - { - "ancestorTitles": ["Auth API", "POST /api/auth/login"], - "duration": 149, - "failing": false, - "failureDetails": [], - "failureMessages": [], - "fullName": "Auth API POST /api/auth/login should login with valid signature", - "invocations": 1, - "location": null, - "numPassingAsserts": 3, - "retryReasons": [], - "startAt": 1774914695125, - "status": "passed", - "title": "should login with valid signature" - }, - { - "ancestorTitles": ["Auth API", "POST /api/auth/login"], - "duration": 83, - "failing": false, - "failureDetails": [], - "failureMessages": [], - "fullName": "Auth API POST /api/auth/login should reject invalid signature", - "invocations": 1, - "location": null, - "numPassingAsserts": 1, - "retryReasons": [], - "startAt": 1774914695274, - "status": "passed", - "title": "should reject invalid signature" - }, - { - "ancestorTitles": ["Auth API", "POST /api/auth/login"], - "duration": 37, - "failing": false, - "failureDetails": [], - "failureMessages": [], - "fullName": "Auth API POST /api/auth/login should reject missing fields", - "invocations": 1, - "location": null, - "numPassingAsserts": 1, - "retryReasons": [], - "startAt": 1774914695357, - "status": "passed", - "title": "should reject missing fields" - }, - { - "ancestorTitles": ["Auth API", "GET /api/auth/verify"], - "duration": 111, - "failing": false, - "failureDetails": [], - "failureMessages": [], - "fullName": "Auth API GET /api/auth/verify should verify valid token", - "invocations": 1, - "location": null, - "numPassingAsserts": 6, - "retryReasons": [], - "startAt": 1774914695410, - "status": "passed", - "title": "should verify valid token" - }, - { - "ancestorTitles": ["Auth API", "GET /api/auth/verify"], - "duration": 35, - "failing": false, - "failureDetails": [], - "failureMessages": [], - "fullName": "Auth API GET /api/auth/verify should reject missing token", - "invocations": 1, - "location": null, - "numPassingAsserts": 1, - "retryReasons": [], - "startAt": 1774914695521, - "status": "passed", - "title": "should reject missing token" - }, - { - "ancestorTitles": ["Auth API", "GET /api/auth/verify"], - "duration": 19, - "failing": false, - "failureDetails": [], - "failureMessages": [], - "fullName": "Auth API GET /api/auth/verify should reject invalid token", - "invocations": 1, - "location": null, - "numPassingAsserts": 1, - "retryReasons": [], - "startAt": 1774914695556, - "status": "passed", - "title": "should reject invalid token" - }, - { - "ancestorTitles": ["Auth API", "Rate limiting"], - "duration": 242, - "failing": false, - "failureDetails": [], - "failureMessages": [], - "fullName": "Auth API Rate limiting should return 429 after 10 challenge requests from same IP", - "invocations": 1, - "location": null, - "numPassingAsserts": 2, - "retryReasons": [], - "startAt": 1774914695576, - "status": "passed", - "title": "should return 429 after 10 challenge requests from same IP" - }, - { - "ancestorTitles": ["Auth API", "Rate limiting"], - "duration": 132, - "failing": false, - "failureDetails": [], - "failureMessages": [], - "fullName": "Auth API Rate limiting should return 429 and Retry-After after 5 login attempts from same IP", - "invocations": 1, - "location": null, - "numPassingAsserts": 2, - "retryReasons": [], - "startAt": 1774914695818, - "status": "passed", - "title": "should return 429 and Retry-After after 5 login attempts from same IP" - }, - { - "ancestorTitles": ["Auth API", "Rate limiting"], - "duration": 99, - "failing": false, - "failureDetails": [], - "failureMessages": [], - "fullName": "Auth API Rate limiting should return 429 after 5 login attempts with same public key", - "invocations": 1, - "location": null, - "numPassingAsserts": 2, - "retryReasons": [], - "startAt": 1774914695950, - "status": "passed", - "title": "should return 429 after 5 login attempts with same public key" - } - ], - "endTime": 1774914696054, - "message": "", - "name": "C:\\Users\\USER\\Desktop\\drips\\remitlend\\backend\\src\\__tests__\\auth.test.ts", - "startTime": 1774914676798, - "status": "passed", - "summary": "" - }, - { - "assertionResults": [ - { - "ancestorTitles": ["poolController asyncHandler wrapping"], - "duration": 13, - "failing": false, - "failureDetails": [], - "failureMessages": [], - "fullName": "poolController asyncHandler wrapping forwards async errors from getPoolStats to next()", - "invocations": 1, - "location": null, - "numPassingAsserts": 3, - "retryReasons": [], - "startAt": 1774914696456, - "status": "passed", - "title": "forwards async errors from getPoolStats to next()" - }, - { - "ancestorTitles": ["poolController asyncHandler wrapping"], - "duration": 24, - "failing": false, - "failureDetails": [], - "failureMessages": [], - "fullName": "poolController asyncHandler wrapping forwards async errors from getDepositorPortfolio to next()", - "invocations": 1, - "location": null, - "numPassingAsserts": 3, - "retryReasons": [], - "startAt": 1774914696471, - "status": "passed", - "title": "forwards async errors from getDepositorPortfolio to next()" - } - ], - "endTime": 1774914696500, - "message": "", - "name": "C:\\Users\\USER\\Desktop\\drips\\remitlend\\backend\\src\\__tests__\\poolController.asyncHandler.test.ts", - "startTime": 1774914694924, - "status": "passed", - "summary": "" - }, - { - "assertionResults": [ - { - "ancestorTitles": ["RateLimitService", "checkRateLimit"], - "duration": 10, - "failing": false, - "failureDetails": [], - "failureMessages": [], - "fullName": "RateLimitService checkRateLimit should allow first request", - "invocations": 1, - "location": null, - "numPassingAsserts": 4, - "retryReasons": [], - "startAt": 1774914697413, - "status": "passed", - "title": "should allow first request" - }, - { - "ancestorTitles": ["RateLimitService", "checkRateLimit"], - "duration": 2, - "failing": false, - "failureDetails": [], - "failureMessages": [], - "fullName": "RateLimitService checkRateLimit should allow requests within limit", - "invocations": 1, - "location": null, - "numPassingAsserts": 3, - "retryReasons": [], - "startAt": 1774914697425, - "status": "passed", - "title": "should allow requests within limit" - }, - { - "ancestorTitles": ["RateLimitService", "checkRateLimit"], - "duration": 3, - "failing": false, - "failureDetails": [], - "failureMessages": [], - "fullName": "RateLimitService checkRateLimit should block request when limit is exceeded", - "invocations": 1, - "location": null, - "numPassingAsserts": 4, - "retryReasons": [], - "startAt": 1774914697428, - "status": "passed", - "title": "should block request when limit is exceeded" - }, - { - "ancestorTitles": ["RateLimitService", "checkRateLimit"], - "duration": 4, - "failing": false, - "failureDetails": [], - "failureMessages": [], - "fullName": "RateLimitService checkRateLimit should reset counter when window expires", - "invocations": 1, - "location": null, - "numPassingAsserts": 4, - "retryReasons": [], - "startAt": 1774914697431, - "status": "passed", - "title": "should reset counter when window expires" - }, - { - "ancestorTitles": ["RateLimitService", "checkRateLimit"], - "duration": 45, - "failing": false, - "failureDetails": [], - "failureMessages": [], - "fullName": "RateLimitService checkRateLimit should fail open when Redis is unavailable", - "invocations": 1, - "location": null, - "numPassingAsserts": 3, - "retryReasons": [], - "startAt": 1774914697436, - "status": "passed", - "title": "should fail open when Redis is unavailable" - }, - { - "ancestorTitles": ["RateLimitService", "checkRateLimit"], - "duration": 18, - "failing": false, - "failureDetails": [], - "failureMessages": [], - "fullName": "RateLimitService checkRateLimit should handle different identifiers independently", - "invocations": 1, - "location": null, - "numPassingAsserts": 7, - "retryReasons": [], - "startAt": 1774914697481, - "status": "passed", - "title": "should handle different identifiers independently" - }, - { - "ancestorTitles": ["RateLimitService", "resetRateLimit"], - "duration": 4, - "failing": false, - "failureDetails": [], - "failureMessages": [], - "fullName": "RateLimitService resetRateLimit should reset the rate limit counter", - "invocations": 1, - "location": null, - "numPassingAsserts": 1, - "retryReasons": [], - "startAt": 1774914697500, - "status": "passed", - "title": "should reset the rate limit counter" - }, - { - "ancestorTitles": ["RateLimitService", "resetRateLimit"], - "duration": 5, - "failing": false, - "failureDetails": [], - "failureMessages": [], - "fullName": "RateLimitService resetRateLimit should handle errors gracefully", - "invocations": 1, - "location": null, - "numPassingAsserts": 1, - "retryReasons": [], - "startAt": 1774914697505, - "status": "passed", - "title": "should handle errors gracefully" - }, - { - "ancestorTitles": ["RateLimitService", "getRateLimitStatus"], - "duration": 2, - "failing": false, - "failureDetails": [], - "failureMessages": [], - "fullName": "RateLimitService getRateLimitStatus should return current status without incrementing", - "invocations": 1, - "location": null, - "numPassingAsserts": 3, - "retryReasons": [], - "startAt": 1774914697511, - "status": "passed", - "title": "should return current status without incrementing" - }, - { - "ancestorTitles": ["RateLimitService", "getRateLimitStatus"], - "duration": 2, - "failing": false, - "failureDetails": [], - "failureMessages": [], - "fullName": "RateLimitService getRateLimitStatus should return default status for new users", - "invocations": 1, - "location": null, - "numPassingAsserts": 2, - "retryReasons": [], - "startAt": 1774914697513, - "status": "passed", - "title": "should return default status for new users" - }, - { - "ancestorTitles": ["RateLimitService", "getRateLimitStatus"], - "duration": 2, - "failing": false, - "failureDetails": [], - "failureMessages": [], - "fullName": "RateLimitService getRateLimitStatus should handle expired windows", - "invocations": 1, - "location": null, - "numPassingAsserts": 2, - "retryReasons": [], - "startAt": 1774914697515, - "status": "passed", - "title": "should handle expired windows" - } - ], - "endTime": 1774914697521, - "message": "", - "name": "C:\\Users\\USER\\Desktop\\drips\\remitlend\\backend\\src\\services\\__tests__\\rateLimitService.test.ts", - "startTime": 1774914696652, - "status": "passed", - "summary": "" - }, - { - "assertionResults": [ - { - "ancestorTitles": ["DefaultChecker"], - "duration": 69, - "failing": false, - "failureDetails": [], - "failureMessages": [], - "fullName": "DefaultChecker times out a stuck batch and continues processing later batches", - "invocations": 1, - "location": null, - "numPassingAsserts": 4, - "retryReasons": [], - "startAt": 1774914697587, - "status": "passed", - "title": "times out a stuck batch and continues processing later batches" - } - ], - "endTime": 1774914697661, - "message": "", - "name": "C:\\Users\\USER\\Desktop\\drips\\remitlend\\backend\\src\\__tests__\\defaultChecker.test.ts", - "startTime": 1774914694596, - "status": "passed", - "summary": "" - }, - { - "assertionResults": [ - { - "ancestorTitles": ["Rate Limit Middleware", "createRateLimitMiddleware"], - "duration": 9, - "failing": false, - "failureDetails": [], - "failureMessages": [], - "fullName": "Rate Limit Middleware createRateLimitMiddleware should allow request within rate limit", - "invocations": 1, - "location": null, - "numPassingAsserts": 2, - "retryReasons": [], - "startAt": 1774914698778, - "status": "passed", - "title": "should allow request within rate limit" - }, - { - "ancestorTitles": ["Rate Limit Middleware", "createRateLimitMiddleware"], - "duration": 3, - "failing": false, - "failureDetails": [], - "failureMessages": [], - "fullName": "Rate Limit Middleware createRateLimitMiddleware should block request exceeding rate limit", - "invocations": 1, - "location": null, - "numPassingAsserts": 1, - "retryReasons": [], - "startAt": 1774914698789, - "status": "passed", - "title": "should block request exceeding rate limit" - }, - { - "ancestorTitles": ["Rate Limit Middleware", "createRateLimitMiddleware"], - "duration": 2, - "failing": false, - "failureDetails": [], - "failureMessages": [], - "fullName": "Rate Limit Middleware createRateLimitMiddleware should use custom identifier function", - "invocations": 1, - "location": null, - "numPassingAsserts": 1, - "retryReasons": [], - "startAt": 1774914698805, - "status": "passed", - "title": "should use custom identifier function" - }, - { - "ancestorTitles": ["Rate Limit Middleware", "createRateLimitMiddleware"], - "duration": 4, - "failing": false, - "failureDetails": [], - "failureMessages": [], - "fullName": "Rate Limit Middleware createRateLimitMiddleware should use custom configuration", - "invocations": 1, - "location": null, - "numPassingAsserts": 2, - "retryReasons": [], - "startAt": 1774914698810, - "status": "passed", - "title": "should use custom configuration" - }, - { - "ancestorTitles": ["Rate Limit Middleware", "createRateLimitMiddleware"], - "duration": 3, - "failing": false, - "failureDetails": [], - "failureMessages": [], - "fullName": "Rate Limit Middleware createRateLimitMiddleware should skip rate limiting when condition is met", - "invocations": 1, - "location": null, - "numPassingAsserts": 2, - "retryReasons": [], - "startAt": 1774914698814, - "status": "passed", - "title": "should skip rate limiting when condition is met" - }, - { - "ancestorTitles": ["Rate Limit Middleware", "createRateLimitMiddleware"], - "duration": 3, - "failing": false, - "failureDetails": [], - "failureMessages": [], - "fullName": "Rate Limit Middleware createRateLimitMiddleware should fail open when rate limit service fails", - "invocations": 1, - "location": null, - "numPassingAsserts": 1, - "retryReasons": [], - "startAt": 1774914698817, - "status": "passed", - "title": "should fail open when rate limit service fails" - }, - { - "ancestorTitles": ["Rate Limit Middleware", "createRateLimitMiddleware"], - "duration": 5, - "failing": false, - "failureDetails": [], - "failureMessages": [], - "fullName": "Rate Limit Middleware createRateLimitMiddleware should handle missing userId gracefully", - "invocations": 1, - "location": null, - "numPassingAsserts": 1, - "retryReasons": [], - "startAt": 1774914698820, - "status": "passed", - "title": "should handle missing userId gracefully" - }, - { - "ancestorTitles": ["Rate Limit Middleware", "createRateLimitMiddleware"], - "duration": 40, - "failing": false, - "failureDetails": [], - "failureMessages": [], - "fullName": "Rate Limit Middleware createRateLimitMiddleware should log when rate limit is nearing exhaustion", - "invocations": 1, - "location": null, - "numPassingAsserts": 1, - "retryReasons": [], - "startAt": 1774914698825, - "status": "passed", - "title": "should log when rate limit is nearing exhaustion" - }, - { - "ancestorTitles": ["Rate Limit Middleware", "scoreUpdateRateLimit"], - "duration": 2, - "failing": false, - "failureDetails": [], - "failureMessages": [], - "fullName": "Rate Limit Middleware scoreUpdateRateLimit should use score update specific configuration", - "invocations": 1, - "location": null, - "numPassingAsserts": 2, - "retryReasons": [], - "startAt": 1774914698866, - "status": "passed", - "title": "should use score update specific configuration" - }, - { - "ancestorTitles": ["Rate Limit Middleware", "scoreUpdateRateLimit"], - "duration": 3, - "failing": false, - "failureDetails": [], - "failureMessages": [], - "fullName": "Rate Limit Middleware scoreUpdateRateLimit should use custom error message for score updates", - "invocations": 1, - "location": null, - "numPassingAsserts": 1, - "retryReasons": [], - "startAt": 1774914698868, - "status": "passed", - "title": "should use custom error message for score updates" - } - ], - "endTime": 1774914698875, - "message": "", - "name": "C:\\Users\\USER\\Desktop\\drips\\remitlend\\backend\\src\\middleware\\__tests__\\rateLimitMiddleware.test.ts", - "startTime": 1774914697828, - "status": "passed", - "summary": "" - }, - { - "assertionResults": [ - { - "ancestorTitles": ["scoreReconciliationService"], - "duration": 99, - "failing": false, - "failureDetails": [], - "failureMessages": [], - "fullName": "scoreReconciliationService logs divergences and auto-corrects borrowers above the threshold", - "invocations": 1, - "location": null, - "numPassingAsserts": 5, - "retryReasons": [], - "startAt": 1774914698863, - "status": "passed", - "title": "logs divergences and auto-corrects borrowers above the threshold" - } - ], - "endTime": 1774914698966, - "message": "", - "name": "C:\\Users\\USER\\Desktop\\drips\\remitlend\\backend\\src\\__tests__\\scoreReconciliationService.test.ts", - "startTime": 1774914697713, - "status": "passed", - "summary": "" - }, - { - "assertionResults": [ - { - "ancestorTitles": ["EventIndexer"], - "duration": 405, - "failing": false, - "failureDetails": [], - "failureMessages": [], - "fullName": "EventIndexer parses the four core loan event types and triggers downstream side effects", - "invocations": 1, - "location": null, - "numPassingAsserts": 18, - "retryReasons": [], - "startAt": 1774914700191, - "status": "passed", - "title": "parses the four core loan event types and triggers downstream side effects" - }, - { - "ancestorTitles": ["EventIndexer"], - "duration": 19, - "failing": false, - "failureDetails": [], - "failureMessages": [], - "fullName": "EventIndexer deduplicates repeated events and only triggers side effects for inserted rows", - "invocations": 1, - "location": null, - "numPassingAsserts": 4, - "retryReasons": [], - "startAt": 1774914700598, - "status": "passed", - "title": "deduplicates repeated events and only triggers side effects for inserted rows" - }, - { - "ancestorTitles": ["EventIndexer"], - "duration": 11, - "failing": false, - "failureDetails": [], - "failureMessages": [], - "fullName": "EventIndexer ignores duplicate LoanApproved rows for the same loan and emits side effects once", - "invocations": 1, - "location": null, - "numPassingAsserts": 5, - "retryReasons": [], - "startAt": 1774914700617, - "status": "passed", - "title": "ignores duplicate LoanApproved rows for the same loan and emits side effects once" - }, - { - "ancestorTitles": ["EventIndexer"], - "duration": 8, - "failing": false, - "failureDetails": [], - "failureMessages": [], - "fullName": "EventIndexer initializes missing indexer state and persists the last indexed ledger during polling", - "invocations": 1, - "location": null, - "numPassingAsserts": 1, - "retryReasons": [], - "startAt": 1774914700628, - "status": "passed", - "title": "initializes missing indexer state and persists the last indexed ledger during polling" - } - ], - "endTime": 1774914700640, - "message": "", - "name": "C:\\Users\\USER\\Desktop\\drips\\remitlend\\backend\\src\\__tests__\\eventIndexer.test.ts", - "startTime": 1774914699040, - "status": "passed", - "summary": "" - }, - { - "assertionResults": [ - { - "ancestorTitles": ["Health Check Endpoint"], - "duration": 108, - "failing": false, - "failureDetails": [], - "failureMessages": [], - "fullName": "Health Check Endpoint should return 200 and a running message on GET /", - "invocations": 1, - "location": null, - "numPassingAsserts": 2, - "retryReasons": [], - "startAt": 1774914701057, - "status": "passed", - "title": "should return 200 and a running message on GET /" - } - ], - "endTime": 1774914701169, - "message": "", - "name": "C:\\Users\\USER\\Desktop\\drips\\remitlend\\backend\\src\\tests\\health.test.ts", - "startTime": 1774914695009, - "status": "passed", - "summary": "" - }, - { - "assertionResults": [ - { - "ancestorTitles": ["GET /api/score/:userId/breakdown"], - "duration": 171, - "failing": false, - "failureDetails": [], - "failureMessages": [], - "fullName": "GET /api/score/:userId/breakdown should reject unauthenticated requests", - "invocations": 1, - "location": null, - "numPassingAsserts": 1, - "retryReasons": [], - "startAt": 1774914700978, - "status": "passed", - "title": "should reject unauthenticated requests" - }, - { - "ancestorTitles": ["GET /api/score/:userId/breakdown"], - "duration": 131, - "failing": false, - "failureDetails": [], - "failureMessages": [], - "fullName": "GET /api/score/:userId/breakdown should return a breakdown for a valid userId", - "invocations": 1, - "location": null, - "numPassingAsserts": 3, - "retryReasons": [], - "startAt": 1774914701154, - "status": "passed", - "title": "should return a breakdown for a valid userId" - }, - { - "ancestorTitles": ["GET /api/score/:userId/breakdown"], - "duration": 20, - "failing": false, - "failureDetails": [], - "failureMessages": [], - "fullName": "GET /api/score/:userId/breakdown should return default values for a user with no history", - "invocations": 1, - "location": null, - "numPassingAsserts": 3, - "retryReasons": [], - "startAt": 1774914701286, - "status": "passed", - "title": "should return default values for a user with no history" - } - ], - "endTime": 1774914701309, - "message": "", - "name": "C:\\Users\\USER\\Desktop\\drips\\remitlend\\backend\\src\\__tests__\\scoreBreakdown.test.ts", - "startTime": 1774914695941, - "status": "passed", - "summary": "" - }, - { - "assertionResults": [ - { - "ancestorTitles": ["GET /api/score/:userId"], - "duration": 100, - "failing": false, - "failureDetails": [], - "failureMessages": [], - "fullName": "GET /api/score/:userId should reject unauthenticated requests", - "invocations": 1, - "location": null, - "numPassingAsserts": 1, - "retryReasons": [], - "startAt": 1774914701013, - "status": "passed", - "title": "should reject unauthenticated requests" - }, - { - "ancestorTitles": ["GET /api/score/:userId"], - "duration": 41, - "failing": false, - "failureDetails": [], - "failureMessages": [], - "fullName": "GET /api/score/:userId should reject when path userId does not match JWT wallet", - "invocations": 1, - "location": null, - "numPassingAsserts": 1, - "retryReasons": [], - "startAt": 1774914701114, - "status": "passed", - "title": "should reject when path userId does not match JWT wallet" - }, - { - "ancestorTitles": ["GET /api/score/:userId"], - "duration": 42, - "failing": false, - "failureDetails": [], - "failureMessages": [], - "fullName": "GET /api/score/:userId should return a score for a valid userId", - "invocations": 1, - "location": null, - "numPassingAsserts": 4, - "retryReasons": [], - "startAt": 1774914701155, - "status": "passed", - "title": "should return a score for a valid userId" - }, - { - "ancestorTitles": ["GET /api/score/:userId"], - "duration": 36, - "failing": false, - "failureDetails": [], - "failureMessages": [], - "fullName": "GET /api/score/:userId should return the same score for the same userId", - "invocations": 1, - "location": null, - "numPassingAsserts": 1, - "retryReasons": [], - "startAt": 1774914701197, - "status": "passed", - "title": "should return the same score for the same userId" - }, - { - "ancestorTitles": ["GET /api/score/:userId"], - "duration": 21, - "failing": false, - "failureDetails": [], - "failureMessages": [], - "fullName": "GET /api/score/:userId should return 500 if user not found", - "invocations": 1, - "location": null, - "numPassingAsserts": 2, - "retryReasons": [], - "startAt": 1774914701234, - "status": "passed", - "title": "should return 500 if user not found" - }, - { - "ancestorTitles": ["POST /api/score/update"], - "duration": 72, - "failing": false, - "failureDetails": [], - "failureMessages": [], - "fullName": "POST /api/score/update should increase score by 15 for on-time repayment", - "invocations": 1, - "location": null, - "numPassingAsserts": 2, - "retryReasons": [], - "startAt": 1774914701255, - "status": "passed", - "title": "should increase score by 15 for on-time repayment" - }, - { - "ancestorTitles": ["POST /api/score/update"], - "duration": 23, - "failing": false, - "failureDetails": [], - "failureMessages": [], - "fullName": "POST /api/score/update should reject negative repaymentAmount", - "invocations": 1, - "location": null, - "numPassingAsserts": 1, - "retryReasons": [], - "startAt": 1774914701327, - "status": "passed", - "title": "should reject negative repaymentAmount" - } - ], - "endTime": 1774914701356, - "message": "", - "name": "C:\\Users\\USER\\Desktop\\drips\\remitlend\\backend\\src\\__tests__\\score.test.ts", - "startTime": 1774914696298, - "status": "passed", - "summary": "" - }, - { - "assertionResults": [ - { - "ancestorTitles": ["Idempotency Middleware"], - "duration": 8, - "failing": false, - "failureDetails": [], - "failureMessages": [], - "fullName": "Idempotency Middleware should call next() if no Idempotency-Key is present", - "invocations": 1, - "location": null, - "numPassingAsserts": 2, - "retryReasons": [], - "startAt": 1774914701546, - "status": "passed", - "title": "should call next() if no Idempotency-Key is present" - }, - { - "ancestorTitles": ["Idempotency Middleware"], - "duration": 26, - "failing": false, - "failureDetails": [], - "failureMessages": [], - "fullName": "Idempotency Middleware should return cached response if key exists", - "invocations": 1, - "location": null, - "numPassingAsserts": 5, - "retryReasons": [], - "startAt": 1774914701556, - "status": "passed", - "title": "should return cached response if key exists" - }, - { - "ancestorTitles": ["Idempotency Middleware"], - "duration": 5, - "failing": false, - "failureDetails": [], - "failureMessages": [], - "fullName": "Idempotency Middleware should proceed and intercept response on cache miss", - "invocations": 1, - "location": null, - "numPassingAsserts": 2, - "retryReasons": [], - "startAt": 1774914701582, - "status": "passed", - "title": "should proceed and intercept response on cache miss" - } - ], - "endTime": 1774914701591, - "message": "", - "name": "C:\\Users\\USER\\Desktop\\drips\\remitlend\\backend\\src\\tests\\idempotency.test.ts", - "startTime": 1774914699284, - "status": "passed", - "summary": "" - }, - { - "assertionResults": [ - { - "ancestorTitles": ["Admin reindex endpoint"], - "duration": 159, - "failing": false, - "failureDetails": [], - "failureMessages": [], - "fullName": "Admin reindex endpoint rejects requests without API key", - "invocations": 1, - "location": null, - "numPassingAsserts": 1, - "retryReasons": [], - "startAt": 1774914701734, - "status": "passed", - "title": "rejects requests without API key" - }, - { - "ancestorTitles": ["Admin reindex endpoint"], - "duration": 172, - "failing": false, - "failureDetails": [], - "failureMessages": [], - "fullName": "Admin reindex endpoint validates ledger range query parameters", - "invocations": 1, - "location": null, - "numPassingAsserts": 2, - "retryReasons": [], - "startAt": 1774914701895, - "status": "passed", - "title": "validates ledger range query parameters" - } - ], - "endTime": 1774914702072, - "message": "", - "name": "C:\\Users\\USER\\Desktop\\drips\\remitlend\\backend\\src\\__tests__\\adminReindex.test.ts", - "startTime": 1774914695210, - "status": "passed", - "summary": "" - }, - { - "assertionResults": [ - { - "ancestorTitles": ["Integration: EventIndexer end-to-end"], - "duration": 7, - "failing": false, - "failureDetails": [], - "failureMessages": [], - "fullName": "Integration: EventIndexer end-to-end should ingest LoanApproved event and persist it to loan_events", - "invocations": 1, - "location": null, - "numPassingAsserts": 0, - "retryReasons": [], - "startAt": 1774914702344, - "status": "passed", - "title": "should ingest LoanApproved event and persist it to loan_events" - } - ], - "endTime": 1774914702359, - "message": "", - "name": "C:\\Users\\USER\\Desktop\\drips\\remitlend\\backend\\src\\__tests__\\integration\\indexer.integration.test.ts", - "startTime": 1774914700757, - "status": "passed", - "summary": "" - }, - { - "assertionResults": [ - { - "ancestorTitles": ["Audit Log Middleware"], - "duration": 53, - "failing": false, - "failureDetails": [], - "failureMessages": [], - "fullName": "Audit Log Middleware should log admin action to audit_logs table", - "invocations": 1, - "location": null, - "numPassingAsserts": 2, - "retryReasons": [], - "startAt": 1774914702354, - "status": "passed", - "title": "should log admin action to audit_logs table" - }, - { - "ancestorTitles": ["Audit Log Middleware"], - "duration": 52, - "failing": false, - "failureDetails": [], - "failureMessages": [], - "fullName": "Audit Log Middleware should redact sensitive fields in payload", - "invocations": 1, - "location": null, - "numPassingAsserts": 3, - "retryReasons": [], - "startAt": 1774914702409, - "status": "passed", - "title": "should redact sensitive fields in payload" - }, - { - "ancestorTitles": ["Audit Log Middleware"], - "duration": 51, - "failing": false, - "failureDetails": [], - "failureMessages": [], - "fullName": "Audit Log Middleware should identify actor from JWT if present", - "invocations": 1, - "location": null, - "numPassingAsserts": 1, - "retryReasons": [], - "startAt": 1774914702462, - "status": "passed", - "title": "should identify actor from JWT if present" - } - ], - "endTime": 1774914702516, - "message": "", - "name": "C:\\Users\\USER\\Desktop\\drips\\remitlend\\backend\\src\\tests\\auditLog.test.ts", - "startTime": 1774914701628, - "status": "passed", - "summary": "" - }, - { - "assertionResults": [ - { - "ancestorTitles": ["Request ID middleware"], - "duration": 98, - "failing": false, - "failureDetails": [], - "failureMessages": [], - "fullName": "Request ID middleware adds x-request-id when missing", - "invocations": 1, - "location": null, - "numPassingAsserts": 4, - "retryReasons": [], - "startAt": 1774914702284, - "status": "passed", - "title": "adds x-request-id when missing" - }, - { - "ancestorTitles": ["Request ID middleware"], - "duration": 14, - "failing": false, - "failureDetails": [], - "failureMessages": [], - "fullName": "Request ID middleware preserves client x-request-id", - "invocations": 1, - "location": null, - "numPassingAsserts": 2, - "retryReasons": [], - "startAt": 1774914702383, - "status": "passed", - "title": "preserves client x-request-id" - } - ], - "endTime": 1774914702400, - "message": "", - "name": "C:\\Users\\USER\\Desktop\\drips\\remitlend\\backend\\src\\__tests__\\requestId.test.ts", - "startTime": 1774914695353, - "status": "passed", - "summary": "" - }, - { - "assertionResults": [ - { - "ancestorTitles": ["WebhookService"], - "duration": 16, - "failing": false, - "failureDetails": [], - "failureMessages": [], - "fullName": "WebhookService returns the expected retry delays", - "invocations": 1, - "location": null, - "numPassingAsserts": 4, - "retryReasons": [], - "startAt": 1774914702635, - "status": "passed", - "title": "returns the expected retry delays" - }, - { - "ancestorTitles": ["WebhookService"], - "duration": 76, - "failing": false, - "failureDetails": [], - "failureMessages": [], - "fullName": "WebhookService persists retry state when the initial delivery fails", - "invocations": 1, - "location": null, - "numPassingAsserts": 4, - "retryReasons": [], - "startAt": 1774914702653, - "status": "passed", - "title": "persists retry state when the initial delivery fails" - } - ], - "endTime": 1774914702734, - "message": "", - "name": "C:\\Users\\USER\\Desktop\\drips\\remitlend\\backend\\src\\__tests__\\webhookService.test.ts", - "startTime": 1774914701909, - "status": "passed", - "summary": "" - }, - { - "assertionResults": [ - { - "ancestorTitles": ["stellar config"], - "duration": 14, - "failing": false, - "failureDetails": [], - "failureMessages": [], - "fullName": "stellar config defaults to testnet settings when env vars are absent", - "invocations": 1, - "location": null, - "numPassingAsserts": 3, - "retryReasons": [], - "startAt": 1774914702831, - "status": "passed", - "title": "defaults to testnet settings when env vars are absent" - }, - { - "ancestorTitles": ["stellar config"], - "duration": 49, - "failing": false, - "failureDetails": [], - "failureMessages": [], - "fullName": "stellar config uses mainnet defaults when STELLAR_NETWORK=mainnet", - "invocations": 1, - "location": null, - "numPassingAsserts": 3, - "retryReasons": [], - "startAt": 1774914702849, - "status": "passed", - "title": "uses mainnet defaults when STELLAR_NETWORK=mainnet" - }, - { - "ancestorTitles": ["stellar config"], - "duration": 117, - "failing": false, - "failureDetails": [], - "failureMessages": [], - "fullName": "stellar config rejects passphrase/network mismatches", - "invocations": 1, - "location": null, - "numPassingAsserts": 1, - "retryReasons": [], - "startAt": 1774914702899, - "status": "passed", - "title": "rejects passphrase/network mismatches" - }, - { - "ancestorTitles": ["stellar config"], - "duration": 7, - "failing": false, - "failureDetails": [], - "failureMessages": [], - "fullName": "stellar config rejects rpc url/network mismatches", - "invocations": 1, - "location": null, - "numPassingAsserts": 1, - "retryReasons": [], - "startAt": 1774914703016, - "status": "passed", - "title": "rejects rpc url/network mismatches" - } - ], - "endTime": 1774914703030, - "message": "", - "name": "C:\\Users\\USER\\Desktop\\drips\\remitlend\\backend\\src\\__tests__\\stellarConfig.test.ts", - "startTime": 1774914701464, - "status": "passed", - "summary": "" - }, - { - "assertionResults": [ - { - "ancestorTitles": ["Notification Cleanup Strategy"], - "duration": 56, - "failing": false, - "failureDetails": [], - "failureMessages": [], - "fullName": "Notification Cleanup Strategy should delete notifications older than the retention threshold", - "invocations": 1, - "location": null, - "numPassingAsserts": 2, - "retryReasons": [], - "startAt": 1774914703069, - "status": "passed", - "title": "should delete notifications older than the retention threshold" - }, - { - "ancestorTitles": ["Notification Cleanup Strategy"], - "duration": 2, - "failing": false, - "failureDetails": [], - "failureMessages": [], - "fullName": "Notification Cleanup Strategy should return 0 if no notifications are deleted", - "invocations": 1, - "location": null, - "numPassingAsserts": 1, - "retryReasons": [], - "startAt": 1774914703127, - "status": "passed", - "title": "should return 0 if no notifications are deleted" - }, - { - "ancestorTitles": ["Notification Cleanup Strategy"], - "duration": 18, - "failing": false, - "failureDetails": [], - "failureMessages": [], - "fullName": "Notification Cleanup Strategy should handle database errors gracefully", - "invocations": 1, - "location": null, - "numPassingAsserts": 1, - "retryReasons": [], - "startAt": 1774914703129, - "status": "passed", - "title": "should handle database errors gracefully" - } - ], - "endTime": 1774914703157, - "message": "", - "name": "C:\\Users\\USER\\Desktop\\drips\\remitlend\\backend\\src\\tests\\notificationCleanup.test.ts", - "startTime": 1774914702340, - "status": "passed", - "summary": "" - }, - { - "assertionResults": [ - { - "ancestorTitles": ["Loan config startup validation"], - "duration": 13, - "failing": false, - "failureDetails": [], - "failureMessages": [], - "fullName": "Loan config startup validation passes when required values are valid", - "invocations": 1, - "location": null, - "numPassingAsserts": 1, - "retryReasons": [], - "startAt": 1774914703430, - "status": "passed", - "title": "passes when required values are valid" - }, - { - "ancestorTitles": ["Loan config startup validation"], - "duration": 115, - "failing": false, - "failureDetails": [], - "failureMessages": [], - "fullName": "Loan config startup validation throws when required env var is missing", - "invocations": 1, - "location": null, - "numPassingAsserts": 1, - "retryReasons": [], - "startAt": 1774914703445, - "status": "passed", - "title": "throws when required env var is missing" - }, - { - "ancestorTitles": ["Loan config startup validation"], - "duration": 5, - "failing": false, - "failureDetails": [], - "failureMessages": [], - "fullName": "Loan config startup validation throws when numeric value is invalid", - "invocations": 1, - "location": null, - "numPassingAsserts": 1, - "retryReasons": [], - "startAt": 1774914703560, - "status": "passed", - "title": "throws when numeric value is invalid" - }, - { - "ancestorTitles": ["Loan config startup validation"], - "duration": 2, - "failing": false, - "failureDetails": [], - "failureMessages": [], - "fullName": "Loan config startup validation accepts decimal interest rate percent", - "invocations": 1, - "location": null, - "numPassingAsserts": 1, - "retryReasons": [], - "startAt": 1774914703565, - "status": "passed", - "title": "accepts decimal interest rate percent" - }, - { - "ancestorTitles": ["Loan config startup validation"], - "duration": 6, - "failing": false, - "failureDetails": [], - "failureMessages": [], - "fullName": "Loan config startup validation throws when non-numeric value is provided for interest rate", - "invocations": 1, - "location": null, - "numPassingAsserts": 1, - "retryReasons": [], - "startAt": 1774914703567, - "status": "passed", - "title": "throws when non-numeric value is provided for interest rate" - } - ], - "endTime": 1774914703577, - "message": "", - "name": "C:\\Users\\USER\\Desktop\\drips\\remitlend\\backend\\src\\__tests__\\loanConfig.test.ts", - "startTime": 1774914702733, - "status": "passed", - "summary": "" - }, - { - "assertionResults": [ - { - "ancestorTitles": ["SorobanService.getScoreConfig()"], - "duration": 7, - "failing": false, - "failureDetails": [], - "failureMessages": [], - "fullName": "SorobanService.getScoreConfig() returns default repaymentDelta of 15 when env var is not set", - "invocations": 1, - "location": null, - "numPassingAsserts": 1, - "retryReasons": [], - "startAt": 1774914702061, - "status": "passed", - "title": "returns default repaymentDelta of 15 when env var is not set" - }, - { - "ancestorTitles": ["SorobanService.getScoreConfig()"], - "duration": 4, - "failing": false, - "failureDetails": [], - "failureMessages": [], - "fullName": "SorobanService.getScoreConfig() returns default defaultPenalty of 50 when env var is not set", - "invocations": 1, - "location": null, - "numPassingAsserts": 1, - "retryReasons": [], - "startAt": 1774914702073, - "status": "passed", - "title": "returns default defaultPenalty of 50 when env var is not set" - }, - { - "ancestorTitles": ["SorobanService.getScoreConfig()"], - "duration": 3, - "failing": false, - "failureDetails": [], - "failureMessages": [], - "fullName": "SorobanService.getScoreConfig() returns repaymentDelta from SCORE_REPAYMENT_DELTA env var", - "invocations": 1, - "location": null, - "numPassingAsserts": 1, - "retryReasons": [], - "startAt": 1774914702096, - "status": "passed", - "title": "returns repaymentDelta from SCORE_REPAYMENT_DELTA env var" - }, - { - "ancestorTitles": ["SorobanService.getScoreConfig()"], - "duration": 9, - "failing": false, - "failureDetails": [], - "failureMessages": [], - "fullName": "SorobanService.getScoreConfig() returns defaultPenalty from SCORE_DEFAULT_PENALTY env var", - "invocations": 1, - "location": null, - "numPassingAsserts": 1, - "retryReasons": [], - "startAt": 1774914702100, - "status": "passed", - "title": "returns defaultPenalty from SCORE_DEFAULT_PENALTY env var" - }, - { - "ancestorTitles": ["EventIndexer score delta wiring"], - "duration": 1328, - "failing": false, - "failureDetails": [], - "failureMessages": [], - "fullName": "EventIndexer score delta wiring calls sorobanService.getScoreConfig for LoanRepaid events", - "invocations": 1, - "location": null, - "numPassingAsserts": 1, - "retryReasons": [], - "startAt": 1774914702110, - "status": "passed", - "title": "calls sorobanService.getScoreConfig for LoanRepaid events" - }, - { - "ancestorTitles": ["EventIndexer score delta wiring"], - "duration": 8, - "failing": false, - "failureDetails": [], - "failureMessages": [], - "fullName": "EventIndexer score delta wiring calls sorobanService.getScoreConfig for LoanDefaulted events", - "invocations": 1, - "location": null, - "numPassingAsserts": 1, - "retryReasons": [], - "startAt": 1774914703439, - "status": "passed", - "title": "calls sorobanService.getScoreConfig for LoanDefaulted events" - } - ], - "endTime": 1774914703451, - "message": "", - "name": "C:\\Users\\USER\\Desktop\\drips\\remitlend\\backend\\src\\__tests__\\scoreConfig.test.ts", - "startTime": 1774914701411, - "status": "passed", - "summary": "" - }, - { - "assertionResults": [ - { - "ancestorTitles": ["Graceful Shutdown"], - "duration": 51, - "failing": false, - "failureDetails": [], - "failureMessages": [], - "fullName": "Graceful Shutdown should initialize shutdown tests correctly", - "invocations": 1, - "location": null, - "numPassingAsserts": 1, - "retryReasons": [], - "startAt": 1774914703510, - "status": "passed", - "title": "should initialize shutdown tests correctly" - } - ], - "endTime": 1774914703565, - "message": "", - "name": "C:\\Users\\USER\\Desktop\\drips\\remitlend\\backend\\src\\__tests__\\gracefulShutdown.test.ts", - "startTime": 1774914702895, - "status": "passed", - "summary": "" - }, - { - "assertionResults": [ - { - "ancestorTitles": ["parseCappedLimit"], - "duration": 44, - "failing": false, - "failureDetails": [], - "failureMessages": [], - "fullName": "parseCappedLimit should return default limit when no limit is provided", - "invocations": 1, - "location": null, - "numPassingAsserts": 1, - "retryReasons": [], - "startAt": 1774914703549, - "status": "passed", - "title": "should return default limit when no limit is provided" - }, - { - "ancestorTitles": ["parseCappedLimit"], - "duration": 2, - "failing": false, - "failureDetails": [], - "failureMessages": [], - "fullName": "parseCappedLimit should return provided limit when within MAX_LIMIT", - "invocations": 1, - "location": null, - "numPassingAsserts": 1, - "retryReasons": [], - "startAt": 1774914703595, - "status": "passed", - "title": "should return provided limit when within MAX_LIMIT" - }, - { - "ancestorTitles": ["parseCappedLimit"], - "duration": 2, - "failing": false, - "failureDetails": [], - "failureMessages": [], - "fullName": "parseCappedLimit should cap at MAX_LIMIT when provided limit exceeds MAX_LIMIT", - "invocations": 1, - "location": null, - "numPassingAsserts": 1, - "retryReasons": [], - "startAt": 1774914703597, - "status": "passed", - "title": "should cap at MAX_LIMIT when provided limit exceeds MAX_LIMIT" - }, - { - "ancestorTitles": ["parseCappedLimit"], - "duration": 1, - "failing": false, - "failureDetails": [], - "failureMessages": [], - "fullName": "parseCappedLimit should return default limit when provided limit is invalid", - "invocations": 1, - "location": null, - "numPassingAsserts": 1, - "retryReasons": [], - "startAt": 1774914703600, - "status": "passed", - "title": "should return default limit when provided limit is invalid" - }, - { - "ancestorTitles": ["parseCappedLimit"], - "duration": 2, - "failing": false, - "failureDetails": [], - "failureMessages": [], - "fullName": "parseCappedLimit should return default limit when provided limit is negative", - "invocations": 1, - "location": null, - "numPassingAsserts": 1, - "retryReasons": [], - "startAt": 1774914703602, - "status": "passed", - "title": "should return default limit when provided limit is negative" - }, - { - "ancestorTitles": ["parseCappedLimit"], - "duration": 1, - "failing": false, - "failureDetails": [], - "failureMessages": [], - "fullName": "parseCappedLimit should return default limit when provided limit is zero", - "invocations": 1, - "location": null, - "numPassingAsserts": 1, - "retryReasons": [], - "startAt": 1774914703604, - "status": "passed", - "title": "should return default limit when provided limit is zero" - }, - { - "ancestorTitles": ["parseCappedLimit"], - "duration": 1, - "failing": false, - "failureDetails": [], - "failureMessages": [], - "fullName": "parseCappedLimit should handle edge case of exactly MAX_LIMIT", - "invocations": 1, - "location": null, - "numPassingAsserts": 1, - "retryReasons": [], - "startAt": 1774914703606, - "status": "passed", - "title": "should handle edge case of exactly MAX_LIMIT" - }, - { - "ancestorTitles": ["parseCappedLimit"], - "duration": 1, - "failing": false, - "failureDetails": [], - "failureMessages": [], - "fullName": "parseCappedLimit should handle decimal numbers by treating them as invalid", - "invocations": 1, - "location": null, - "numPassingAsserts": 1, - "retryReasons": [], - "startAt": 1774914703608, - "status": "passed", - "title": "should handle decimal numbers by treating them as invalid" - } - ], - "endTime": 1774914703614, - "message": "", - "name": "C:\\Users\\USER\\Desktop\\drips\\remitlend\\backend\\src\\utils\\__tests__\\queryHelpers.test.ts", - "startTime": 1774914702842, - "status": "passed", - "summary": "" - }, - { - "assertionResults": [ - { - "ancestorTitles": ["Environment Variable Validation"], - "duration": 29, - "failing": false, - "failureDetails": [], - "failureMessages": [], - "fullName": "Environment Variable Validation should not exit if all required variables are present", - "invocations": 1, - "location": null, - "numPassingAsserts": 2, - "retryReasons": [], - "startAt": 1774914703560, - "status": "passed", - "title": "should not exit if all required variables are present" - }, - { - "ancestorTitles": ["Environment Variable Validation"], - "duration": 63, - "failing": false, - "failureDetails": [], - "failureMessages": [], - "fullName": "Environment Variable Validation should exit with code 1 if a required variable is missing", - "invocations": 1, - "location": null, - "numPassingAsserts": 2, - "retryReasons": [], - "startAt": 1774914703628, - "status": "passed", - "title": "should exit with code 1 if a required variable is missing" - }, - { - "ancestorTitles": ["Environment Variable Validation"], - "duration": 13, - "failing": false, - "failureDetails": [], - "failureMessages": [], - "fullName": "Environment Variable Validation should exit with code 1 if a required variable is empty string", - "invocations": 1, - "location": null, - "numPassingAsserts": 2, - "retryReasons": [], - "startAt": 1774914703692, - "status": "passed", - "title": "should exit with code 1 if a required variable is empty string" - } - ], - "endTime": 1774914703710, - "message": "", - "name": "C:\\Users\\USER\\Desktop\\drips\\remitlend\\backend\\src\\tests\\envValidation.test.ts", - "startTime": 1774914702612, - "status": "passed", - "summary": "" - } - ], - "wasInterrupted": false -}