diff --git a/app/api/github/route.error-resilience.test.ts b/app/api/github/route.error-resilience.test.ts index 879eb4dff..4b9950bc9 100644 --- a/app/api/github/route.error-resilience.test.ts +++ b/app/api/github/route.error-resilience.test.ts @@ -129,7 +129,7 @@ it('returns 500 for unexpected internal errors', async () => { expect(response.status).toBe(500); expect(await response.json()).toEqual({ - error: 'Unexpected database failure', + error: 'An unexpected error occurred. Please try again.', }); }); it('unwraps nested error causes and returns 404', async () => { diff --git a/app/api/github/route.test.ts b/app/api/github/route.test.ts index 6e8d85d8b..4c32a1c2b 100644 --- a/app/api/github/route.test.ts +++ b/app/api/github/route.test.ts @@ -220,7 +220,7 @@ describe('Standard route behavior', () => { const body = await response.json(); expect(response.status).toBe(500); - expect(body.error).toContain('Database offline'); + expect(body.error).toBe('An unexpected error occurred. Please try again.'); }); it('returns 500 instead of hanging when an error cause chain is circular', async () => { @@ -243,7 +243,7 @@ describe('Standard route behavior', () => { const body = await response.json(); expect(response.status).toBe(500); - expect(body.error).toBe('Circular cause root'); + expect(body.error).toBe('An unexpected error occurred. Please try again.'); }); it('parses valid org parameter and passes it to getFullDashboardData', async () => { diff --git a/app/api/github/route.ts b/app/api/github/route.ts index 62c9c5c58..4bc305827 100644 --- a/app/api/github/route.ts +++ b/app/api/github/route.ts @@ -39,20 +39,6 @@ function getSafeRootCause(error: unknown): unknown { return currentErr; } -function getSafeErrorMessage(error: unknown): string { - const rootCause = getSafeRootCause(error); - - if (rootCause instanceof Error && rootCause.message) { - return rootCause.message; - } - - if (error instanceof Error && error.message) { - return error.message; - } - - return 'Unknown error'; -} - function logSecurityEvent(event: string, details: Record) { logger.warn('Security event', { type: 'SECURITY_EVENT', @@ -249,10 +235,14 @@ export async function GET(request: Request) { ); } - // Default fallback - const errMessage = getSafeErrorMessage(error); + // Default fallback — log full detail server-side; never forward raw error + // strings to callers (fixes: information-leak via unhandled 500 responses). + logger.error('Unhandled error in GET /api/github', { error }); - return NextResponse.json({ error: errMessage }, { status: 500 }); + return NextResponse.json( + { error: 'An unexpected error occurred. Please try again.' }, + { status: 500 } + ); } finally { clearTimeout(timeoutId); } diff --git a/test_next_request.ts b/test_next_request.ts new file mode 100644 index 000000000..4d294cdac --- /dev/null +++ b/test_next_request.ts @@ -0,0 +1,3 @@ +import { NextRequest } from 'next/server'; +const req = new NextRequest('http://localhost', { headers: { 'user-agent': 'test' } }); +console.log(req.headers.get('user-agent')); diff --git a/test_output.log b/test_output.log new file mode 100644 index 000000000..838378c0a --- /dev/null +++ b/test_output.log @@ -0,0 +1,12480 @@ + +> commitpulse@0.1.0 test +> vitest run + + + RUN v4.1.10 /home/atulupadhyay/Contribution/commitpulse + + ❯ app/api/student/resume/tests/confirm.test.ts (11 tests | 10 failed) 111ms + × returns 400 when githubUsername is missing 40ms + × returns 400 when profile data is missing 10ms + × returns 400 when name or email is missing 10ms + × updates StudentProfile successfully 11ms + ✓ blocks profile takeover when the authenticated GitHub account does not match 6ms + × returns 500 when database update fails 6ms + × returns 400 when githubUsername has an invalid format 6ms + × returns 400 when email format is invalid 2ms + × returns 400 when name exceeds the length cap 3ms + × returns 400 when skills exceed the array cap 4ms + × persists the parsed phone number, trims skills, and drops empty rows 5ms + ❯ app/api/student/resume/confirm/route.theme-contrast.test.ts (5 tests | 5 failed) 48ms + × dark mode: returns success response with consistent shape 28ms + × light mode: returns success response with consistent shape 3ms + × dark mode: error response contains renderable error text 3ms + × light mode: error response contains renderable error text 3ms + × rate-limit overlay does not suppress error text in either mode 4ms + ❯ app/api/student/resume/upload/route.mock-integrations.test.ts (10 tests | 10 failed) 140ms + × 1. should test service loading paths to ensure successful parsing returns 200 (mock success) 53ms + × 2. should assert local cache layers (RateLimiter) block requests before triggering async services 6ms + × 3. should verify correct fallback procedures during fake endpoint/parsing errors 5ms + × 4. should block invalid file signatures without hitting the parser service 16ms + × 5. should reject requests with missing formData fields without processing 17ms + × 1. should test service loading paths to ensure successful parsing returns 200 (mock success) 10ms + × 2. should assert local cache layers (RateLimiter) block requests before triggering async services 7ms + × 3. should verify correct fallback procedures during fake endpoint/parsing errors 6ms + × 4. should block invalid file signatures without hitting the parser service 8ms + × 5. should reject requests with missing formData fields without processing 4ms + ❯ app/api/track-user/route.timezone-boundaries.test.ts (5 tests | 4 failed) 151ms + × 1. mocks standard timezone settings (UTC, EST, IST, JST) correctly 113ms + × 2. asserts calculations align commits/activities onto the correct visual dates 11ms + × 3. verifies leap year boundaries parse without leaving gaps in grids 8ms + ✓ 4. asserts calendar date format utility outputs match expectations in each locale 5ms + × 5. tests offsets around transition dates like daylight savings (DST) 7ms + ❯ app/api/student/resume/confirm/route.empty-fallback.test.ts (5 tests | 5 failed) 44ms + × returns 200 when optional arrays are provided but empty 26ms + × returns 200 when optional fields are completely omitted 2ms + × returns 400 when required fields are empty strings 3ms + × returns 400 when data object is entirely empty 2ms + × returns 400 when null is provided for arrays 4ms + ❯ app/api/student/resume/confirm/route.responsive-breakpoints.test.ts (5 tests | 1 failed) 335ms + × Mock standard mobile-width media coordinates (e.g. 375px wide viewports) 37ms + ✓ Assert that columns reflow into standard vertical flex lists 30ms + ✓ Verify styling values are not absolute widths that cause horizontal scrollbars on smaller viewports 186ms + ✓ Check that navigation components scale down gracefully 25ms + ✓ Assert mobile-specific toggle states respond cleanly 31ms + ❯ app/api/notify/route.mouse-interactivity.test.ts (5 tests | 1 failed) 574ms + ✓ triggers a hover gesture and reveals the notification tooltip 165ms + ✓ displays the responsive tooltip at computed cursor coordinates 65ms + × propagates click gestures and persists the subscription via POST 207ms + ✓ propagates touch gestures and fetches subscription status via GET 90ms + ✓ keeps pointer cursor classes and hides the tooltip on mouseleave 11ms +stderr | app/api/track-user/route.test.ts > POST /api/track-user > returns 429 with rate limit headers when rate limited +{"timestamp":"2026-07-23T02:51:28.565Z","type":"SECURITY_EVENT","event":"UNTRUSTED_FORWARDED_HEADER_IGNORED","resolvedIp":"unknown","header":"x-real-ip"} + + ❯ app/api/track-user/route.test.ts (16 tests | 13 failed) 162ms + × Scenario 1: allows and stores a valid GitHub username 49ms + × Scenario 2: rejects invalid GitHub username that does not exist 4ms + × Scenario 3: rejects random UUID format immediately at regex format stage 8ms + × Scenario 4: skips database write for duplicate tracking request within cooldown 4ms + ✓ returns 400 for malformed JSON request bodies 8ms + × returns 400 when username is missing 5ms + × returns 400 when username is not a string 3ms + × sanitizes and rejects nested MongoDB operators in username field 3ms + × sanitizes query injection fields from root payload 7ms + ✓ returns 429 with rate limit headers when rate limited 25ms + ✓ applies rate limiting to localhost requests 12ms + × returns 200 and bypassed flag when MONGODB_URI is undefined 7ms + × connects to DB and upserts the user 6ms + × bypasses user tracking gracefully when database connection fails 9ms + × Scenario: valid usernames are allowed and write to database 3ms + × Scenario: invalid usernames return 400 and never perform database operations 2ms + ❯ app/api/track-user/route.mouse-interactivity.test.ts (5 tests | 4 failed) 127ms + × 1. Trigger simulated mouseenter/hover gestures: verifies responsive tooltip layouts display at computed coordinates (Valid Request) 97ms + ✓ 2. Test custom click/touch gestures: ensures rapid touch events propagate correctly to the rate limiter (Rate Limit Exceeded) 4ms + × 3. Assert appropriate cursor style classes: applies error classes when hovering over malformed JSON 5ms + × 4. Check that mouseleave events successfully hide temporary overlay visuals: hides deduplication overlay when cooldown is active 6ms + × 5. Verify interactive nodes fallback gracefully: handles MONGODB_URI disconnection overlay gracefully 5ms + ❯ app/api/track-user/route.empty-fallback.test.ts (5 tests | 5 failed) 87ms + × returns 400 when username is missing from body 58ms + × returns 400 when username is empty string 4ms + × returns 400 when username is null 5ms + × returns 400 when body is malformed JSON 4ms + × returns 400 when username is a number instead of string 5ms + ❯ app/api/student/resume/confirm/route.mouse-interactivity.test.ts (5 tests | 5 failed) 46ms + × returns 400 when request body is malformed 23ms + × returns 400 when githubUsername is missing 3ms + × returns 400 when profile data is missing 3ms + × returns ownership verification errors from GitHub owner verification 11ms + × returns bypass response when MONGODB_URI is not configured 4ms + ❯ app/api/notify/route.mock-integrations.test.ts (5 tests | 5 failed) 56ms + × cache miss proceeds through full async flow 31ms + × cache hit prevents DB write 2ms + × invalid GitHub user returns 404 2ms + × database failure returns 500 2ms + × successful write returns 200 7ms + ❯ app/api/student/resume/confirm/route.test.ts (11 tests | 11 failed) 88ms + × returns 429 when rate limit is exceeded 49ms + × returns 400 when JSON body is malformed 3ms + × returns 200 and bypasses database update when MONGODB_URI is not configured 3ms + × returns 401 and does not write when GitHub authentication is missing 3ms + × returns 403 and does not write when the authenticated account is not the owner 6ms + × trims and lowercases the githubUsername during update 3ms + × returns 400 when githubUsername is missing 3ms + × returns 400 when githubUsername exceeds 39 characters 3ms + × returns 400 when profile data is missing 3ms + × returns 400 when name is missing 3ms + × returns 400 when email is missing 3ms + ✓ app/template.type-compiler.test.tsx (5 tests) 209ms + ✓ components/dashboard/GrowthTrendChart.mock-integrations.test.tsx (5 tests) 490ms + ✓ components/dashboard/GrowthTrendChart.responsive-breakpoints.test.tsx (6 tests) 347ms + ✓ components/dashboard/LanguageChart.test.tsx (2 tests) 326ms + ✓ components/dashboard/LanguageChart.error-resilience.test.tsx (5 tests) 304ms +stderr | components/dashboard/RadarChart.timezone-boundaries.test.tsx > RadarChart timezone boundaries > limits displayed axes to maximum 6 languages +React does not recognize the `whileInView` prop on a DOM element. If you intentionally want it to appear in the DOM as a custom attribute, spell it as lowercase `whileinview` instead. If you accidentally passed it from a parent component, remove it from the DOM element. + + ✓ components/dashboard/RadarChart.timezone-boundaries.test.tsx (5 tests) 683ms + ✓ limits displayed axes to maximum 6 languages 495ms + ✓ components/dashboard/ResumeUpload.error-resilience.test.tsx (5 tests) 435ms + ✓ components/dashboard/PRInsights/RepoPerformanceTable.mock-integrations.test.tsx (5 tests) 175ms + ✓ components/dashboard/UnifiedIntelligenceCenter.test.tsx (4 tests) 419ms + ✓ tests/visual/visual.test.ts (20 tests) 1655ms + ✓ components/dashboard/PRInsights/PRStatusDistribution.theme-contrast.test.tsx (5 tests) 371ms +stderr | lib/github.test.ts > fetchGitHubContributions > returns the contribution calendar on a successful response +[CommitPulse API] Empty profile or null repository nodes discovered for user "octocat". Falling back to baseline collection. + +stderr | lib/github.test.ts > fetchGitHubContributions > injects positive locAdditions and non-negative locDeletions for contribution days +[CommitPulse API] Empty profile or null repository nodes discovered for user "octocat". Falling back to baseline collection. + +stderr | lib/github.test.ts > fetchGitHubContributions > sets locAdditions and locDeletions to zero for zero-contribution days +[CommitPulse API] Empty profile or null repository nodes discovered for user "octocat". Falling back to baseline collection. + +stderr | lib/github.test.ts > fetchGitHubContributions > works correctly for a brand-new user who has zero contribution weeks +[CommitPulse API] Empty profile or null repository nodes discovered for user "new-user". Falling back to baseline collection. + +stderr | lib/github.test.ts > fetchGitHubContributions > throws with the status code when the server returns 500 +[ERROR] GitHub GraphQL API error {"status":500,"body":"{\"message\":\"Internal Server Error\"}"} + +stderr | lib/github.test.ts > fetchGitHubContributions > throws with the status code when the server returns 401 (expired or missing token) +[ERROR] GitHub PAT authentication failed {"status":401,"body":"{\"message\":\"Unauthorized\"}"} + +stderr | tests/github-recovery.test.ts > GitHub API Failure Recovery (Phase 3) > fetchUserProfile Fallback > falls back to stale cache data on network failure +[WARN] GitHub API profile fetch failed, returning stale cache data {"username":"octocat","error":{}} + +stderr | lib/github.test.ts > fetchGitHubContributions > body-level RATE_LIMITED retry (HTTP 200) > retries with backoff when GitHub returns RATE_LIMITED inside a 200 OK body +[CommitPulse API] Empty profile or null repository nodes discovered for user "octocat". Falling back to baseline collection. + +stderr | lib/github.test.ts > fetchGitHubContributions > handles calendar with all days having zero contributions +[CommitPulse API] Empty profile or null repository nodes discovered for user "sparse-user". Falling back to baseline collection. + +stderr | lib/github.test.ts > fetchGitHubContributions > is deterministic: two calls with empty-year response return identical data +[CommitPulse API] Empty profile or null repository nodes discovered for user "empty-user". Falling back to baseline collection. + +stderr | lib/github.test.ts > fetchGitHubContributions > is deterministic: two calls with empty-year response return identical data +[CommitPulse API] Empty profile or null repository nodes discovered for user "empty-user". Falling back to baseline collection. + +stderr | lib/github.test.ts > fetchGitHubContributions > falls back to stale cache with isOfflineFallback: true when fetch fails and cache has data +[WARN] GitHub API fetch failed, falling back to stale cache {"component":"GitHub API","username":"fallback-user","error":{}} + +stderr | tests/github-recovery.test.ts > GitHub API Failure Recovery (Phase 3) > fetchUserRepos Fallback > falls back to stale cache data on network failure +[WARN] GitHub API repos fetch failed, returning stale cache data {"username":"octocat","error":{}} + +stderr | lib/github.test.ts > fetchGitHubContributions > falls back to stale cache when bypassCache is true but fetch fails and cache has data +[GitHub API] Fetch failed or timed out for "bypass-fallback-user", falling back to stale cache: Error: Failed to fetch + at /home/atulupadhyay/Contribution/commitpulse/lib/github.test.ts:483:40 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:1903:20 + + ✓ app/generator/components/EditorPanel.mouse-interactivity.test.tsx (5 tests) 10395ms + ✓ Case 1: applies transition and hover styles structurally on all interactive controls 4596ms + ✓ Case 2: displays title attributes and sets accessibility markers on interactive components 795ms + ✓ Case 3: click events propagate cleanly to parental DOM wrappers 4009ms + ✓ Case 4: triggers name and github username change callbacks correctly 438ms + ✓ Case 5: mobile touch gestures propagate successfully on controls 551ms +stderr | tests/github-recovery.test.ts > GitHub API Failure Recovery (Phase 3) > fetchGitHubContributions Fallback > falls back to stale cache data on network failure +[GitHub API] Fetch failed or timed out for "octocat", falling back to stale cache: Error: TypeError: Failed to fetch + at /home/atulupadhyay/Contribution/commitpulse/tests/github-recovery.test.ts:133:42 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:1903:20 + + ✓ tests/github-recovery.test.ts (7 tests) 15657ms + ✓ falls back to stale cache data on network failure 2514ms + ✓ returns a mock placeholder profile if cache is empty on network failure 2542ms + ✓ falls back to stale cache data on network failure 2628ms + ✓ returns empty array if cache is empty on network failure 2859ms + ✓ falls back to stale cache data on network failure 2634ms + ✓ returns empty mock contributions calendar if cache is empty on network failure 2438ms +stderr | lib/github.test.ts > forceRefresh write-back > fetchGitHubContributions: forceRefresh writes back so a later normal read is a cache hit +[CommitPulse API] Empty profile or null repository nodes discovered for user "octocat". Falling back to baseline collection. + + ✓ components/dashboard/ProfileOptimizerModal.timezone-boundaries.test.tsx (5 tests) 16028ms + ✓ 2. should align commit contributions on correct visual calendar dates independent of timezone 3909ms + ✓ 3. should verify leap year boundaries parse correctly without leaving grid gaps 3845ms + ✓ 5. should handle daylight savings time transitions without throwing date shift errors 7995ms +stderr | lib/github.test.ts > getFullDashboardData > maps contribution counts to correct intensity levels +[CommitPulse API] Empty profile or null repository nodes discovered for user "octocat". Falling back to baseline collection. + + ✓ components/dashboard/ProfileOptimizerModal.empty-fallback.test.tsx (5 tests) 16210ms + ✓ 2. Verify clear fallback UI is displayed 3931ms + ✓ 3. Verify standard styles are maintained in this default empty layout state 3885ms + ✓ 4. Assert no unexpected runtime errors or hydration failures occur with empty arrays/objects 3893ms + ✓ 5. Check key DOM structures to make sure empty markers exist 4351ms +stderr | lib/github.test.ts > getFullDashboardData > handles repos fetch failure gracefully +[CommitPulse API] Empty profile or null repository nodes discovered for user "octocat". Falling back to baseline collection. + + ✓ app/generator/components/EditorPanel.mock-integrations.test.tsx (5 tests) 20570ms + ✓ Test 1: should mock standard asynchronous imports and databases using stubs 4105ms + ✓ Test 2: should test service loading paths to ensure pending state overlays render 3655ms + ✓ Test 3: should assert local cache layers are queried before triggering database retrievals 473ms + ✓ Test 4: should verify correct fallback procedures during fake endpoint timeout blocks 3826ms + ✓ Test 5: should assert complete cache sync is written on success callbacks 8492ms +stderr | lib/github.test.ts > GitHub API cache behavior > dedupes rapid synchronous contribution requests until the delayed fetch resolves once +[CommitPulse API] Empty profile or null repository nodes discovered for user "octocat". Falling back to baseline collection. + + ✓ lib/github.test.ts (101 tests | 2 skipped) 23024ms + ✓ throws with the status code when the server returns 500 2293ms + ✓ falls back to empty calendar when fetch itself rejects due to a network failure 3062ms + ✓ falls back to stale cache with isOfflineFallback: true when fetch fails and cache has data 2366ms + ✓ falls back to stale cache when bypassCache is true but fetch fails and cache has data 2663ms + ✓ throws status code error on other failures 3388ms + ✓ throws status code error on failure 2440ms + ✓ throws if profile fetch fails 2737ms + ✓ handles repos fetch failure gracefully 3013ms +stdout | app/api/streak/route.test.ts > GET /api/streak > falls back to the default isometric view when an invalid view is provided +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"b77ac501-ea74-42ff-8cb0-ab51bd94a7a4"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > falls back to the default isometric view when an invalid view is provided +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":59,"requestId":"b77ac501-ea74-42ff-8cb0-ab51bd94a7a4"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > parameter validation > clamps grace=-1 to 0 is provided +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"4676948e-f5d6-45c3-a2a2-09ca75c42ff7"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > parameter validation > clamps grace=-1 to 0 is provided +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"4676948e-f5d6-45c3-a2a2-09ca75c42ff7"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > parameter validation > clamps grace to when exceeds max value +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"30526f96-0446-47d7-a8f6-1ec4c559c230"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > parameter validation > clamps grace to when exceeds max value +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":3,"requestId":"30526f96-0446-47d7-a8f6-1ec4c559c230"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > parameter validation > returns 400 when days=0 is provided +[INFO] Incoming streak request {"source":"streak","requestId":"4c8f453b-1f08-46ea-8d5a-642386b39d04"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > parameter validation > returns 400 when days is negative +[INFO] Incoming streak request {"source":"streak","requestId":"49f3e27c-53f0-4318-a4b9-9fb74d08209b"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > parameter validation > re-chunks ?days filtered days into real weeks instead of one overflowing week +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"8039cfde-3b0c-46e2-baa5-0d3da1e8bea3"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > parameter validation > re-chunks ?days filtered days into real weeks instead of one overflowing week +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"json","status":200,"durationMs":2,"requestId":"8039cfde-3b0c-46e2-baa5-0d3da1e8bea3"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > parameter validation > does not truncate calculated streak stats when the days parameter is set +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"851d7ab4-0dfd-46e8-9931-e788014e42de"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > parameter validation > does not truncate calculated streak stats when the days parameter is set +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"json","status":200,"durationMs":3,"requestId":"851d7ab4-0dfd-46e8-9931-e788014e42de"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > parameter validation > returns 400 Bad Request when ?layout= is set to an unsupported format +[INFO] Incoming streak request {"source":"streak","requestId":"21e85bcb-f8e7-4363-a950-4ce8d363f2a1"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > parameter validation > does not call the GitHub API when layout is invalid +[INFO] Incoming streak request {"source":"streak","requestId":"4695ded8-0a62-459e-a3e3-d02587a783dc"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > parameter validation > returns 400 with a structured error body for unsupported_layout +[INFO] Incoming streak request {"source":"streak","requestId":"8e29bdbe-088d-4667-9307-e1d6fb3e2d35"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > parameter validation > returns 400 Bad Request when ?layout= is set to an unsupported format (Variation 4) +[INFO] Incoming streak request {"source":"streak","requestId":"1aa68c87-14c6-4e26-975a-904b8288276f"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > parameter validation > returns 400 when the user parameter is missing +[INFO] Incoming streak request {"source":"streak","requestId":"9a7bb5c0-0077-4344-ba43-e22984624408"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > parameter validation > returns 400 when org parameter contains spaces and invalid characters +[INFO] Incoming streak request {"source":"streak","requestId":"6c962b9f-9753-480b-9ece-2cc4f2fa731c"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > parameter validation > does not hit the GitHub API at all when user is missing +[INFO] Incoming streak request {"source":"streak","requestId":"1174d321-47e9-46b9-b840-f82aab65fb46"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > parameter validation > returns 400 for malformed GitHub usernames +[INFO] Incoming streak request {"source":"streak","requestId":"c19ba0c2-1a15-4d6f-b67e-7b588f0c6653"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > parameter validation > returns 400 for malformed GitHub usernames +[INFO] Incoming streak request {"source":"streak","requestId":"8bc09565-4a3d-4bd4-817b-329b43bf9e4c"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > parameter validation > returns 400 for malformed GitHub usernames +[INFO] Incoming streak request {"source":"streak","requestId":"e818c1ce-22af-4f30-a8e0-7fac5a396837"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > parameter validation > returns 400 for malformed GitHub usernames +[INFO] Incoming streak request {"source":"streak","requestId":"100008b0-2958-4b03-9346-f6939257105b"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > parameter validation > returns 400 when user contains spaces +[INFO] Incoming streak request {"source":"streak","requestId":"beb58a2b-03be-4bcd-be9b-fd31fa237b91"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > parameter validation > returns 400 when user exceeds 39 characters +[INFO] Incoming streak request {"source":"streak","requestId":"0842c1e2-d86b-4afc-a8f0-2c2c3bdb7070"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > parameter validation > returns 400 Bad Request and details indicating the username cannot exceed 39 characters when using NextRequest +[INFO] Incoming streak request {"source":"streak","requestId":"9cf1ae9a-48e2-4871-ba2e-ab8dce0278c7"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > parameter validation > returns 400 for invalid monthly badge dimensions +[INFO] Incoming streak request {"source":"streak","requestId":"cecb7207-6f7d-46d6-b2e2-a8658c8534d6"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > parameter validation > returns 400 for invalid monthly badge dimensions +[INFO] Incoming streak request {"source":"streak","requestId":"da13a243-15a1-41d0-8dc3-279e881a2590"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > parameter validation > returns 400 for invalid monthly badge dimensions +[INFO] Incoming streak request {"source":"streak","requestId":"e85da3bc-48c6-4b73-96fe-66563ba0f5ce"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > parameter validation > returns 400 for invalid monthly badge dimensions +[INFO] Incoming streak request {"source":"streak","requestId":"59743a79-67dc-4cf6-823f-d4771fd3a237"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > parameter validation > returns 400 for invalid monthly badge dimensions +[INFO] Incoming streak request {"source":"streak","requestId":"b83bef4a-ad4b-43dd-95f5-25700590982d"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > parameter validation > returns 400 for invalid monthly badge dimensions +[INFO] Incoming streak request {"source":"streak","requestId":"33258648-88e6-421d-9842-e23825769fb4"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > parameter validation > clamps grace to 0 when below the minimum value +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"6e185b36-97d1-4674-bfa9-668fbd6d7a21"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > parameter validation > clamps grace to 0 when below the minimum value +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"6e185b36-97d1-4674-bfa9-668fbd6d7a21"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > parameter validation > returns 400 for unsupported ?layout query parameter values (strict schema validation) +[INFO] Incoming streak request {"source":"streak","requestId":"c82c7da1-4995-4eea-ab48-a33b061a812d"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > parameter validation > returns 400 when an invalid theme value is provided and lists allowed themes +[INFO] Incoming streak request {"source":"streak","requestId":"c186d59f-6f7d-4b63-b5f3-ba12a9f4354d"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > parameter validation > should return 200 OK and valid SVG when the optional repo query parameter is provided +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"dc4229fb-35c3-4d35-b077-dd21da9d2431"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > parameter validation > should return 200 OK and valid SVG when the optional repo query parameter is provided +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"dc4229fb-35c3-4d35-b077-dd21da9d2431"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > parameter validation > should return 200 OK and valid SVG when the optional org query parameter is provided +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"25e7b7bf-260d-41e1-b76a-df532c8ef4c4"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > parameter validation > should return 200 OK and valid SVG when the optional org query parameter is provided +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":8,"requestId":"25e7b7bf-260d-41e1-b76a-df532c8ef4c4"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > parameter validation > returns 400 when org contains invalid characters +[INFO] Incoming streak request {"source":"streak","requestId":"070e40f2-3f46-471b-b9c8-54407daa71a7"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > successful response > returns 200 with SVG content type +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"0bd0b598-1218-47bf-9ca3-f170b1247101"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > successful response > returns 200 with SVG content type +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":6,"requestId":"0bd0b598-1218-47bf-9ca3-f170b1247101"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > successful response > returns a well-formed SVG body +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"5c8424bb-fe9b-43ac-ad98-26f5eaa02146"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > successful response > returns a well-formed SVG body +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"5c8424bb-fe9b-43ac-ad98-26f5eaa02146"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > successful response > returns valid SVG when mode=loc is given +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"7daddb1a-f47c-47e3-8e66-f2f82f49dc97"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > successful response > returns valid SVG when mode=loc is given +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"7daddb1a-f47c-47e3-8e66-f2f82f49dc97"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > successful response > forwards the username to fetchGitHubContributions +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"475517f3-081d-4670-8083-0e5d53faadd3"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > successful response > forwards the username to fetchGitHubContributions +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"475517f3-081d-4670-8083-0e5d53faadd3"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > successful response > forwards grace parameter to fetchGitHubContributions +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"334f5d9b-afbb-492c-bfd1-676da63bd25e"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > successful response > forwards grace parameter to fetchGitHubContributions +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":5,"requestId":"334f5d9b-afbb-492c-bfd1-676da63bd25e"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > successful response > embeds the username (uppercased) in the SVG title +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"5a246f8d-ba95-45b0-9751-9459a1a66413"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > successful response > embeds the username (uppercased) in the SVG title +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":0,"requestId":"5a246f8d-ba95-45b0-9751-9459a1a66413"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > successful response > should contain a element with accessible label in the SVG response +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"b6ce06c0-667c-47d4-9342-9d3a462f42dd"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > successful response > should contain a <title> element with accessible label in the SVG response +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"b6ce06c0-667c-47d4-9342-9d3a462f42dd"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > successful response > returns a small SVG when size=small +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"b2a8cce9-69d2-4aca-913b-70dfd4bbebca"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > successful response > returns a small SVG when size=small +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":4,"requestId":"b2a8cce9-69d2-4aca-913b-70dfd4bbebca"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > successful response > returns the default medium SVG when size is omitted +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"5cfd97ef-2ed1-4393-b8a0-3cd101386f1f"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > successful response > returns the default medium SVG when size is omitted +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":7,"requestId":"5cfd97ef-2ed1-4393-b8a0-3cd101386f1f"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > successful response > returns a large SVG when size=large +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"95489211-dd79-4598-88af-49d4ae9706e4"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > successful response > returns a large SVG when size=large +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":3,"requestId":"95489211-dd79-4598-88af-49d4ae9706e4"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > edge cases for empty/private profiles > Scenario 1: Normal active GitHub user +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"8086728e-2541-4b3b-993a-11124a483189"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > edge cases for empty/private profiles > Scenario 1: Normal active GitHub user +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"8086728e-2541-4b3b-993a-11124a483189"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > edge cases for empty/private profiles > Scenario 2 & 3: User with 0 public repositories or private profile (empty calendar) +[INFO] Incoming streak request {"source":"streak","user":"private-user","view":"default","requestId":"a44b0b5d-a889-4dba-9564-bc82a4881d18"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > edge cases for empty/private profiles > Scenario 2 & 3: User with 0 public repositories or private profile (empty calendar) +[INFO] Streak request completed {"source":"streak","user":"private-user","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"a44b0b5d-a889-4dba-9564-bc82a4881d18"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > edge cases for empty/private profiles > Scenario 4: Nonexistent username +[INFO] Incoming streak request {"source":"streak","user":"nonexistent","view":"default","requestId":"f9e8d064-b577-4b70-9af0-40c646add40c"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > edge cases for empty/private profiles > Scenario 4: Nonexistent username +[INFO] Streak request completed {"source":"streak","user":"nonexistent","view":"default","format":"svg","status":200,"durationMs":6,"requestId":"f9e8d064-b577-4b70-9af0-40c646add40c"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > edge cases for empty/private profiles > Scenario 5: GitHub API failure +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"4a55989a-d3ab-4535-b722-64f5a29ab5ab"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > edge cases for empty/private profiles > Scenario 5: GitHub API failure +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"4a55989a-d3ab-4535-b722-64f5a29ab5ab"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > edge cases for empty/private profiles > Scenario 6: Circuit Breaker Open Telemetry +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"9b118378-2d67-4cca-9d82-0cdde9330653"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > edge cases for empty/private profiles > Scenario 6: Circuit Breaker Open Telemetry +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":0,"requestId":"9b118378-2d67-4cca-9d82-0cdde9330653"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > cache-control header > caches until UTC midnight by default, using the value from getSecondsUntilUTCMidnight +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"c5cd3ff2-d3f5-4597-8130-ff9adaf3dd08"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > cache-control header > caches until UTC midnight by default, using the value from getSecondsUntilUTCMidnight +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"c5cd3ff2-d3f5-4597-8130-ff9adaf3dd08"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > cache-control header > reflects a different time value when the clock changes +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"2ce36995-81ee-499f-9ad6-72fa8894d072"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > cache-control header > reflects a different time value when the clock changes +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":0,"requestId":"2ce36995-81ee-499f-9ad6-72fa8894d072"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > cache-control header > bypasses the cache entirely when ?refresh=true +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"40c25cf7-f2db-42cb-92eb-e702002b4dda"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > cache-control header > bypasses the cache entirely when ?refresh=true +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"40c25cf7-f2db-42cb-92eb-e702002b4dda"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > cache-control header > passes bypassCache=true when refresh=true +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"96b2d043-2f3c-4278-9fe9-daefaa84b053"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > cache-control header > passes bypassCache=true when refresh=true +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"96b2d043-2f3c-4278-9fe9-daefaa84b053"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > cache-control header > keeps normal caching when refresh is "false" +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"604f9c37-ded1-434c-ae0a-f0ce706c44af"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > cache-control header > keeps normal caching when refresh is "false" +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"604f9c37-ded1-434c-ae0a-f0ce706c44af"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > cache-control header > keeps normal caching when refresh is "1" (not the exact string "true") +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"b165d8dd-7e0c-4e20-8fed-438f10d6dc7d"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > cache-control header > keeps normal caching when refresh is "1" (not the exact string "true") +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":5,"requestId":"b165d8dd-7e0c-4e20-8fed-438f10d6dc7d"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > security headers > sets a strict Content-Security-Policy with safe SVG styling rules +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"2771e3d6-e290-4909-97ef-1ebf317a97e0"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > security headers > sets a strict Content-Security-Policy with safe SVG styling rules +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":0,"requestId":"2771e3d6-e290-4909-97ef-1ebf317a97e0"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > speed parameter > accepts a valid integer speed like "3s" and passes it to the SVG +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"384c6e3d-9ef5-4d74-a3db-7b5c7f11f984"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > speed parameter > accepts a valid integer speed like "3s" and passes it to the SVG +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"384c6e3d-9ef5-4d74-a3db-7b5c7f11f984"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > speed parameter > falls back to 8s for decimal values below minimum bound +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"c3193e2e-68ee-4bc6-ae3b-912712728d31"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > speed parameter > falls back to 8s for decimal values below minimum bound +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":5,"requestId":"c3193e2e-68ee-4bc6-ae3b-912712728d31"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > speed parameter > falls back to 8s when the speed format is invalid (no unit) +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"0cf3f838-a5e9-4bd7-a923-065e494917a7"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > speed parameter > falls back to 8s when the speed format is invalid (no unit) +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":6,"requestId":"0cf3f838-a5e9-4bd7-a923-065e494917a7"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > speed parameter > falls back to 8s when speed is a bare number without the "s" suffix +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"8710c2a3-df90-4a45-aca1-7c026c169c27"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > speed parameter > falls back to 8s when speed is a bare number without the "s" suffix +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":0,"requestId":"8710c2a3-df90-4a45-aca1-7c026c169c27"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > speed parameter > falls back to 8s when speed=10 is provided without unit +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"e6112e9d-0214-4222-ac5e-6f428082225b"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > speed parameter > falls back to 8s when speed=10 is provided without unit +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"e6112e9d-0214-4222-ac5e-6f428082225b"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > speed parameter > falls back to 8s when speed is below minimum bound +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"8dfd65ea-d668-47bc-b7b4-e6acb0b16eb6"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > speed parameter > falls back to 8s when speed is below minimum bound +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"8dfd65ea-d668-47bc-b7b4-e6acb0b16eb6"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > speed parameter > falls back to 8s when speed exceeds maximum bound +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"6008ee51-76c4-43c1-8b9d-c759dcd31055"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > speed parameter > falls back to 8s when speed exceeds maximum bound +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"6008ee51-76c4-43c1-8b9d-c759dcd31055"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > speed parameter > accepts the minimum boundary speed "2s" +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"da72f92a-551e-474f-9965-ccd5931bd57c"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > speed parameter > accepts the minimum boundary speed "2s" +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"da72f92a-551e-474f-9965-ccd5931bd57c"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > speed parameter > accepts the maximum boundary speed "20s" +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"060a1da8-f885-4359-82ab-d3a297f15a8e"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > speed parameter > accepts the maximum boundary speed "20s" +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"060a1da8-f885-4359-82ab-d3a297f15a8e"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > speed parameter > preserves an in-range decimal speed like "8.5s" instead of forcing it to an integer +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"5321891f-5f74-4831-860f-65a9b7ac10d9"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > speed parameter > preserves an in-range decimal speed like "8.5s" instead of forcing it to an integer +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"5321891f-5f74-4831-860f-65a9b7ac10d9"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > scale parameter > returns 200 when scale=log is given +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"621aa88d-df19-4bdf-bff4-4a670ac0cbba"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > scale parameter > returns 200 when scale=log is given +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"621aa88d-df19-4bdf-bff4-4a670ac0cbba"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > scale parameter > defaults to linear scale when an unknown scale value is given +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"ce99d11a-55ca-486d-8774-08fa389c8b5d"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > scale parameter > defaults to linear scale when an unknown scale value is given +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"ce99d11a-55ca-486d-8774-08fa389c8b5d"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > scale parameter > defaults to linear scale when scale=foo is given +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"156b5b82-dc40-4c92-b59d-b2e69ee74094"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > scale parameter > defaults to linear scale when scale=foo is given +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":6,"requestId":"156b5b82-dc40-4c92-b59d-b2e69ee74094"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > scale parameter > produces different SVG output for scale=log versus scale=linear with mixed contribution counts +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"cfdee221-b642-447e-a524-33beab72ac26"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > scale parameter > produces different SVG output for scale=log versus scale=linear with mixed contribution counts +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":3,"requestId":"cfdee221-b642-447e-a524-33beab72ac26"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > scale parameter > produces different SVG output for scale=log versus scale=linear with mixed contribution counts +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"b1fba684-6d8b-4d06-ad98-8de33bb39913"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > scale parameter > produces different SVG output for scale=log versus scale=linear with mixed contribution counts +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":0,"requestId":"b1fba684-6d8b-4d06-ad98-8de33bb39913"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > year parameter > accepts a valid 4-digit year +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"caef861c-ece6-4986-8bc5-1b96a64862b6"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > year parameter > accepts a valid 4-digit year +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"caef861c-ece6-4986-8bc5-1b96a64862b6"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > year parameter > passes correct from/to range when ?year=2023 is provided +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"26c651e7-8e91-424a-87f9-80f3fe87f9a0"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > year parameter > passes correct from/to range when ?year=2023 is provided +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"26c651e7-8e91-424a-87f9-80f3fe87f9a0"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > year parameter > passes correct from/to range when ?year=2008 is provided +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"6e0e8c38-5b09-4c48-856c-81064dc273b5"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > year parameter > passes correct from/to range when ?year=2008 is provided +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"6e0e8c38-5b09-4c48-856c-81064dc273b5"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > year parameter > returns 400 when custom from date is after custom to date +[INFO] Incoming streak request {"source":"streak","requestId":"18cc2138-40ad-449d-99d0-aace92058ee4"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > year parameter > functions normally when the year parameter is missing +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"fe000669-b6a0-4e86-852c-b66558e0db70"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > year parameter > functions normally when the year parameter is missing +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":0,"requestId":"fe000669-b6a0-4e86-852c-b66558e0db70"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > year parameter > returns 400 for invalid year format +[INFO] Incoming streak request {"source":"streak","requestId":"02c3df0e-d9dd-4863-864f-61e01062e311"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > year parameter > returns 400 for malformed numeric year +[INFO] Incoming streak request {"source":"streak","requestId":"2c019d4e-69bc-4be9-b476-21004f3f4dd3"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > year parameter > returns 400 for years before GitHub existed +[INFO] Incoming streak request {"source":"streak","requestId":"0057a9d8-b214-4f11-b817-d0bc6620ed79"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > year parameter > returns 400 for the year=2007(before GitHub was founded) +[INFO] Incoming streak request {"source":"streak","requestId":"cbcfa3e4-8a35-41da-9ea8-eb7d027111bb"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > year parameter > returns 400 for future years +[INFO] Incoming streak request {"source":"streak","requestId":"fbb5697d-c7b6-4919-8f47-f8b0f40aa79a"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > year parameter > accepts year=2008 (the earliest valid year) +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"10f9a931-6319-41ee-a0e7-b58e162658d0"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > year parameter > accepts year=2008 (the earliest valid year) +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"10f9a931-6319-41ee-a0e7-b58e162658d0"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > year parameter > accepts the current year +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"921231de-cf65-4dc5-ab1d-03c6041fb195"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > year parameter > accepts the current year +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"921231de-cf65-4dc5-ab1d-03c6041fb195"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > year parameter > date parameter > returns 400 for malformed ?date= query parameter values (Variation 3) +[INFO] Incoming streak request {"source":"streak","requestId":"91ff4948-aba5-405d-a3cb-a90afc4e42ef"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > year parameter > date parameter > returns 400 when an invalid ISO8601 calendar date format like "2026-15-40" is supplied +[INFO] Incoming streak request {"source":"streak","requestId":"a26dbdaa-5ec6-4033-93d5-a23ed25e3866"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > year parameter > date parameter > returns 400 when an invalid ISO8601 calendar date format like "2026-15-40" is supplied (Variation 4) +[INFO] Incoming streak request {"source":"streak","requestId":"94d0f794-b779-4e72-8f0d-e882d7b8b970"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > radius parameter > applies radius=16 to the SVG background rect +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"26474270-9849-4bcb-8fc8-b334d4c0e41a"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > radius parameter > applies radius=16 to the SVG background rect +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"26474270-9849-4bcb-8fc8-b334d4c0e41a"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > radius parameter > applies radius=0 to the SVG background rect +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"56e52b7e-530f-4482-a783-bb61b581fb45"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > radius parameter > applies radius=0 to the SVG background rect +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":0,"requestId":"56e52b7e-530f-4482-a783-bb61b581fb45"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > radius parameter > clamps radius values above the maximum limit +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"24ab1c77-a7ba-4233-a7fa-f05ab595b3ac"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > radius parameter > clamps radius values above the maximum limit +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"24ab1c77-a7ba-4233-a7fa-f05ab595b3ac"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > radius parameter > clamps negative radius to 0 +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"6fdd8b4e-b415-4421-b58b-d2dcf2b410d0"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > radius parameter > clamps negative radius to 0 +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"6fdd8b4e-b415-4421-b58b-d2dcf2b410d0"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > radius parameter > handles non-numeric radius gracefully +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"eea5b41b-8e52-4bdd-9b09-40b3e1f2dacc"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > radius parameter > handles non-numeric radius gracefully +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"eea5b41b-8e52-4bdd-9b09-40b3e1f2dacc"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > theme parameter > returns 200 for a valid known theme like "neon" +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"efc1d367-c54b-49dd-a96f-c019a4f82969"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > theme parameter > returns 200 for a valid known theme like "neon" +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"efc1d367-c54b-49dd-a96f-c019a4f82969"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > theme parameter > returns SVG content type for theme=neon +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"d8e535cb-c35a-4863-8dfa-ac2ca1315ab1"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > theme parameter > returns SVG content type for theme=neon +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":0,"requestId":"d8e535cb-c35a-4863-8dfa-ac2ca1315ab1"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > theme parameter > returns SVG content type for theme=dracula +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"5c52122e-f0e2-43df-89df-877c13a384a4"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > theme parameter > returns SVG content type for theme=dracula +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"5c52122e-f0e2-43df-89df-877c13a384a4"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > theme parameter > returns SVG content type for theme=auto +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"505bb4b0-9fe0-495f-b68d-4320529fd909"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > theme parameter > returns SVG content type for theme=auto +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"505bb4b0-9fe0-495f-b68d-4320529fd909"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > theme parameter > returns auto-theme SVG markup with dark-mode CSS variables when theme=auto +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"e50e9ce4-cb00-4bde-82ef-2c89b6fca73a"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > theme parameter > returns auto-theme SVG markup with dark-mode CSS variables when theme=auto +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":0,"requestId":"e50e9ce4-cb00-4bde-82ef-2c89b6fca73a"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > theme parameter > returns 400 Bad Request listing allowed themes when an invalid theme is provided +[INFO] Incoming streak request {"source":"streak","requestId":"fdb7c551-283f-4719-abc9-f1c53d118964"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > theme parameter > returns 400 when theme parameter contains only whitespace +[INFO] Incoming streak request {"source":"streak","requestId":"f682eca5-0c8f-4de1-bced-06ac5080177f"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > theme parameter > accepts capitalized or mixed-case theme parameter like "NEON" and maps it correctly +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"a7fca640-3348-41de-824e-560b37db00be"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > theme parameter > accepts capitalized or mixed-case theme parameter like "NEON" and maps it correctly +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"a7fca640-3348-41de-824e-560b37db00be"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > theme parameter > accepts mixed-case "random" or "auto" and resolves correctly +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"9868a349-e427-4711-a6af-d9495891423b"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > theme parameter > accepts mixed-case "random" or "auto" and resolves correctly +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"9868a349-e427-4711-a6af-d9495891423b"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > custom colour overrides > embeds a custom background colour in the SVG when bg is provided +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"53458edd-6909-4e33-8f27-ae544d1b252b"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > custom colour overrides > embeds a custom background colour in the SVG when bg is provided +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"53458edd-6909-4e33-8f27-ae544d1b252b"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > custom colour overrides > embeds a custom accent colour in the SVG when accent is provided +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"5bb5cb16-7d70-46bc-b0ec-c68b671ee589"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > custom colour overrides > embeds a custom accent colour in the SVG when accent is provided +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"5bb5cb16-7d70-46bc-b0ec-c68b671ee589"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > custom colour overrides > embeds a custom text color in the SVG when text is provided +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"fe32d9fd-ea1a-4e0a-a5a8-a723745587e2"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > custom colour overrides > embeds a custom text color in the SVG when text is provided +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"fe32d9fd-ea1a-4e0a-a5a8-a723745587e2"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > custom colour overrides > does not crash when an invalid text color is provided and falls back gracefully +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"c712ea4d-4e99-4cd8-a44f-600ffba66f86"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > custom colour overrides > does not crash when an invalid text color is provided and falls back gracefully +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"c712ea4d-4e99-4cd8-a44f-600ffba66f86"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > custom colour overrides > falls back gracefully when an invalid hex color is passed as accent +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"84507691-1ed1-4197-a770-28b11e6ccdfa"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > custom colour overrides > falls back gracefully when an invalid hex color is passed as accent +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"84507691-1ed1-4197-a770-28b11e6ccdfa"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > custom colour overrides > strips invalid color hex syntax targeting the ?accent= parameter and returns 200 +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"0d4cd4c4-3d16-419e-b4b4-8c3c7df930b0"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > custom colour overrides > strips invalid color hex syntax targeting the ?accent= parameter and returns 200 +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"0d4cd4c4-3d16-419e-b4b4-8c3c7df930b0"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > falls back gracefully when an invalid hex color is passed as bg +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"fcfc91ba-48ab-4d46-a5b2-a3345ae710d1"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > falls back gracefully when an invalid hex color is passed as bg +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"fcfc91ba-48ab-4d46-a5b2-a3345ae710d1"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > hide parameters > removes the username title when hide_title=true +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"e8d60a15-879a-4d29-8c5d-42fae0082f62"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > hide parameters > removes the username title when hide_title=true +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":6,"requestId":"e8d60a15-879a-4d29-8c5d-42fae0082f62"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > hide parameters > keeps the username title when hide_title=false +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"46707199-05a7-428a-addb-48c948e5ec5c"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > hide parameters > keeps the username title when hide_title=false +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"46707199-05a7-428a-addb-48c948e5ec5c"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > hide parameters > removes the stats section when hide_stats=true +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"b3fdbdb4-4508-4ada-ad59-daa6b6652dc6"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > hide parameters > removes the stats section when hide_stats=true +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":15,"requestId":"b3fdbdb4-4508-4ada-ad59-daa6b6652dc6"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > hide parameters > keeps the stats section when hide_stats=false +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"9e4d50ed-277c-473d-a984-f81fe89c56da"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > hide parameters > keeps the stats section when hide_stats=false +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"9e4d50ed-277c-473d-a984-f81fe89c56da"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > error handling > returns 500 with SVG content type when fetchGitHubContributions throws +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"56549532-c285-4d62-aac5-261fa4179ec5"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > error handling > returns 500 with SVG content type when fetchGitHubContributions throws +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":0,"requestId":"56549532-c285-4d62-aac5-261fa4179ec5"} + +stderr | app/api/streak/route.test.ts > GET /api/streak > error handling > returns 500 with SVG content type when fetchGitHubContributions throws +[ERROR] Unhandled error {"source":"streak","message":"Something went wrong. Please try again later.","requestId":"56549532-c285-4d62-aac5-261fa4179ec5"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > error handling > embeds the thrown error message in the error SVG +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"4a738cdb-0e53-4a41-9f80-0e2541ce514e"} + +stderr | app/api/streak/route.test.ts > GET /api/streak > error handling > embeds the thrown error message in the error SVG +[ERROR] Unhandled error {"source":"streak","message":"Something went wrong. Please try again later.","requestId":"4a738cdb-0e53-4a41-9f80-0e2541ce514e"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > error handling > embeds the thrown error message in the error SVG +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"4a738cdb-0e53-4a41-9f80-0e2541ce514e"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > error handling > never caches an error response +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"8ede99fc-f3d7-4434-9ded-e68dafe432f0"} + +stderr | app/api/streak/route.test.ts > GET /api/streak > error handling > never caches an error response +[ERROR] Unhandled error {"source":"streak","message":"Something went wrong. Please try again later.","requestId":"8ede99fc-f3d7-4434-9ded-e68dafe432f0"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > error handling > never caches an error response +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"8ede99fc-f3d7-4434-9ded-e68dafe432f0"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > error handling > sets the SVG Content-Security-Policy header on generic error responses +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"b5dffd02-1312-4bf5-bb33-dcfcd320f6bc"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > error handling > sets the SVG Content-Security-Policy header on generic error responses +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":0,"requestId":"b5dffd02-1312-4bf5-bb33-dcfcd320f6bc"} + +stderr | app/api/streak/route.test.ts > GET /api/streak > error handling > sets the SVG Content-Security-Policy header on generic error responses +[ERROR] Unhandled error {"source":"streak","message":"Something went wrong. Please try again later.","requestId":"b5dffd02-1312-4bf5-bb33-dcfcd320f6bc"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > error handling > returns 429 with no-cache headers and rate limit SVG when rate limited +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"a4c8784b-f860-48e7-b1ae-b536fcdf1f89"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > error handling > returns 429 with no-cache headers and rate limit SVG when rate limited +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"a4c8784b-f860-48e7-b1ae-b536fcdf1f89"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > error handling > returns a valid 500 SVG even when something non-Error is thrown +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"0fc7a2a1-f4e0-4d44-af99-5d836a66d69b"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > error handling > returns a valid 500 SVG even when something non-Error is thrown +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":0,"requestId":"0fc7a2a1-f4e0-4d44-af99-5d836a66d69b"} + +stderr | app/api/streak/route.test.ts > GET /api/streak > error handling > returns a valid 500 SVG even when something non-Error is thrown +[ERROR] Unhandled error {"source":"streak","message":"Something went wrong. Please try again later.","requestId":"0fc7a2a1-f4e0-4d44-af99-5d836a66d69b"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > error handling > returns a well-formed SVG structure even in the error state +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"3ba9c170-64a4-47db-8c78-87a9f040e70d"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > error handling > returns a well-formed SVG structure even in the error state +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":0,"requestId":"3ba9c170-64a4-47db-8c78-87a9f040e70d"} + +stderr | app/api/streak/route.test.ts > GET /api/streak > error handling > returns a well-formed SVG structure even in the error state +[ERROR] Unhandled error {"source":"streak","message":"Something went wrong. Please try again later.","requestId":"3ba9c170-64a4-47db-8c78-87a9f040e70d"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > timezone parameter (?tz=) > returns 400 when an unrecognised IANA timezone is supplied +[INFO] Incoming streak request {"source":"streak","requestId":"0a06fcee-0058-41d2-b41b-1c93dd5fd97d"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > timezone parameter (?tz=) > returns 400 and names the bad value in the field error +[INFO] Incoming streak request {"source":"streak","requestId":"90db8f5a-add0-4faa-b7af-2971152e8f3b"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > timezone parameter (?tz=) > is not vulnerable to XSS via tz parameter +[INFO] Incoming streak request {"source":"streak","requestId":"d9f6b38f-cc64-4d8c-9dcb-71025bf4797b"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > timezone parameter (?tz=) > returns 200 with a valid IANA timezone +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"2d2ade8c-2775-43ed-992a-2404435c42da"} +[INFO] Streak request completed {"source":"streak","requestId":"2d2ade8c-2775-43ed-992a-2404435c42da"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > timezone parameter (?tz=) > returns 200 with a valid IANA timezone +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2} + +stdout | app/api/streak/route.test.ts > GET /api/streak > timezone parameter (?tz=) > uses getSecondsUntilMidnightInTimezone (not UTC) for the cache TTL when ?tz= is set +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"b0bb546e-a6f8-46d2-a24e-dd27d9d6ef44"} +[INFO] Streak request completed {"source":"streak","requestId":"b0bb546e-a6f8-46d2-a24e-dd27d9d6ef44"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > timezone parameter (?tz=) > uses getSecondsUntilMidnightInTimezone (not UTC) for the cache TTL when ?tz= is set +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1} + +stdout | app/api/streak/route.test.ts > GET /api/streak > timezone parameter (?tz=) > still uses getSecondsUntilUTCMidnight when no ?tz= param is given +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"cdf6620e-fca1-4b93-a749-fff2c17a12b4"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > timezone parameter (?tz=) > still uses getSecondsUntilUTCMidnight when no ?tz= param is given +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"cdf6620e-fca1-4b93-a749-fff2c17a12b4"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > timezone parameter (?tz=) > returns 200 with valid SVG and calls getSecondsUntilMidnightInTimezone for Australia/Sydney +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"4fd721f2-bb24-4e2b-8716-494d1f9f38fc"} +[INFO] Streak request completed {"source":"streak","requestId":"4fd721f2-bb24-4e2b-8716-494d1f9f38fc"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > timezone parameter (?tz=) > returns 200 with valid SVG and calls getSecondsUntilMidnightInTimezone for Australia/Sydney +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2} + +stdout | app/api/streak/route.test.ts > GET /api/streak > timezone parameter (?tz=) > returns 400 when a fictitious planetary timezone Mars/Cyonia is supplied +[INFO] Incoming streak request {"source":"streak","requestId":"1f116abb-39a9-4af8-b88c-2402a9385984"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > timezone parameter (?tz=) > rejects a path-traversal ?tz= payload before it reaches the GitHub API or TTL logic +[INFO] Incoming streak request {"source":"streak","requestId":"376ec342-0bf9-43b6-93e5-837f98d45877"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > timezone parameter (?tz=) > returns 400 (not 500) when Intl.DateTimeFormat throws RangeError at runtime +[INFO] Incoming streak request {"source":"streak","requestId":"3345fb02-c770-4c1a-ba8c-0ef24a3e3e3f"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > hide_background parameter > produces a transparent background when ?hide_background=true is set +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"b8758804-2075-4560-89a5-dd10a33460e4"} + + ✓ app/generator/components/EditorPanel.empty-fallback.test.tsx (23 tests) 22977ms + ✓ renders the Name section heading 911ms + ✓ renders the Description section heading 758ms + ✓ renders the Technologies section heading 715ms + ✓ renders the Socials section heading 520ms + ✓ renders the CommitPulse Badge section heading 396ms + ✓ calls onNameChange with the typed value 805ms + ✓ reflects controlled value in the name input 633ms + ✓ calls onDescriptionChange when the bio textarea changes 712ms + ✓ shows "280 characters remaining" for an empty description 668ms + ✓ decrements the counter as text is added 385ms + ✓ counter text turns amber when fewer than 40 characters remain 451ms + ✓ hides the GitHub username input when showCommitPulse is false 453ms + ✓ shows the GitHub username input when showCommitPulse is true 457ms + ✓ calls onShowCommitPulseChange(true) when the toggle is clicked while off 478ms + ✓ calls onShowCommitPulseChange(false) when the toggle is clicked while on 406ms + ✓ toggle aria-checked reflects the current showCommitPulse state 505ms + ✓ calls onCommitPulseAccentChange when typing a hex value 815ms + ✓ shows "Invalid hex" warning for a partial / invalid hex string 655ms + ✓ does NOT show an "Invalid hex" warning for a valid 6-char hex 539ms + ✓ shows a "Clear" button when the accent is a valid hex 677ms + ✓ clicking Clear calls onCommitPulseAccentChange with an empty string 1603ms + ✓ hides the name input after the Name section header is clicked 7145ms + ✓ reveals the name input again when the collapsed header is re-clicked 2273ms +stdout | app/api/streak/route.test.ts > GET /api/streak > hide_background parameter > produces a transparent background when ?hide_background=true is set +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"b8758804-2075-4560-89a5-dd10a33460e4"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > hide_background parameter > does not produce a transparent background when ?hide_background is omitted +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"d76a6a38-ee4f-44ac-b905-81f86009fa4a"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > hide_background parameter > does not produce a transparent background when ?hide_background is omitted +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":0,"requestId":"d76a6a38-ee4f-44ac-b905-81f86009fa4a"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > monthly view parameter > returns a valid monthly SVG response when view=monthly is given +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"monthly","requestId":"a89d46a9-8121-43ef-9a81-ca95ff2b326b"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > monthly view parameter > returns a valid monthly SVG response when view=monthly is given +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"monthly","format":"svg","status":200,"durationMs":2,"requestId":"a89d46a9-8121-43ef-9a81-ca95ff2b326b"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > monthly view parameter > automatically overrides or widens the query bounds to encompass the start of the previous month when view=monthly is requested with custom from/to params +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"monthly","requestId":"eb24a348-1fdc-43c9-a8c1-54800ba0def0"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > monthly view parameter > automatically overrides or widens the query bounds to encompass the start of the previous month when view=monthly is requested with custom from/to params +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"monthly","format":"svg","status":200,"durationMs":0,"requestId":"eb24a348-1fdc-43c9-a8c1-54800ba0def0"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > monthly view parameter > uses the selected year when generating archived monthly stats +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"monthly","requestId":"ac2e3820-7d7b-4ebc-affe-e435fda07cac"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > monthly view parameter > uses the selected year when generating archived monthly stats +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"monthly","format":"svg","status":200,"durationMs":0,"requestId":"ac2e3820-7d7b-4ebc-affe-e435fda07cac"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > monthly view parameter > uses valid custom width and height in monthly SVG output +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"monthly","requestId":"44fb0059-0963-4b5e-a208-fa45dfad5306"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > monthly view parameter > uses valid custom width and height in monthly SVG output +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"monthly","format":"svg","status":200,"durationMs":2,"requestId":"44fb0059-0963-4b5e-a208-fa45dfad5306"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > monthly view parameter > defaults to default view when an unknown view is given +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"7fe7532a-e678-48db-9515-1dcfc450e799"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > monthly view parameter > defaults to default view when an unknown view is given +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":0,"requestId":"7fe7532a-e678-48db-9515-1dcfc450e799"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > monthly view parameter > returns streak view when view=streak is given +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"defe44da-3674-49c3-a36b-956628c24f09"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > monthly view parameter > returns streak view when view=streak is given +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"defe44da-3674-49c3-a36b-956628c24f09"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > monthly view parameter > applies custom width and height parameters to the monthly SVG +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"monthly","requestId":"046d9151-9bb3-45b3-8bcd-745878f340ef"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > monthly view parameter > applies custom width and height parameters to the monthly SVG +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"monthly","format":"svg","status":200,"durationMs":2,"requestId":"046d9151-9bb3-45b3-8bcd-745878f340ef"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > monthly view parameter > applies delta_format=both to show percent and absolute values in the monthly SVG +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"monthly","requestId":"c8b5ea61-0725-4841-8122-0f428a83e89f"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > monthly view parameter > applies delta_format=both to show percent and absolute values in the monthly SVG +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"monthly","format":"svg","status":200,"durationMs":0,"requestId":"c8b5ea61-0725-4841-8122-0f428a83e89f"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > monthly view parameter > applies delta_format=absolute to show raw commit counts in the monthly SVG +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"monthly","requestId":"16d066f0-381f-47e3-9da1-3534fac06ac3"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > monthly view parameter > applies delta_format=absolute to show raw commit counts in the monthly SVG +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"monthly","format":"svg","status":200,"durationMs":0,"requestId":"16d066f0-381f-47e3-9da1-3534fac06ac3"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > theme=random cache header > returns no-cache header when ?theme=random is given +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"676bb4d2-e135-46f9-8a31-208f64e33cc4"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > theme=random cache header > returns no-cache header when ?theme=random is given +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"676bb4d2-e135-46f9-8a31-208f64e33cc4"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > Ghost City Mode (route integration) > returns ghost city SVG when user has 0 total contributions +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"4db938d5-e718-4813-9d27-65a775468d39"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > Ghost City Mode (route integration) > returns ghost city SVG when user has 0 total contributions +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":0,"requestId":"4db938d5-e718-4813-9d27-65a775468d39"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > lang parameter > returns Spanish translations when ?lang=es is given +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"caba9e3e-82cf-432e-9db6-2c19a7f83441"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > lang parameter > returns Spanish translations when ?lang=es is given +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"caba9e3e-82cf-432e-9db6-2c19a7f83441"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > lang parameter > returns Hindi translations when ?lang=hi is given +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"f148f387-2bba-4a2c-8d7d-f44b5dbd3108"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > lang parameter > returns Hindi translations when ?lang=hi is given +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"f148f387-2bba-4a2c-8d7d-f44b5dbd3108"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > lang parameter > returns French translations when ?lang=fr is given +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"9ab6f790-53c4-491b-9e9d-62c9156f12c9"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > lang parameter > returns French translations when ?lang=fr is given +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"9ab6f790-53c4-491b-9e9d-62c9156f12c9"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > lang parameter > falls back to English when an unknown ?lang=xx is given +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"ed36e5ba-f275-404b-aa87-59dccf6f2c30"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > lang parameter > falls back to English when an unknown ?lang=xx is given +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"ed36e5ba-f275-404b-aa87-59dccf6f2c30"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > font parameter sanitization > uses the default font when font param is omitted +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"da77b313-6a04-4e15-8365-80d189cd103c"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > font parameter sanitization > uses the default font when font param is omitted +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"da77b313-6a04-4e15-8365-80d189cd103c"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > font parameter sanitization > uses the default font when font param is an empty string +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"9297456d-f2b6-47da-aa57-b24f87bed226"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > font parameter sanitization > uses the default font when font param is an empty string +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"9297456d-f2b6-47da-aa57-b24f87bed226"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > font parameter sanitization > uses the default font when font param is whitespace only +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"197ab978-67ae-4aed-9913-9f9dbc222b90"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > font parameter sanitization > uses the default font when font param is whitespace only +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"197ab978-67ae-4aed-9913-9f9dbc222b90"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > font parameter sanitization > passes a valid predefined font name through to the SVG +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"0324e7b7-3966-48d2-88db-8e1146e8a915"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > font parameter sanitization > passes a valid predefined font name through to the SVG +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"0324e7b7-3966-48d2-88db-8e1146e8a915"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > font parameter sanitization > passes a valid custom font name through and emits a Google Fonts import +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"093dc515-6c5f-4f23-a9d9-89d6f2ff5c4c"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > font parameter sanitization > passes a valid custom font name through and emits a Google Fonts import +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"093dc515-6c5f-4f23-a9d9-89d6f2ff5c4c"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > font parameter sanitization > encodes spaces in multi-word font names as "+" in the Google Fonts URL +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"e3d0017f-adf9-461a-aa0e-3db45f3c4583"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > font parameter sanitization > encodes spaces in multi-word font names as "+" in the Google Fonts URL +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"e3d0017f-adf9-461a-aa0e-3db45f3c4583"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > font parameter sanitization > falls back to the default font when font contains only special characters +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"76997f11-4d94-4040-91a3-4ca6f3b71076"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > font parameter sanitization > falls back to the default font when font contains only special characters +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"76997f11-4d94-4040-91a3-4ca6f3b71076"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > font parameter sanitization > strips dangerous characters from a font name containing a double-quote +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"96241946-0d2b-4b08-bebe-ce0b151a0ad1"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > font parameter sanitization > strips dangerous characters from a font name containing a double-quote +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"96241946-0d2b-4b08-bebe-ce0b151a0ad1"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > font parameter sanitization > rejects a font name containing a semicolon (CSS injection attempt) +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"2c6fd053-fe3c-47ab-9eff-230a73140f8f"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > font parameter sanitization > rejects a font name containing a semicolon (CSS injection attempt) +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":3,"requestId":"2c6fd053-fe3c-47ab-9eff-230a73140f8f"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > font parameter sanitization > strips special characters from a URL-like font name (path traversal / injection attempt) +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"d0dd86a8-d157-4cf7-a8ab-888dedd4322c"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > font parameter sanitization > strips special characters from a URL-like font name (path traversal / injection attempt) +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":4,"requestId":"d0dd86a8-d157-4cf7-a8ab-888dedd4322c"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > font parameter sanitization > rejects a font name containing a script tag (XSS attempt) +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"4c28d2ad-07d0-4ce0-b18e-013f147d74c3"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > font parameter sanitization > rejects a font name containing a script tag (XSS attempt) +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"4c28d2ad-07d0-4ce0-b18e-013f147d74c3"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > font parameter sanitization > does not emit a Google Fonts import when a predefined font is used +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"e8d11d03-59c9-451a-9f30-e40f19204299"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > font parameter sanitization > does not emit a Google Fonts import when a predefined font is used +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":3,"requestId":"e8d11d03-59c9-451a-9f30-e40f19204299"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > font parameter sanitization > returns 200 and a valid SVG even when an extreme font value is supplied +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"40b2497c-35ae-41fb-9654-d59fa17f02af"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > font parameter sanitization > returns 200 and a valid SVG even when an extreme font value is supplied +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"40b2497c-35ae-41fb-9654-d59fa17f02af"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > font parameter sanitization > passes custom font name and emits Google Fonts import under theme=auto +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"1377224e-1f3f-48e5-aacf-8218543e9143"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > font parameter sanitization > passes custom font name and emits Google Fonts import under theme=auto +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":3,"requestId":"1377224e-1f3f-48e5-aacf-8218543e9143"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > font parameter sanitization > route-level: ?font=jetbrains returns SVG containing JetBrains Mono +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"d300fa7e-8160-4d39-8d60-8482adca1d4d"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > font parameter sanitization > route-level: ?font=jetbrains returns SVG containing JetBrains Mono +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"d300fa7e-8160-4d39-8d60-8482adca1d4d"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > font parameter sanitization > route-level: ?font=Inter returns SVG containing Google Fonts import URL +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"fb3dee8e-cb3f-492d-8c38-b3a8837eec20"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > font parameter sanitization > route-level: ?font=Inter returns SVG containing Google Fonts import URL +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":3,"requestId":"fb3dee8e-cb3f-492d-8c38-b3a8837eec20"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > font parameter sanitization > route-level: empty ?font falls back to default font +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"dc6dcd96-80fc-4c2b-bc17-12cd7dad35b9"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > font parameter sanitization > route-level: empty ?font falls back to default font +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"dc6dcd96-80fc-4c2b-bc17-12cd7dad35b9"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > stale-while-revalidate cache header > contains stale-while-revalidate=59 for normal request +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"d88f53cc-2f1b-4670-99c1-54a39141fb8f"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > stale-while-revalidate cache header > contains stale-while-revalidate=59 for normal request +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":5,"requestId":"d88f53cc-2f1b-4670-99c1-54a39141fb8f"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > stale-while-revalidate cache header > does NOT contain stale-while-revalidate when ?refresh=true +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"8b01001a-23df-4efc-8b17-24593f024561"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > stale-while-revalidate cache header > does NOT contain stale-while-revalidate when ?refresh=true +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"8b01001a-23df-4efc-8b17-24593f024561"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > falls back to commits mode when ?mode=unknown is given +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"0c45f276-e9ec-4410-ac03-552e0d246e8e"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > falls back to commits mode when ?mode=unknown is given +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"0c45f276-e9ec-4410-ac03-552e0d246e8e"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > org parameter validation > returns 400 when org parameter is a User instead of an Organization +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"f72e3134-75a8-4e6e-864e-3a3c0569a788"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > org parameter validation > returns 400 when org parameter is a User instead of an Organization +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":7,"requestId":"f72e3134-75a8-4e6e-864e-3a3c0569a788"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > multi-user skyline merges > fetches calendars concurrently, aggregates them, and overrides the title in the SVG +[INFO] Incoming streak request {"source":"streak","user":"a, b","view":"default","requestId":"a63f5340-72fb-4c78-aaf8-116729279a61"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > multi-user skyline merges > fetches calendars concurrently, aggregates them, and overrides the title in the SVG +[INFO] Streak request completed {"source":"streak","user":"a, b","view":"default","format":"svg","status":200,"durationMs":9,"requestId":"a63f5340-72fb-4c78-aaf8-116729279a61"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > multi-user skyline merges > gracefully handles partial fetch failures by filtering out failed calendars +[INFO] Incoming streak request {"source":"streak","user":"a, b","view":"default","requestId":"2594048f-ce90-4586-a6e9-8f976f82cca5"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > multi-user skyline merges > gracefully handles partial fetch failures by filtering out failed calendars +[INFO] Streak request completed {"source":"streak","user":"a, b","view":"default","format":"svg","status":200,"durationMs":7,"requestId":"2594048f-ce90-4586-a6e9-8f976f82cca5"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > multi-user skyline merges > returns a 404/error response when all users in the list fail to load +[INFO] Incoming streak request {"source":"streak","user":"a, b","view":"default","requestId":"f4321657-7ad0-4db3-b734-d53bc6a1a4f4"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > multi-user skyline merges > returns a 404/error response when all users in the list fail to load +[INFO] Streak request completed {"source":"streak","user":"a, b","view":"default","format":"svg","status":200,"durationMs":0,"requestId":"f4321657-7ad0-4db3-b734-d53bc6a1a4f4"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > multi-user skyline merges > rejects requests with more than 7 users with a 400 Bad Request +[INFO] Incoming streak request {"source":"streak","user":"a, b, c, d, e, f, g, h","view":"default","requestId":"bf3faa7e-a528-4850-9380-bb9620f928ef"} +[INFO] Streak request completed {"source":"streak","user":"a, b, c, d, e, f, g, h","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"bf3faa7e-a528-4850-9380-bb9620f928ef"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > grace parameter boundary validation > returns 200 and accepts grace=0 (minimum boundary) +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"b1b54f70-b833-46f1-b191-c8f7659ebefc"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > grace parameter boundary validation > returns 200 and accepts grace=0 (minimum boundary) +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"b1b54f70-b833-46f1-b191-c8f7659ebefc"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > grace parameter boundary validation > returns 200 and accepts grace=7 (maximum boundary) +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"1bf26d54-09cc-4040-ac33-f14750638563"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > grace parameter boundary validation > returns 200 and accepts grace=7 (maximum boundary) +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"1bf26d54-09cc-4040-ac33-f14750638563"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > grace parameter boundary validation > clamps grace=8 to 7 +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"b53257e3-a12a-4d3d-886f-f888e2ff1eab"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > grace parameter boundary validation > clamps grace=8 to 7 +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":4,"requestId":"b53257e3-a12a-4d3d-886f-f888e2ff1eab"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > grace parameter boundary validation > clamps grace=999 to 7 +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"86bd2b6d-522b-444a-b1cf-66e24553848e"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > grace parameter boundary validation > clamps grace=999 to 7 +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"86bd2b6d-522b-444a-b1cf-66e24553848e"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > grace parameter boundary validation > clamps grace=-1 to 0 +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"a01a14ea-32d7-41cd-ab06-b48fe7993c66"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > grace parameter boundary validation > clamps grace=-1 to 0 +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":0,"requestId":"a01a14ea-32d7-41cd-ab06-b48fe7993c66"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > grace parameter boundary validation > clamps grace=-99 to 0 +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"86e47b02-26cd-4998-b5d5-a8b533b01f5c"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > grace parameter boundary validation > clamps grace=-99 to 0 +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"86e47b02-26cd-4998-b5d5-a8b533b01f5c"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > grace parameter boundary validation > falls back to 1 for non-numeric grace +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"04b7aa91-492b-4fca-bd7f-d823d0163e6b"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > grace parameter boundary validation > falls back to 1 for non-numeric grace +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"04b7aa91-492b-4fca-bd7f-d823d0163e6b"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > grace parameter boundary validation > falls back to 1 for float grace value +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"d852bcff-2d34-407a-984d-af2253efe233"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > grace parameter boundary validation > falls back to 1 for float grace value +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"d852bcff-2d34-407a-984d-af2253efe233"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > grace parameter boundary validation > falls back to 1 for grace with special characters +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"b2b814c2-08af-435e-a4aa-9bc91b268dcb"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > grace parameter boundary validation > falls back to 1 for grace with special characters +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":3,"requestId":"b2b814c2-08af-435e-a4aa-9bc91b268dcb"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > opacity parameter boundary validation > returns 200 and accepts opacity=0.1 (minimum boundary) +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"654ed6c7-3454-4e7b-b4bf-1033bd11d930"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > opacity parameter boundary validation > returns 200 and accepts opacity=0.1 (minimum boundary) +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"654ed6c7-3454-4e7b-b4bf-1033bd11d930"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > opacity parameter boundary validation > returns 200 and accepts opacity=1.0 (maximum boundary) +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"0075423b-cf3c-4c64-b8f1-ebfd8ace1504"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > opacity parameter boundary validation > returns 200 and accepts opacity=1.0 (maximum boundary) +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"0075423b-cf3c-4c64-b8f1-ebfd8ace1504"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > opacity parameter boundary validation > returns 200 with clamped opacity when opacity is 0.0 (below minimum) +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"4d4a1704-6654-475b-8aad-40d0ddc142ec"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > opacity parameter boundary validation > returns 200 with clamped opacity when opacity is 0.0 (below minimum) +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":14,"requestId":"4d4a1704-6654-475b-8aad-40d0ddc142ec"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > opacity parameter boundary validation > returns 200 with clamped opacity when opacity is negative (-0.5) +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"1771e5ad-dbfa-4fd9-8bc5-ab390da508e3"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > opacity parameter boundary validation > returns 200 with clamped opacity when opacity is negative (-0.5) +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"1771e5ad-dbfa-4fd9-8bc5-ab390da508e3"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > opacity parameter boundary validation > returns 200 with clamped opacity when opacity exceeds max (1.5) +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"a275ff34-0fea-4517-bdd5-fd1dbeac4a59"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > opacity parameter boundary validation > returns 200 with clamped opacity when opacity exceeds max (1.5) +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"a275ff34-0fea-4517-bdd5-fd1dbeac4a59"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > opacity parameter boundary validation > returns 200 with clamped opacity when opacity far exceeds max (99.0) +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"157623d7-3850-4ad1-b094-a20ce2599db0"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > opacity parameter boundary validation > returns 200 with clamped opacity when opacity far exceeds max (99.0) +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"157623d7-3850-4ad1-b094-a20ce2599db0"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > opacity parameter boundary validation > returns 200 and defaults to opacity=1.0 when opacity is empty string +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"f62bbae8-6630-4bb9-bc4c-0dbb5e8d2c89"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > opacity parameter boundary validation > returns 200 and defaults to opacity=1.0 when opacity is empty string +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"f62bbae8-6630-4bb9-bc4c-0dbb5e8d2c89"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > opacity parameter boundary validation > returns 200 and defaults to opacity=1.0 when opacity is non-numeric +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"168fdc2d-3dab-408d-a9fb-ae63b644bef3"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > opacity parameter boundary validation > returns 200 and defaults to opacity=1.0 when opacity is non-numeric +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"168fdc2d-3dab-408d-a9fb-ae63b644bef3"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > opacity parameter boundary validation > returns 200 when opacity contains only whitespace +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"4b2120d3-25b7-4dbe-89b4-3db69f613faf"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > opacity parameter boundary validation > returns 200 when opacity contains only whitespace +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"4b2120d3-25b7-4dbe-89b4-3db69f613faf"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > opacity parameter boundary validation > returns 200 with clamped opacity for very small positive value (0.01) +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"4443a8f2-fd86-4249-a9ac-dd1aeb39f782"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > opacity parameter boundary validation > returns 200 with clamped opacity for very small positive value (0.01) +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"4443a8f2-fd86-4249-a9ac-dd1aeb39f782"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > opacity parameter boundary validation > returns 200 with clamped opacity for edge case between min and just below (0.09) +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"b2e65639-79ec-41f4-a4c6-3650ed9c117f"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > opacity parameter boundary validation > returns 200 with clamped opacity for edge case between min and just below (0.09) +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"b2e65639-79ec-41f4-a4c6-3650ed9c117f"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > opacity parameter boundary validation > returns 200 for various valid opacity values in acceptable range +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"f25dfe4d-78da-4e82-855c-7a6f3017ce4d"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > opacity parameter boundary validation > returns 200 for various valid opacity values in acceptable range +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"f25dfe4d-78da-4e82-855c-7a6f3017ce4d"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > opacity parameter boundary validation > returns 200 for various valid opacity values in acceptable range +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"6eeba402-f8ca-4b0a-895f-bef30e91ed71"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > opacity parameter boundary validation > returns 200 for various valid opacity values in acceptable range +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"6eeba402-f8ca-4b0a-895f-bef30e91ed71"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > opacity parameter boundary validation > returns 200 for various valid opacity values in acceptable range +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"9a5c89db-3c38-4aab-9918-731a8476d4c5"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > opacity parameter boundary validation > returns 200 for various valid opacity values in acceptable range +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"9a5c89db-3c38-4aab-9918-731a8476d4c5"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > opacity parameter boundary validation > returns 200 for various valid opacity values in acceptable range +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"665f747d-fec7-4b71-813d-c5c6524b4ada"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > opacity parameter boundary validation > returns 200 for various valid opacity values in acceptable range +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"665f747d-fec7-4b71-813d-c5c6524b4ada"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > opacity parameter boundary validation > returns 200 for various valid opacity values in acceptable range +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"14950894-a2c4-4370-b725-51e388c3857d"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > opacity parameter boundary validation > returns 200 for various valid opacity values in acceptable range +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":3,"requestId":"14950894-a2c4-4370-b725-51e388c3857d"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > opacity parameter boundary validation > returns 200 for various valid opacity values in acceptable range +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"6a14459a-b93e-481b-b53f-67fb561289b7"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > opacity parameter boundary validation > returns 200 for various valid opacity values in acceptable range +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"6a14459a-b93e-481b-b53f-67fb561289b7"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > opacity parameter boundary validation > returns 200 when opacity is scientific notation string (ignored) +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"cdc7b5bd-6bc8-4170-9228-79aa4903e4bb"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > opacity parameter boundary validation > returns 200 when opacity is scientific notation string (ignored) +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"cdc7b5bd-6bc8-4170-9228-79aa4903e4bb"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > opacity parameter boundary validation > returns 200 when opacity contains special characters mixed with numbers +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"5ef22c6f-1c41-49d7-96b2-1b858244aa07"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > opacity parameter boundary validation > returns 200 when opacity contains special characters mixed with numbers +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"5ef22c6f-1c41-49d7-96b2-1b858244aa07"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > combined grace and opacity boundary validation > returns 200 with both grace and opacity at minimum boundaries +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"5336d8a6-6075-407a-bfda-60970da28d63"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > combined grace and opacity boundary validation > returns 200 with both grace and opacity at minimum boundaries +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"5336d8a6-6075-407a-bfda-60970da28d63"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > combined grace and opacity boundary validation > returns 200 with both grace and opacity at maximum boundaries +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"5dc6d8fa-43b5-4d4a-84c7-f3439a08109d"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > combined grace and opacity boundary validation > returns 200 with both grace and opacity at maximum boundaries +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"5dc6d8fa-43b5-4d4a-84c7-f3439a08109d"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > combined grace and opacity boundary validation > clamps both grace and opacity when both exceed max +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"f7aec8af-6d14-47f0-8d80-c1715dbc9e5d"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > combined grace and opacity boundary validation > clamps both grace and opacity when both exceed max +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"f7aec8af-6d14-47f0-8d80-c1715dbc9e5d"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > combined grace and opacity boundary validation > falls back grace to 1 when invalid, returns 200 with valid opacity +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"f4a4fec0-f899-4775-bb15-6a60ac1e28d0"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > combined grace and opacity boundary validation > falls back grace to 1 when invalid, returns 200 with valid opacity +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"f4a4fec0-f899-4775-bb15-6a60ac1e28d0"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > combined grace and opacity boundary validation > returns 200 when grace is valid but opacity is invalid (defaults) +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"24e695e4-18c0-41bc-a37b-44e738f20688"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > combined grace and opacity boundary validation > returns 200 when grace is valid but opacity is invalid (defaults) +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"24e695e4-18c0-41bc-a37b-44e738f20688"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > date parameter validation (Variation 2) > returns 400 Bad Request when ?date= is "2026-15-40" (malformed ISO 8601) +[INFO] Incoming streak request {"source":"streak","requestId":"5119779a-f4b8-43a5-9cb7-caf8c5093f10"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > date parameter validation (Variation 2) > returns a structured error body containing 'Invalid "date" format' for "2026-15-40" +[INFO] Incoming streak request {"source":"streak","requestId":"28b65de0-fe19-4e8e-8181-333dd94432ce"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > date parameter validation (Variation 2) > does not call fetchGitHubContributions when ?date= is malformed +[INFO] Incoming streak request {"source":"streak","requestId":"fc0bde59-000a-4708-8476-12b1b985d7c1"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > date parameter validation (Variation 2) > returns 400 for ?date= with invalid month value "2026-13-01" +[INFO] Incoming streak request {"source":"streak","requestId":"f2fe8a99-b572-4738-8eee-2b9b695d85d4"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > date parameter validation (Variation 2) > returns 400 for a freeform string ?date=not-a-date +[INFO] Incoming streak request {"source":"streak","requestId":"387741f1-52b6-43a6-8f34-1494778db95e"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > date parameter validation (Variation 2) > returns 200 for a valid ?date= in ISO 8601 format +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"0eccb463-b245-4dca-b9dd-be6bd1e212ac"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > date parameter validation (Variation 2) > returns 200 for a valid ?date= in ISO 8601 format +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"0eccb463-b245-4dca-b9dd-be6bd1e212ac"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > user parameter maxLength validation (Variation 5) > returns 400 Bad Request when ?user= is exactly 40 characters long +[INFO] Incoming streak request {"source":"streak","requestId":"48ef59cd-fc4f-4b35-95a6-8d6395a3275b"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > user parameter maxLength validation (Variation 5) > returns an error body containing "cannot exceed 39 characters" for a 40-char username +[INFO] Incoming streak request {"source":"streak","requestId":"9e7078d6-e011-493f-825e-39475061b176"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > user parameter maxLength validation (Variation 5) > does not call fetchGitHubContributions when the username exceeds 39 characters +[INFO] Incoming streak request {"source":"streak","requestId":"370a962a-3890-41f0-8098-2e47adbcb611"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > user parameter maxLength validation (Variation 5) > returns 200 OK for a valid username at the 39-character boundary +[INFO] Incoming streak request {"source":"streak","user":"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa","view":"default","requestId":"58c0ad38-0dd4-4e6d-af1b-fbcb4d7c9f47"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > user parameter maxLength validation (Variation 5) > returns 200 OK for a valid username at the 39-character boundary +[INFO] Streak request completed {"source":"streak","user":"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"58c0ad38-0dd4-4e6d-af1b-fbcb4d7c9f47"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > user parameter maxLength validation (Variation 5) > returns 400 and fieldErrors.user with maxLength message when using NextRequest with 40-char username +[INFO] Incoming streak request {"source":"streak","requestId":"06862b8d-dea1-4582-a8f9-6488d1270c60"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > minify parameter > minifies the SVG by default (minify=true) +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"ab18851a-690b-4fe4-b14d-a6f715cf73e7"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > minify parameter > minifies the SVG by default (minify=true) +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":0,"requestId":"ab18851a-690b-4fe4-b14d-a6f715cf73e7"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > minify parameter > minifies the SVG by default (minify=true) +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"0fc7eef8-1e05-47a5-a3b8-e7f48d5ef0cf"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > minify parameter > minifies the SVG by default (minify=true) +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"0fc7eef8-1e05-47a5-a3b8-e7f48d5ef0cf"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > minify parameter > does not minify the SVG when minify=false +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"5ce90f42-c7fd-47e8-b817-2870e458f84e"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > minify parameter > does not minify the SVG when minify=false +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":4,"requestId":"5ce90f42-c7fd-47e8-b817-2870e458f84e"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > minify parameter > does not minify the SVG when minify=false +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"ec2ca169-fc36-45bb-aa87-0a1908448594"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > minify parameter > does not minify the SVG when minify=false +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"ec2ca169-fc36-45bb-aa87-0a1908448594"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > normalizes cache keys by sorting query parameters alphabetically +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"1b7f6f8c-e22e-4638-9753-b7e7aad8eda2"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > normalizes cache keys by sorting query parameters alphabetically +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":3,"requestId":"1b7f6f8c-e22e-4638-9753-b7e7aad8eda2"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > normalizes cache keys by sorting query parameters alphabetically +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"84346b21-938b-4c92-8440-09142db3a2e2"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > normalizes cache keys by sorting query parameters alphabetically +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"84346b21-938b-4c92-8440-09142db3a2e2"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"bbf05585-a27f-43cd-ac4b-be97ca2ee0f9"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"bbf05585-a27f-43cd-ac4b-be97ca2ee0f9"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"62b81afb-111f-46a9-8a2a-47ce775597d6"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"62b81afb-111f-46a9-8a2a-47ce775597d6"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"a50209ec-2e60-4572-afe4-7a582f1bddf4"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"a50209ec-2e60-4572-afe4-7a582f1bddf4"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"03799082-c993-47e1-bdd5-ccdaaf148bc9"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"03799082-c993-47e1-bdd5-ccdaaf148bc9"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"7d11b339-8ea4-4728-984c-498913d192d0"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"7d11b339-8ea4-4728-984c-498913d192d0"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"8e7eea2c-1dff-4568-8fd2-7109c8a43528"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"8e7eea2c-1dff-4568-8fd2-7109c8a43528"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"643786b3-51ba-44c8-be07-4bfba0446a95"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"643786b3-51ba-44c8-be07-4bfba0446a95"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"c56165fb-1ae0-455c-9e3b-9bf2160d6202"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"c56165fb-1ae0-455c-9e3b-9bf2160d6202"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"b7622cfe-ba3a-42c3-9279-8f971e5f780c"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"b7622cfe-ba3a-42c3-9279-8f971e5f780c"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"e5a9620f-2379-45ba-a1ac-f02099165e97"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":0,"requestId":"e5a9620f-2379-45ba-a1ac-f02099165e97"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"77b1b5fa-f6fa-4ef7-930b-245b900c9a97"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":0,"requestId":"77b1b5fa-f6fa-4ef7-930b-245b900c9a97"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"91683446-202f-48ad-9f5c-918c1c942274"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"91683446-202f-48ad-9f5c-918c1c942274"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"5cfa3cae-dfc0-4d2e-8cbc-5139846d61f2"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":0,"requestId":"5cfa3cae-dfc0-4d2e-8cbc-5139846d61f2"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"318eafa8-8d0f-4c53-ad2e-75d577c2f61b"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":0,"requestId":"318eafa8-8d0f-4c53-ad2e-75d577c2f61b"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"75273ad0-a005-4198-ac7b-127f653a0522"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"75273ad0-a005-4198-ac7b-127f653a0522"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"85c5e7ab-e7fe-474a-88c5-1e83a8742f6e"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"85c5e7ab-e7fe-474a-88c5-1e83a8742f6e"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"7046b45a-b1cd-4a97-b379-280e809892b3"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"7046b45a-b1cd-4a97-b379-280e809892b3"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"60da3c9b-67ac-4572-991b-377b8b34c3fa"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"60da3c9b-67ac-4572-991b-377b8b34c3fa"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"b34fbe5c-a90a-4b50-ae96-2a624edab072"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"b34fbe5c-a90a-4b50-ae96-2a624edab072"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"48b3369e-b3d9-4d10-8ed1-703ee93519b6"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"48b3369e-b3d9-4d10-8ed1-703ee93519b6"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"ca2fd5d3-40ab-47a0-8b86-73928b386d3e"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":5,"requestId":"ca2fd5d3-40ab-47a0-8b86-73928b386d3e"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"ea178b82-2fd0-4c9d-9cd8-72034e9f5cbf"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"ea178b82-2fd0-4c9d-9cd8-72034e9f5cbf"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"9496540a-52fd-4c02-adad-92f49c0eb98c"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"9496540a-52fd-4c02-adad-92f49c0eb98c"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"7c6b56dd-12e1-45ac-95d9-121da4d121c6"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"7c6b56dd-12e1-45ac-95d9-121da4d121c6"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"83368f8d-96c6-4b3f-b0fd-f267af027854"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"83368f8d-96c6-4b3f-b0fd-f267af027854"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"b99b27df-1dd8-488f-9c71-211de9c7740a"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"b99b27df-1dd8-488f-9c71-211de9c7740a"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"3279fa4a-f2ec-4a65-a00e-ea31d13bc6f4"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"3279fa4a-f2ec-4a65-a00e-ea31d13bc6f4"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"71949589-0ea1-4d9d-a66f-2cb389beae22"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"71949589-0ea1-4d9d-a66f-2cb389beae22"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"9fe28a47-a28a-4fde-96fa-1a7d34c2f5d9"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"9fe28a47-a28a-4fde-96fa-1a7d34c2f5d9"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"2e6a88b4-5c30-4fd3-8344-2216c2047efd"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"2e6a88b4-5c30-4fd3-8344-2216c2047efd"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"6309d07c-9df8-45ce-8d65-934e4010ea48"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"6309d07c-9df8-45ce-8d65-934e4010ea48"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"3ddad4d1-f2fe-4e41-966a-16b477c210ec"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"3ddad4d1-f2fe-4e41-966a-16b477c210ec"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"9da23c85-e8ce-4197-b098-05aabf1e7c7d"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"9da23c85-e8ce-4197-b098-05aabf1e7c7d"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"a410003a-c392-437f-8a76-a980cd6c6086"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":0,"requestId":"a410003a-c392-437f-8a76-a980cd6c6086"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"1a66c77c-7595-4175-9810-400c4f744408"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"1a66c77c-7595-4175-9810-400c4f744408"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"a4166880-d3ad-489a-a431-15c48c626962"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"a4166880-d3ad-489a-a431-15c48c626962"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"b37c6fd4-a674-408e-bfc1-b1ed78d6ef7a"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"b37c6fd4-a674-408e-bfc1-b1ed78d6ef7a"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"eb2f6bb3-c902-4e9a-a762-0899d46c2988"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"eb2f6bb3-c902-4e9a-a762-0899d46c2988"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"91c9930b-6a48-4b20-bab4-dd03697bb369"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"91c9930b-6a48-4b20-bab4-dd03697bb369"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"654c8bca-9dd3-4ecb-83ea-29991a76e8f5"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"654c8bca-9dd3-4ecb-83ea-29991a76e8f5"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"f56567ee-f734-4e52-a051-f06ab990baf6"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"f56567ee-f734-4e52-a051-f06ab990baf6"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"02dde368-da24-428e-b056-d69a8f04c14d"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":0,"requestId":"02dde368-da24-428e-b056-d69a8f04c14d"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"7e041d7c-cfa3-4ea3-9e1a-2fec58b94ff5"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"7e041d7c-cfa3-4ea3-9e1a-2fec58b94ff5"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"51e682d8-a46f-4bd9-ae84-a436cd2a8ada"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"51e682d8-a46f-4bd9-ae84-a436cd2a8ada"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"53e1b322-c5aa-488a-879f-54b9d1a1a61d"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"53e1b322-c5aa-488a-879f-54b9d1a1a61d"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"316ef170-09ca-4fa6-9b82-8a416606db6d"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"316ef170-09ca-4fa6-9b82-8a416606db6d"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"7abbc952-b208-4f15-a5f2-230f039b50a8"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"7abbc952-b208-4f15-a5f2-230f039b50a8"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"c97450ab-9a5d-431b-8f1d-5bd1cff22504"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"c97450ab-9a5d-431b-8f1d-5bd1cff22504"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"1f9d8c2a-a958-4519-948f-51e1a31bfe47"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"1f9d8c2a-a958-4519-948f-51e1a31bfe47"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"44941b37-3782-45f2-9daf-562f30aa95cd"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"44941b37-3782-45f2-9daf-562f30aa95cd"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"9b1f4527-194d-4b01-8e28-5d81356c9319"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":0,"requestId":"9b1f4527-194d-4b01-8e28-5d81356c9319"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"80987e37-287d-43e1-8365-e0e1d566ba09"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"80987e37-287d-43e1-8365-e0e1d566ba09"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"dfb474ee-273e-494e-9c87-f85d553f1089"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":0,"requestId":"dfb474ee-273e-494e-9c87-f85d553f1089"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"a4acaef7-148b-4557-bb35-35c6ad7a8808"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"a4acaef7-148b-4557-bb35-35c6ad7a8808"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"af420a5d-bdf7-405d-8133-1197bbf7fd30"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"af420a5d-bdf7-405d-8133-1197bbf7fd30"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"0c8f9c65-7dac-44a2-a074-0cb412504b81"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"0c8f9c65-7dac-44a2-a074-0cb412504b81"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"138eadaa-7ca5-4272-be2b-e9db22708262"} + + ✓ app/generator/components/EditorPanel.accessibility.test.tsx (5 tests) 24436ms + ✓ 1. verifies that the root container has a form landmark and SectionCards use region roles with h3 headings 5972ms + ✓ 2. verifies that text inputs, textareas, and selection fields have properly associated labels via htmlFor 3406ms + ✓ 3. verifies correct tablist, tab, and tabpanel mappings inside sections like SocialsSection 771ms + ✓ 4. verifies interactive elements can receive focus 6963ms + ✓ 5. verifies that the SectionCard header updates aria-expanded states correctly when toggled 7314ms +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"138eadaa-7ca5-4272-be2b-e9db22708262"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"64dd581e-bdcd-4051-8009-faff041e1034"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"64dd581e-bdcd-4051-8009-faff041e1034"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"08073544-a46f-4315-96a5-371343d489ca"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"08073544-a46f-4315-96a5-371343d489ca"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"34fff201-44f7-460a-8299-b44a267d0528"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"34fff201-44f7-460a-8299-b44a267d0528"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"79163f2a-0a40-4f5f-a713-429f5356325f"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"79163f2a-0a40-4f5f-a713-429f5356325f"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"3f4648c5-0c37-4f38-a444-3683e4ef2578"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"3f4648c5-0c37-4f38-a444-3683e4ef2578"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"d97c9cdd-9013-4d85-a367-d30cae411221"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"d97c9cdd-9013-4d85-a367-d30cae411221"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"1db7a62d-f33c-49e1-834b-0d6b758fbcbe"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":0,"requestId":"1db7a62d-f33c-49e1-834b-0d6b758fbcbe"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"e7683ab5-92f2-40b4-abae-2c102b82257c"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"e7683ab5-92f2-40b4-abae-2c102b82257c"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"eab13a8f-599e-4613-8c6e-310520eed86d"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":3,"requestId":"eab13a8f-599e-4613-8c6e-310520eed86d"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"4ebb6889-0e5d-4c46-bc5b-3c7a9abf4b21"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":0,"requestId":"4ebb6889-0e5d-4c46-bc5b-3c7a9abf4b21"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"e87fc0db-e877-464e-b8aa-5f89cd14c45b"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"e87fc0db-e877-464e-b8aa-5f89cd14c45b"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"19fe44cb-44b7-42e0-aeee-0387941f366e"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":0,"requestId":"19fe44cb-44b7-42e0-aeee-0387941f366e"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"deadfa06-1ea3-4354-ba34-a6469fa57d29"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"deadfa06-1ea3-4354-ba34-a6469fa57d29"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"d345b730-3787-4b2c-80b7-648d256cf89e"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"d345b730-3787-4b2c-80b7-648d256cf89e"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"06b31e00-c88d-4eb0-bc36-25b3c209eba6"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"06b31e00-c88d-4eb0-bc36-25b3c209eba6"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"1e020e82-b5d5-45bf-a091-55851f907270"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"1e020e82-b5d5-45bf-a091-55851f907270"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"59f5b054-b354-428c-94d0-b62ea1baf13c"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"59f5b054-b354-428c-94d0-b62ea1baf13c"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"37a7452d-8d9f-4ef9-9f95-c563a4fea550"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"37a7452d-8d9f-4ef9-9f95-c563a4fea550"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"478763b3-a57c-4747-886b-a7e9af054195"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"478763b3-a57c-4747-886b-a7e9af054195"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"2cd4ee6f-8026-484d-a315-f81cb1388d74"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":0,"requestId":"2cd4ee6f-8026-484d-a315-f81cb1388d74"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"d033fbdc-b76f-4f41-bd58-a4ce1b9c721b"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"d033fbdc-b76f-4f41-bd58-a4ce1b9c721b"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"46f38672-13ac-45c4-8044-e7dddaa93f3e"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"46f38672-13ac-45c4-8044-e7dddaa93f3e"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"5a2fd551-2e37-4fa9-9d81-44d5e70be56d"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"5a2fd551-2e37-4fa9-9d81-44d5e70be56d"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"ad9cd188-b0ad-4fad-b829-e57416cc505e"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"ad9cd188-b0ad-4fad-b829-e57416cc505e"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"bec10e72-17ed-43d2-9f23-8ac2cbf1928a"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"bec10e72-17ed-43d2-9f23-8ac2cbf1928a"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"a515a780-1027-446a-a494-c025de56779e"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"a515a780-1027-446a-a494-c025de56779e"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"42170acc-06c3-4f98-8e23-0e5cbe511292"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"42170acc-06c3-4f98-8e23-0e5cbe511292"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"66c2d668-5b0a-4ffa-a90a-050d73d7d4e0"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"66c2d668-5b0a-4ffa-a90a-050d73d7d4e0"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"90709473-8ca7-412d-92ea-36bab531fe1b"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"90709473-8ca7-412d-92ea-36bab531fe1b"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"878e8981-920e-48e2-9998-b58221d8ab95"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"878e8981-920e-48e2-9998-b58221d8ab95"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"808087bb-4487-490c-a32a-131c7148cefa"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"808087bb-4487-490c-a32a-131c7148cefa"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"e998a047-a9db-415e-9c69-eb4b6ee7f7bf"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"e998a047-a9db-415e-9c69-eb4b6ee7f7bf"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"f2ea62c8-0cca-4923-8cd8-2e5ce1e01b33"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"f2ea62c8-0cca-4923-8cd8-2e5ce1e01b33"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"722a98a3-1aad-4e69-8691-9360b16619d1"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"722a98a3-1aad-4e69-8691-9360b16619d1"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"0c80c81f-e848-4965-8efb-fb7c167be4d4"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"0c80c81f-e848-4965-8efb-fb7c167be4d4"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"3212ec5c-d0f7-4178-a9a8-9ba590992141"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":3,"requestId":"3212ec5c-d0f7-4178-a9a8-9ba590992141"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"b10d4df0-7132-4d4f-a523-a79b24443201"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"b10d4df0-7132-4d4f-a523-a79b24443201"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"6b7a9f70-218c-4a52-9de0-63604a630fc2"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":7,"requestId":"6b7a9f70-218c-4a52-9de0-63604a630fc2"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"6ac7d66d-3729-49a2-af2f-2ce24318cb75"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"6ac7d66d-3729-49a2-af2f-2ce24318cb75"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"3d0bcc1d-5e9c-4639-abde-732f6868e655"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"3d0bcc1d-5e9c-4639-abde-732f6868e655"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"e628ab12-ce43-4e8e-86c1-ca6fc2ee3c99"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":5,"requestId":"e628ab12-ce43-4e8e-86c1-ca6fc2ee3c99"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"7b7abf0c-6a30-4b0b-aa6b-638be3a0e2b8"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"7b7abf0c-6a30-4b0b-aa6b-638be3a0e2b8"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"e45e5fd6-3db2-44e8-953c-13bc81d2da16"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"e45e5fd6-3db2-44e8-953c-13bc81d2da16"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"0988b4f7-e86f-4f6f-8b35-e7b7bdb4ac86"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":0,"requestId":"0988b4f7-e86f-4f6f-8b35-e7b7bdb4ac86"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"b374b76e-b4db-4386-b4d8-a52c240ad665"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":0,"requestId":"b374b76e-b4db-4386-b4d8-a52c240ad665"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"10f9eecb-d78a-4f96-9636-3e75a3292b35"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":4,"requestId":"10f9eecb-d78a-4f96-9636-3e75a3292b35"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"29241279-04b8-4518-830d-20e7c8f361b5"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"29241279-04b8-4518-830d-20e7c8f361b5"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"0bffe253-42f0-4a4e-b337-0ce0a11e49f2"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"0bffe253-42f0-4a4e-b337-0ce0a11e49f2"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"a7f1ad1b-e899-48bc-8501-39e7f4f9cc68"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"a7f1ad1b-e899-48bc-8501-39e7f4f9cc68"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"bd2d5e0a-7cf9-40f0-9951-e70e22fb81e3"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"bd2d5e0a-7cf9-40f0-9951-e70e22fb81e3"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"7cb33813-83e5-4a18-93b9-a071386a4571"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"7cb33813-83e5-4a18-93b9-a071386a4571"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"480a0d9f-38a9-46fc-8461-a8853e4d0e25"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"480a0d9f-38a9-46fc-8461-a8853e4d0e25"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"e65fe334-ddfb-454d-a97f-84a26caea6e7"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":0,"requestId":"e65fe334-ddfb-454d-a97f-84a26caea6e7"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"138f0ceb-00be-4bd4-8073-f74da6df5c9e"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"138f0ceb-00be-4bd4-8073-f74da6df5c9e"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"0b351a2a-a532-4d4d-816e-260e161d88d1"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":0,"requestId":"0b351a2a-a532-4d4d-816e-260e161d88d1"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"a3fc2624-1e5f-49b4-a928-ade7c00483c1"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"a3fc2624-1e5f-49b4-a928-ade7c00483c1"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"3ac843d9-3633-4438-a3bd-09a37fb559a5"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"3ac843d9-3633-4438-a3bd-09a37fb559a5"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"a03db941-d4b6-47ca-a320-0b375f9ce6db"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"a03db941-d4b6-47ca-a320-0b375f9ce6db"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"cf44c5b7-cc59-4e66-af13-8e06c5a6ebe5"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"cf44c5b7-cc59-4e66-af13-8e06c5a6ebe5"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"3d25cb86-efd3-41e3-95a2-9cdf6bd9b780"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"3d25cb86-efd3-41e3-95a2-9cdf6bd9b780"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"c5ab038a-d0eb-456d-b601-be383baff3fc"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"c5ab038a-d0eb-456d-b601-be383baff3fc"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"efe3955b-e6e4-414d-b167-cd40adbb5431"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":0,"requestId":"efe3955b-e6e4-414d-b167-cd40adbb5431"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"6cbeca80-b51a-426d-a899-61a4e4e0d433"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"6cbeca80-b51a-426d-a899-61a4e4e0d433"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"87a66a0a-2136-4687-a87f-994fe6daeb22"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"87a66a0a-2136-4687-a87f-994fe6daeb22"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"2ccd8edc-d19f-42a2-b3fb-439ad6bafc84"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"2ccd8edc-d19f-42a2-b3fb-439ad6bafc84"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"49067e3d-76be-45b1-9e41-eb30d93d9b21"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"49067e3d-76be-45b1-9e41-eb30d93d9b21"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"e889100a-c225-4f70-bb17-3b7bf6693133"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"e889100a-c225-4f70-bb17-3b7bf6693133"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"5b1380e6-7a39-4214-b0b7-e6954895f7ed"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"5b1380e6-7a39-4214-b0b7-e6954895f7ed"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"b43159c3-dbb1-4ba2-a1f2-5ff7877227fc"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"b43159c3-dbb1-4ba2-a1f2-5ff7877227fc"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"9ea8e984-fade-4c32-a68b-a272d0c2bcef"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"9ea8e984-fade-4c32-a68b-a272d0c2bcef"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"94656c1f-06f1-4d56-b5df-8a2bf43c1c70"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"94656c1f-06f1-4d56-b5df-8a2bf43c1c70"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"cc4b77e7-e2a0-4a0d-bf06-2ba1f18eb3ba"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"cc4b77e7-e2a0-4a0d-bf06-2ba1f18eb3ba"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"12388b38-fb60-44df-94ef-c2e84898cb0a"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"12388b38-fb60-44df-94ef-c2e84898cb0a"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"4b959ac4-01fe-430a-b5c8-fa5bc777878a"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":0,"requestId":"4b959ac4-01fe-430a-b5c8-fa5bc777878a"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"e732b299-53b5-488b-a570-476781b4f80b"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"e732b299-53b5-488b-a570-476781b4f80b"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"45ba36c0-8123-44fc-8c73-6fcc419c2c36"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"45ba36c0-8123-44fc-8c73-6fcc419c2c36"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"c238161c-7b5f-44e1-9423-5be3b2e8c43e"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"c238161c-7b5f-44e1-9423-5be3b2e8c43e"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"29d993c1-2d61-48bc-b177-8fd7b2c0a631"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"29d993c1-2d61-48bc-b177-8fd7b2c0a631"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"d64dc272-4676-47a7-8fdc-c18642708a58"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"d64dc272-4676-47a7-8fdc-c18642708a58"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"3a296774-fcd2-4d5f-abf4-132b29377d27"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"3a296774-fcd2-4d5f-abf4-132b29377d27"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"34732152-be41-41c2-90b2-fa00bc45e68f"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"34732152-be41-41c2-90b2-fa00bc45e68f"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"88ac98d9-a0fa-45d9-a83c-d13c5f478653"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"88ac98d9-a0fa-45d9-a83c-d13c5f478653"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"c928d038-2913-4c90-9d35-39070ab550b0"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"c928d038-2913-4c90-9d35-39070ab550b0"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"e4b97a0a-d1ce-459b-962e-dce552fe4dfd"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"e4b97a0a-d1ce-459b-962e-dce552fe4dfd"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"3a2e9499-584b-40c0-9ab9-2220030553a1"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"3a2e9499-584b-40c0-9ab9-2220030553a1"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"c86c228c-d7c9-4693-9f14-bc6b20bb0982"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"c86c228c-d7c9-4693-9f14-bc6b20bb0982"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"78b56de7-cf25-4ea9-b941-86d0eb6423c3"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"78b56de7-cf25-4ea9-b941-86d0eb6423c3"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"fa947a9b-9895-423a-9b24-978efe38b007"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":0,"requestId":"fa947a9b-9895-423a-9b24-978efe38b007"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"82c701dc-27f6-4ba3-bb21-9a99ad0dc65f"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"82c701dc-27f6-4ba3-bb21-9a99ad0dc65f"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"58018987-5cb9-42c6-a979-130fb3ac6931"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"58018987-5cb9-42c6-a979-130fb3ac6931"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"b74c1c21-63a2-410d-93b3-a8c1feb801eb"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"b74c1c21-63a2-410d-93b3-a8c1feb801eb"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"76af6652-67eb-4d3f-be14-83559dee3105"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"76af6652-67eb-4d3f-be14-83559dee3105"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"f62c9d59-eab5-40c3-ae20-3356cdba8af8"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"f62c9d59-eab5-40c3-ae20-3356cdba8af8"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"2207a172-4a4c-4c5b-af4f-8e6f80923cba"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"2207a172-4a4c-4c5b-af4f-8e6f80923cba"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"ac112714-0edc-43f5-8082-acd48e9f691c"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":0,"requestId":"ac112714-0edc-43f5-8082-acd48e9f691c"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"79a0523a-b993-4490-8805-abe3b4c21589"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"79a0523a-b993-4490-8805-abe3b4c21589"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"c7528218-d7ff-4bc5-b981-1d393d03108d"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"c7528218-d7ff-4bc5-b981-1d393d03108d"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"352a4639-9bf0-4801-baf5-a99e954603eb"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":4,"requestId":"352a4639-9bf0-4801-baf5-a99e954603eb"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"f0b93eee-071d-4de2-b273-830cf47635e5"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"f0b93eee-071d-4de2-b273-830cf47635e5"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"f5b2cc40-5ded-4286-8edb-31c523ce3819"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":4,"requestId":"f5b2cc40-5ded-4286-8edb-31c523ce3819"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"5ae44f80-f5e8-43ea-98b8-861979c40aa9"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":0,"requestId":"5ae44f80-f5e8-43ea-98b8-861979c40aa9"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"cd97e30a-23fe-4c9f-b1ea-18b9d6a89189"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"cd97e30a-23fe-4c9f-b1ea-18b9d6a89189"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"615f4d16-c86c-4c23-a68d-b92a525795b7"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"615f4d16-c86c-4c23-a68d-b92a525795b7"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"5369237c-b682-4630-a84b-413a470ab387"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"5369237c-b682-4630-a84b-413a470ab387"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"8d302fa8-800c-4e7d-9073-045eaeed3386"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"8d302fa8-800c-4e7d-9073-045eaeed3386"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"17a9b72b-ad6a-4882-91a6-f4e971ab8b79"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"17a9b72b-ad6a-4882-91a6-f4e971ab8b79"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"33608f6c-a69c-47f5-9a36-a3f3073371a1"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"33608f6c-a69c-47f5-9a36-a3f3073371a1"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"3d5a0f1e-7153-420e-9bcb-abe306a9838c"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"3d5a0f1e-7153-420e-9bcb-abe306a9838c"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"63f2d3ae-925e-423f-9d3a-fadce8a0eb2e"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":4,"requestId":"63f2d3ae-925e-423f-9d3a-fadce8a0eb2e"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"ad05bace-9687-42ae-a88d-ee4f55b92628"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"ad05bace-9687-42ae-a88d-ee4f55b92628"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"cd42eadf-4c03-4dd0-b563-33ec3e489bc6"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"cd42eadf-4c03-4dd0-b563-33ec3e489bc6"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"69d51d32-87f7-45de-bbc6-a40685c24576"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"69d51d32-87f7-45de-bbc6-a40685c24576"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"4926611a-92ba-4df7-a953-b2a09e77d66f"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"4926611a-92ba-4df7-a953-b2a09e77d66f"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"1552ac47-3af8-454d-ab57-58b114928765"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"1552ac47-3af8-454d-ab57-58b114928765"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"771505a3-cd30-4132-ba1b-ee13cc2f4bb3"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"771505a3-cd30-4132-ba1b-ee13cc2f4bb3"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"6e7fd25a-20b0-4fe5-bc27-49cd941e2597"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"6e7fd25a-20b0-4fe5-bc27-49cd941e2597"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"2e33edcc-a513-408f-a97b-b6c36ea8d65d"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"2e33edcc-a513-408f-a97b-b6c36ea8d65d"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"e6246cc1-4e28-4694-96b8-9d83cd6b9793"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":4,"requestId":"e6246cc1-4e28-4694-96b8-9d83cd6b9793"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"5e46f284-8334-4040-b61b-5835901646b5"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"5e46f284-8334-4040-b61b-5835901646b5"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"456b6df8-a307-48a6-b1d3-f004e8db40fe"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"456b6df8-a307-48a6-b1d3-f004e8db40fe"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"91c22ec8-bc39-4152-8946-572c90394017"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":6,"requestId":"91c22ec8-bc39-4152-8946-572c90394017"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"03079eea-b207-44f6-91ce-350c984fdb92"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":4,"requestId":"03079eea-b207-44f6-91ce-350c984fdb92"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"0ca900fe-7502-455a-97a2-c35bfb5931c0"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":3,"requestId":"0ca900fe-7502-455a-97a2-c35bfb5931c0"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"2638b43b-8df9-4b0b-ad71-ed2db4380c55"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"2638b43b-8df9-4b0b-ad71-ed2db4380c55"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"22640b35-2ae6-49b8-81fe-194fa0e7895d"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":0,"requestId":"22640b35-2ae6-49b8-81fe-194fa0e7895d"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"f5b5f8d3-c934-4cc0-b544-e48bebdd5280"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"f5b5f8d3-c934-4cc0-b544-e48bebdd5280"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"45e1772e-4eb5-4e53-986c-8adf9e2eedb7"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"45e1772e-4eb5-4e53-986c-8adf9e2eedb7"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"d2e6a0fe-3b54-40b4-be7e-0c6876ffa722"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"d2e6a0fe-3b54-40b4-be7e-0c6876ffa722"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"fe35a060-c7af-4ccd-b166-65f686c6cdc4"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":3,"requestId":"fe35a060-c7af-4ccd-b166-65f686c6cdc4"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"732a28aa-bbca-44e3-9fbd-5d9c32f1e388"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"732a28aa-bbca-44e3-9fbd-5d9c32f1e388"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"d147af42-798a-47a4-ab68-1141f52b7491"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"d147af42-798a-47a4-ab68-1141f52b7491"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"4aa3cb36-ba8c-42eb-8b75-e62562244c61"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"4aa3cb36-ba8c-42eb-8b75-e62562244c61"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"21d2d711-f3e8-4186-b2e5-d510a840cc64"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"21d2d711-f3e8-4186-b2e5-d510a840cc64"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"52ec0af7-4193-448a-94a2-27fe7b71d327"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"52ec0af7-4193-448a-94a2-27fe7b71d327"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"341fe35e-428d-4494-bb09-c7704cc05036"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"341fe35e-428d-4494-bb09-c7704cc05036"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"a111a76e-2e67-444e-a6ce-208e924accbc"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":0,"requestId":"a111a76e-2e67-444e-a6ce-208e924accbc"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"ddee6dae-a9ca-4c20-a48c-40c70ed41d1e"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"ddee6dae-a9ca-4c20-a48c-40c70ed41d1e"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"0001be7b-6c6c-41ef-9efd-fdfcb0619464"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"0001be7b-6c6c-41ef-9efd-fdfcb0619464"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"4ffb85f9-93a3-463c-871d-5ce6dfbf9a1c"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":3,"requestId":"4ffb85f9-93a3-463c-871d-5ce6dfbf9a1c"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"8db2206e-8f87-4028-9c7a-027acad033c6"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"8db2206e-8f87-4028-9c7a-027acad033c6"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"84230502-eb23-49a7-8e63-6ac8ff525867"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":0,"requestId":"84230502-eb23-49a7-8e63-6ac8ff525867"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"990ed601-1a70-4ba6-9d09-7dbe67e2cab0"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":4,"requestId":"990ed601-1a70-4ba6-9d09-7dbe67e2cab0"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"f8b7e930-a7c5-4171-9907-d25b4f84f719"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":3,"requestId":"f8b7e930-a7c5-4171-9907-d25b4f84f719"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"8fc987d4-806d-41c9-b490-04b4ae3d2ff8"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":3,"requestId":"8fc987d4-806d-41c9-b490-04b4ae3d2ff8"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"e99b864c-6356-4791-ad60-bddbd8fe7d4c"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":3,"requestId":"e99b864c-6356-4791-ad60-bddbd8fe7d4c"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"f265dc5d-e39a-48cd-b0c9-c07d731f25f9"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"f265dc5d-e39a-48cd-b0c9-c07d731f25f9"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"56a7c1db-73df-48ca-9110-de3c3c01c5dc"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"56a7c1db-73df-48ca-9110-de3c3c01c5dc"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"0d2dcf44-b38a-4878-b601-d56f9901f109"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"0d2dcf44-b38a-4878-b601-d56f9901f109"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"44f54968-4347-41d7-8e4f-b69e3f142a05"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"44f54968-4347-41d7-8e4f-b69e3f142a05"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"79cff77a-b9b8-4851-9446-90250809f48a"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":0,"requestId":"79cff77a-b9b8-4851-9446-90250809f48a"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"3692c17b-d897-4680-b379-8c296479b7a3"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"3692c17b-d897-4680-b379-8c296479b7a3"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"e3ab639f-a96e-41b8-a9fb-2e0780a08809"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"e3ab639f-a96e-41b8-a9fb-2e0780a08809"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"1e5ca3e4-c647-48c4-b537-a0884eb9fc45"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"1e5ca3e4-c647-48c4-b537-a0884eb9fc45"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"678780ac-a72a-404f-87cf-2107c9081c40"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"678780ac-a72a-404f-87cf-2107c9081c40"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"2c864456-21a0-41c9-959d-ff41861aff62"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"2c864456-21a0-41c9-959d-ff41861aff62"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"4e5a5210-9e99-44c7-8af2-48f13f547d6b"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"4e5a5210-9e99-44c7-8af2-48f13f547d6b"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"64e74d24-f8fa-420f-93f4-ec23836f0862"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"64e74d24-f8fa-420f-93f4-ec23836f0862"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"2f22cc0b-c20e-468c-8325-4aa6ecb4b2f1"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"2f22cc0b-c20e-468c-8325-4aa6ecb4b2f1"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"82e7e535-f5c2-4711-b6c6-4e141f449bdb"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"82e7e535-f5c2-4711-b6c6-4e141f449bdb"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"7e901dad-6682-4403-83ca-8bffea124e91"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"7e901dad-6682-4403-83ca-8bffea124e91"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"ed8fd90d-0ff7-4a60-898e-2ea83aac28d3"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"ed8fd90d-0ff7-4a60-898e-2ea83aac28d3"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"60dc1fd2-48ae-4e7f-84f0-c50524dff597"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"60dc1fd2-48ae-4e7f-84f0-c50524dff597"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"4eb5d830-61cf-409a-b54d-af84fe6f0664"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"4eb5d830-61cf-409a-b54d-af84fe6f0664"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"fb0f899c-d7c0-47eb-abc5-2474c325304f"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":0,"requestId":"fb0f899c-d7c0-47eb-abc5-2474c325304f"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"d0386777-5aba-4405-aced-753eb1d6b564"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"d0386777-5aba-4405-aced-753eb1d6b564"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"c0749b2a-43ce-4b9a-b201-bdba9f870b5e"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":5,"requestId":"c0749b2a-43ce-4b9a-b201-bdba9f870b5e"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"afb3d7e8-ed6f-44f9-8010-2a354dbfa957"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"afb3d7e8-ed6f-44f9-8010-2a354dbfa957"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"bc2deb35-f707-47a1-bbb6-6428e3a5c34c"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"bc2deb35-f707-47a1-bbb6-6428e3a5c34c"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"485a2c5d-6d76-455d-bd54-21fab00f1ebd"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"485a2c5d-6d76-455d-bd54-21fab00f1ebd"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"ebf8aa59-57ad-4699-9a86-7b1736032cf2"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"ebf8aa59-57ad-4699-9a86-7b1736032cf2"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"86fc00e4-c785-43b0-acfc-b615087b8bf3"} + +stderr | components/dashboard/DashboardClient.test.tsx > DashboardClient > does not paint the worse user green in "Longest Inactive Period" when the other gap is 0 +Received `true` for a non-boolean attribute `layout`. + +If you want to write it to the DOM, pass a string instead: layout="true" or layout={value.toString()}. +Unknown event handler property `onAnimationComplete`. It will be ignored. + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"86fc00e4-c785-43b0-acfc-b615087b8bf3"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"29756407-43e1-44d3-bb90-ee6ea72bc5fa"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"29756407-43e1-44d3-bb90-ee6ea72bc5fa"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"88fc76e3-bb20-4b35-bf57-2a637e339648"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"88fc76e3-bb20-4b35-bf57-2a637e339648"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"9d33c23f-f148-4bf5-b98e-30921e181d86"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"9d33c23f-f148-4bf5-b98e-30921e181d86"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"9ffb346d-064f-444c-b4b4-7ac30cd75001"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"9ffb346d-064f-444c-b4b4-7ac30cd75001"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"4823be94-902a-46ed-a393-9f79e8f8fb99"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"4823be94-902a-46ed-a393-9f79e8f8fb99"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"9285f498-d9cf-451b-bdfe-2a7c768a32b4"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"9285f498-d9cf-451b-bdfe-2a7c768a32b4"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"5b0388bb-e2fa-48a1-b7fd-69b79469bfb5"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"5b0388bb-e2fa-48a1-b7fd-69b79469bfb5"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"1c802987-78de-407f-90a1-9a7969ffc714"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"1c802987-78de-407f-90a1-9a7969ffc714"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"166d8a3a-184f-4b46-8bf2-b23e201febaa"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"166d8a3a-184f-4b46-8bf2-b23e201febaa"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"af4d1c31-269f-4371-81bc-7f28e024f4d5"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"af4d1c31-269f-4371-81bc-7f28e024f4d5"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"ccc3c251-d5f5-4d74-ac01-467639091acf"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"ccc3c251-d5f5-4d74-ac01-467639091acf"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"d7040e5a-689b-4c62-924b-16106d0f6027"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"d7040e5a-689b-4c62-924b-16106d0f6027"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"a43b0b38-469d-4c22-b323-da885c5af8e8"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"a43b0b38-469d-4c22-b323-da885c5af8e8"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"6448a3a3-0137-406e-beca-2712e6689009"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"6448a3a3-0137-406e-beca-2712e6689009"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"71968f29-7052-410e-8182-4c24612a388f"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"71968f29-7052-410e-8182-4c24612a388f"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"f30ed4cf-0981-46be-9e96-946cc497770a"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"f30ed4cf-0981-46be-9e96-946cc497770a"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"9f227e76-0254-42b7-b5a9-279fa0d70612"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"9f227e76-0254-42b7-b5a9-279fa0d70612"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"18ca3d24-1548-4f1c-af0f-26c6000d5eaa"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"18ca3d24-1548-4f1c-af0f-26c6000d5eaa"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"67c79d1e-a5fd-4e23-8957-cc5e1622d6c7"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"67c79d1e-a5fd-4e23-8957-cc5e1622d6c7"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"cce7fc9c-c9c6-4c9d-a0ab-1a05f9d3904a"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"cce7fc9c-c9c6-4c9d-a0ab-1a05f9d3904a"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"4d04aa04-1436-4466-b1c0-729fe1009d53"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"4d04aa04-1436-4466-b1c0-729fe1009d53"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"b83ae7d4-005d-4f82-9b13-57459a4f4f15"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"b83ae7d4-005d-4f82-9b13-57459a4f4f15"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"e2093985-ba7a-4ad4-9bff-e98ac4b064ee"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"e2093985-ba7a-4ad4-9bff-e98ac4b064ee"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"08ff5931-1f77-4335-a6a3-d5ebfa151f02"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"08ff5931-1f77-4335-a6a3-d5ebfa151f02"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"f3025f5e-4450-4846-9038-02fa9afe2db5"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"f3025f5e-4450-4846-9038-02fa9afe2db5"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"13eaeac0-d4f5-4a54-baff-eb7123e3aa0d"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"13eaeac0-d4f5-4a54-baff-eb7123e3aa0d"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"ad0d6fec-9a2e-4304-9897-e8a54f364e83"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"ad0d6fec-9a2e-4304-9897-e8a54f364e83"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"4eb8de23-2680-416c-9d9a-744a5cf7c917"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"4eb8de23-2680-416c-9d9a-744a5cf7c917"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"0df2d25e-a239-4f1b-b08a-9ead40a2c40f"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"0df2d25e-a239-4f1b-b08a-9ead40a2c40f"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"b3c2b541-bfee-4370-b81d-82ee765e9ef9"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"b3c2b541-bfee-4370-b81d-82ee765e9ef9"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"c45360e3-b7d0-4d90-941a-b9677ce4feed"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"c45360e3-b7d0-4d90-941a-b9677ce4feed"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"7feb3f5a-1c42-48a3-90cf-7b20ac384dcc"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":0,"requestId":"7feb3f5a-1c42-48a3-90cf-7b20ac384dcc"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"351c9ea6-8a37-4941-8352-1d763c1e56cc"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"351c9ea6-8a37-4941-8352-1d763c1e56cc"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"c95b5853-4905-4ea7-b006-c99291edfa20"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":0,"requestId":"c95b5853-4905-4ea7-b006-c99291edfa20"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"fddb88e7-da79-4e15-ac8a-25d20f7ffea1"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":5,"requestId":"fddb88e7-da79-4e15-ac8a-25d20f7ffea1"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"a807d191-7202-444b-b3ac-14560a5369ec"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"a807d191-7202-444b-b3ac-14560a5369ec"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"c7148456-1511-47e2-8984-809c8bf29d7e"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"c7148456-1511-47e2-8984-809c8bf29d7e"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"74e5fcab-f873-4716-9841-2f9ea42701b1"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"74e5fcab-f873-4716-9841-2f9ea42701b1"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"7bb7b9d5-f0e4-489e-9fb5-fbdc14d19abe"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"7bb7b9d5-f0e4-489e-9fb5-fbdc14d19abe"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"bdfa555c-70e3-4080-a2dd-e4701e26749c"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"bdfa555c-70e3-4080-a2dd-e4701e26749c"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"9a770bea-6531-4647-83f1-f01fdb168d5e"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"9a770bea-6531-4647-83f1-f01fdb168d5e"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"6f35840b-1ab8-4386-80c9-e5a2f2dd892c"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"6f35840b-1ab8-4386-80c9-e5a2f2dd892c"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"98238731-f613-4334-ac4c-742c747bd474"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"98238731-f613-4334-ac4c-742c747bd474"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"80bec8e7-c80d-42e5-babd-e75c456f4283"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"80bec8e7-c80d-42e5-babd-e75c456f4283"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"89e65e4a-1d5a-4997-8a6b-30d30ff7fb76"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"89e65e4a-1d5a-4997-8a6b-30d30ff7fb76"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"aa523861-bf67-4206-bea1-a8c00c0716c9"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"aa523861-bf67-4206-bea1-a8c00c0716c9"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"1395fb96-df57-4c9c-a787-f4405323294f"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"1395fb96-df57-4c9c-a787-f4405323294f"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"810d47a2-9c3e-4e20-ad36-ebaae762816f"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":8,"requestId":"810d47a2-9c3e-4e20-ad36-ebaae762816f"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"9e10297d-9520-4015-8ec0-55d9f7992324"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"9e10297d-9520-4015-8ec0-55d9f7992324"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"2b099924-e0a3-4d0d-9f6a-1568186e6682"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"2b099924-e0a3-4d0d-9f6a-1568186e6682"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"e30c5cde-4fe5-4edf-8a2f-527867833cc2"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"e30c5cde-4fe5-4edf-8a2f-527867833cc2"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"82a0047f-6981-4350-8cb8-1272766830fe"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"82a0047f-6981-4350-8cb8-1272766830fe"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"e27e39d3-57bf-4022-b550-9c4ddd359943"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"e27e39d3-57bf-4022-b550-9c4ddd359943"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"92531276-e64d-4308-8888-b430c138379a"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"92531276-e64d-4308-8888-b430c138379a"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"ba0fd463-2bb9-4541-99e8-1c4f22bdc66d"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":3,"requestId":"ba0fd463-2bb9-4541-99e8-1c4f22bdc66d"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"9528c0c5-770c-4f82-a673-7732c9825658"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":3,"requestId":"9528c0c5-770c-4f82-a673-7732c9825658"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"594a6e40-db52-48b7-9f16-15439fdd8322"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"594a6e40-db52-48b7-9f16-15439fdd8322"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"362a215f-c700-4f28-b97f-d274fd3989b4"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":3,"requestId":"362a215f-c700-4f28-b97f-d274fd3989b4"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"1862d473-73e5-4e05-9a02-52f412186fca"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"1862d473-73e5-4e05-9a02-52f412186fca"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"03f15ade-97f8-44b7-93f7-cf84e8a2fc06"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":4,"requestId":"03f15ade-97f8-44b7-93f7-cf84e8a2fc06"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"52df842b-3643-400b-93f7-ffeef7f37695"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"52df842b-3643-400b-93f7-ffeef7f37695"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"480bce0a-2287-4168-8669-e5ca23be4c98"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":3,"requestId":"480bce0a-2287-4168-8669-e5ca23be4c98"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"a8c58e16-e64d-4d50-91d4-77d99a5a787e"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":8,"requestId":"a8c58e16-e64d-4d50-91d4-77d99a5a787e"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"2530178d-4459-44c6-b685-f384a73dec2a"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"2530178d-4459-44c6-b685-f384a73dec2a"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"f8f41dde-3f98-4d56-8a2a-e8b5046141cb"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":5,"requestId":"f8f41dde-3f98-4d56-8a2a-e8b5046141cb"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"39d79a6c-583c-4969-9091-3cbdd7749c2a"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"39d79a6c-583c-4969-9091-3cbdd7749c2a"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"83ff0d7e-01b5-4113-88b4-b83cc50a368a"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"83ff0d7e-01b5-4113-88b4-b83cc50a368a"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"9cd021d3-00a5-4b94-ad70-b210ef90eb6c"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":4,"requestId":"9cd021d3-00a5-4b94-ad70-b210ef90eb6c"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"8c2d2c0e-9840-407d-926d-c83748a65ae8"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":0,"requestId":"8c2d2c0e-9840-407d-926d-c83748a65ae8"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"13cd18a4-5b31-429e-b2b8-fcabb363b1df"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"13cd18a4-5b31-429e-b2b8-fcabb363b1df"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"727313e7-441c-4e5f-9914-8730ba8d3f8f"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"727313e7-441c-4e5f-9914-8730ba8d3f8f"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"159e93cc-6aba-4b59-a3f6-86c4fcd993aa"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"159e93cc-6aba-4b59-a3f6-86c4fcd993aa"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"bb9243c4-da90-4899-8a50-e8acfb27c041"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"bb9243c4-da90-4899-8a50-e8acfb27c041"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"bd0e095d-848a-453c-8aaa-9ce8b16161b8"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":3,"requestId":"bd0e095d-848a-453c-8aaa-9ce8b16161b8"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"863f445d-3a67-4204-a849-ea1a2b114230"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"863f445d-3a67-4204-a849-ea1a2b114230"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"194a8f42-4531-4d7f-b6db-c4d459affd36"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"194a8f42-4531-4d7f-b6db-c4d459affd36"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"115c399e-54fa-4f3a-a1ec-874f38e56df9"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"115c399e-54fa-4f3a-a1ec-874f38e56df9"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"0de927da-6408-41ae-b924-a94c3686e6da"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":0,"requestId":"0de927da-6408-41ae-b924-a94c3686e6da"} + + ✓ lib/github.msw.test.ts (9 tests) 5783ms + ✓ handles 500 server errors gracefully 2478ms + ✓ handles network errors gracefully by falling back to mock profile 3202ms +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"e7139b9f-5c74-4515-857e-209043193061"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"e7139b9f-5c74-4515-857e-209043193061"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"e66fc2d1-9267-4d69-a321-277f57714d45"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"e66fc2d1-9267-4d69-a321-277f57714d45"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"7db3b27f-a4d7-467a-a3cf-d39654adde4f"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"7db3b27f-a4d7-467a-a3cf-d39654adde4f"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"4cafc26c-356a-4648-aef7-edcc1c63ec86"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"4cafc26c-356a-4648-aef7-edcc1c63ec86"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"0e896d0b-8109-40a9-b9d8-eb4abd902ac6"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":6,"requestId":"0e896d0b-8109-40a9-b9d8-eb4abd902ac6"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"9d4ba269-3166-490d-abb8-ec6fe56b8eb0"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"9d4ba269-3166-490d-abb8-ec6fe56b8eb0"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"f3de16e8-8458-4c57-aaa2-81158362f6f8"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":6,"requestId":"f3de16e8-8458-4c57-aaa2-81158362f6f8"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"bad1c941-79cb-41cb-9544-a96eb2a4741c"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"bad1c941-79cb-41cb-9544-a96eb2a4741c"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"875c2394-1c52-4012-88b9-21996a0cf8cf"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":5,"requestId":"875c2394-1c52-4012-88b9-21996a0cf8cf"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"864bd1c9-aa5f-4a07-98fb-3bbba480c5d2"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"864bd1c9-aa5f-4a07-98fb-3bbba480c5d2"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"7c33c5c8-ba79-41f3-8e4c-634e452d8f14"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"7c33c5c8-ba79-41f3-8e4c-634e452d8f14"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"ec54dd0e-f375-4547-afc7-ac2db1826cdd"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"ec54dd0e-f375-4547-afc7-ac2db1826cdd"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"91b2ec1b-4060-4e86-a651-4d947cdc0c78"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"91b2ec1b-4060-4e86-a651-4d947cdc0c78"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"d3625cf1-32bb-4997-83d1-d3a2e12d1c16"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"d3625cf1-32bb-4997-83d1-d3a2e12d1c16"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"58ef52df-7e71-42e7-840e-9d486146d6f7"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"58ef52df-7e71-42e7-840e-9d486146d6f7"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"91d6125a-ef31-4e12-a33d-6f72ae679b3c"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"91d6125a-ef31-4e12-a33d-6f72ae679b3c"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"f084b7d7-1670-48ea-b891-7a9882b27084"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"f084b7d7-1670-48ea-b891-7a9882b27084"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"ca6b1acd-0d19-4acb-9712-155098acc08f"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":4,"requestId":"ca6b1acd-0d19-4acb-9712-155098acc08f"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"52a0527b-4d83-4a26-b7fa-9ad8325a2cfe"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"52a0527b-4d83-4a26-b7fa-9ad8325a2cfe"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"7c864ae3-18a6-42fd-89ab-f30954b985bd"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":4,"requestId":"7c864ae3-18a6-42fd-89ab-f30954b985bd"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"df9512d1-7bc7-4ab2-b806-12c771f5ef73"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"df9512d1-7bc7-4ab2-b806-12c771f5ef73"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"fb3f0bb0-7587-4001-94f0-7e74e56e97f1"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"fb3f0bb0-7587-4001-94f0-7e74e56e97f1"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"0c932083-d61e-44d6-af70-3affc163141a"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"0c932083-d61e-44d6-af70-3affc163141a"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"12350460-d31c-4eb2-b840-809f8a4483fa"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"12350460-d31c-4eb2-b840-809f8a4483fa"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"4e523c47-80da-4fb7-b681-a1d7108f2b75"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"4e523c47-80da-4fb7-b681-a1d7108f2b75"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"09e3acb0-d6b9-4de6-8433-3d7c9c3bd718"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"09e3acb0-d6b9-4de6-8433-3d7c9c3bd718"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"232f1053-57e0-4d59-b2db-189fc6a5385b"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"232f1053-57e0-4d59-b2db-189fc6a5385b"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"494dd0e8-7688-4570-b57c-4c4145bad536"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":3,"requestId":"494dd0e8-7688-4570-b57c-4c4145bad536"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"850a8ed5-39a1-4b93-8900-3d9ec1b06a99"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":3,"requestId":"850a8ed5-39a1-4b93-8900-3d9ec1b06a99"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"4b65943c-a2d3-4a04-b1ea-e00d48461221"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"4b65943c-a2d3-4a04-b1ea-e00d48461221"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"4e741a51-1ae0-4bf9-be24-b6dec50eeb01"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"4e741a51-1ae0-4bf9-be24-b6dec50eeb01"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"e41d08ff-492a-4480-bb9a-25c57339cac6"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":5,"requestId":"e41d08ff-492a-4480-bb9a-25c57339cac6"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"93c1d638-586f-4cff-a846-ed8c3399ef85"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"93c1d638-586f-4cff-a846-ed8c3399ef85"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"241f85e4-a333-44fe-8929-16a62c5b17b2"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"241f85e4-a333-44fe-8929-16a62c5b17b2"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"ebd80781-4914-40d5-a197-138a64401af5"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"ebd80781-4914-40d5-a197-138a64401af5"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"c053c7d9-6d32-4b72-b435-fe5f3b05c4c2"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":5,"requestId":"c053c7d9-6d32-4b72-b435-fe5f3b05c4c2"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"1963b41c-3808-491a-a108-4a5d8a2cb976"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"1963b41c-3808-491a-a108-4a5d8a2cb976"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"7bfad612-b796-47c6-a5e8-07ead133775f"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"7bfad612-b796-47c6-a5e8-07ead133775f"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"483b1d31-bde2-4aac-81d4-3e529dd6b4e9"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"483b1d31-bde2-4aac-81d4-3e529dd6b4e9"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"24953c92-4617-4acd-9305-ec3223addb8d"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"24953c92-4617-4acd-9305-ec3223addb8d"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"3e3b6ad9-43ad-4e4c-892a-f0e612066058"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"3e3b6ad9-43ad-4e4c-892a-f0e612066058"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"a28af81f-126b-4a2e-b438-95db5243bd43"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"a28af81f-126b-4a2e-b438-95db5243bd43"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"10cc0675-e40b-4ff6-b4e3-c3651fce3c37"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"10cc0675-e40b-4ff6-b4e3-c3651fce3c37"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"60ea093c-7500-42db-b068-af2a7b3192a9"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"60ea093c-7500-42db-b068-af2a7b3192a9"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"75acefaf-30b3-4112-b175-f9f40a3b05bf"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"75acefaf-30b3-4112-b175-f9f40a3b05bf"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"83bb7ecb-8e58-4bac-916b-61111e16c64a"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":5,"requestId":"83bb7ecb-8e58-4bac-916b-61111e16c64a"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"5a1df904-9b61-4ce9-abb0-460baa8cd3df"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"5a1df904-9b61-4ce9-abb0-460baa8cd3df"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"84fa74a8-ecfb-4d8a-80f4-a27c6a8ff218"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"84fa74a8-ecfb-4d8a-80f4-a27c6a8ff218"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"fce8b89b-d9a1-4303-ae2e-10609baed0c5"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"fce8b89b-d9a1-4303-ae2e-10609baed0c5"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"fb2f7e48-36b1-4e3f-9e0c-39eae8ddb8b7"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"fb2f7e48-36b1-4e3f-9e0c-39eae8ddb8b7"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"cc61a11c-b97b-4ea2-b0e7-1d77d706e876"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":0,"requestId":"cc61a11c-b97b-4ea2-b0e7-1d77d706e876"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"ca273e62-215c-4e68-95fc-0dec9172dcf3"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"ca273e62-215c-4e68-95fc-0dec9172dcf3"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"f0051eee-6fd4-48a7-bd0b-367a35ba3ed7"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"f0051eee-6fd4-48a7-bd0b-367a35ba3ed7"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"5f7fe13b-c55c-4181-b469-1a356556ceb3"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"5f7fe13b-c55c-4181-b469-1a356556ceb3"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"bec7f3b1-2505-4653-96f9-f14341dc80b9"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"bec7f3b1-2505-4653-96f9-f14341dc80b9"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"e88a4ed3-6088-42c1-aba6-6a8c04409e70"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"e88a4ed3-6088-42c1-aba6-6a8c04409e70"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"f73eb5fe-1f2e-4edc-a4fd-49ae8002226c"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"f73eb5fe-1f2e-4edc-a4fd-49ae8002226c"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"190005a9-5d97-4185-bf9d-053921447437"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"190005a9-5d97-4185-bf9d-053921447437"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"cae4e7b1-fe44-473e-995c-4391b806b935"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"cae4e7b1-fe44-473e-995c-4391b806b935"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"41a12dbb-5824-4ce5-9d0b-9c70e2dcc6d1"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"41a12dbb-5824-4ce5-9d0b-9c70e2dcc6d1"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"7dc64564-255d-4847-b42e-72680dd96020"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"7dc64564-255d-4847-b42e-72680dd96020"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"8fa19673-4dcb-4a86-b670-6b30059dda07"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"8fa19673-4dcb-4a86-b670-6b30059dda07"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"328e880d-b6a1-44e7-a688-4d4d69883d24"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":0,"requestId":"328e880d-b6a1-44e7-a688-4d4d69883d24"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"d1cc3e63-b897-4934-a462-e53ba90a8e46"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"d1cc3e63-b897-4934-a462-e53ba90a8e46"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"15125e78-f47c-428b-afd1-a1a4b52a818d"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":4,"requestId":"15125e78-f47c-428b-afd1-a1a4b52a818d"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"0fff9c09-5586-409f-ad92-b291ecdfcdc9"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"0fff9c09-5586-409f-ad92-b291ecdfcdc9"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"ec5676c6-00b0-4c2c-b141-64a8eb9e165e"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"ec5676c6-00b0-4c2c-b141-64a8eb9e165e"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"41148439-435d-4f6e-9de0-3353c58ed723"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"41148439-435d-4f6e-9de0-3353c58ed723"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"14876e46-67ff-41e3-8f07-d442087d4557"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"14876e46-67ff-41e3-8f07-d442087d4557"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"2da556e8-815e-4d20-ab11-0984b2e72718"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"2da556e8-815e-4d20-ab11-0984b2e72718"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"6001cfe3-9c3f-40e1-a088-9a8eef5285a3"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"6001cfe3-9c3f-40e1-a088-9a8eef5285a3"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"a0a72498-d01f-46ef-a6b5-39ce706f0178"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"a0a72498-d01f-46ef-a6b5-39ce706f0178"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"afde35c4-e81a-425f-9c59-0b95775dba1d"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"afde35c4-e81a-425f-9c59-0b95775dba1d"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"20136404-2ebb-4092-b00d-e65988dec13d"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"20136404-2ebb-4092-b00d-e65988dec13d"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"30c8ff16-1e38-4732-9b09-8c6fb8f10f0b"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"30c8ff16-1e38-4732-9b09-8c6fb8f10f0b"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"05f7316a-fba6-48fa-9864-921ba262610e"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"05f7316a-fba6-48fa-9864-921ba262610e"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"71ebadb6-8243-48d5-8967-d3d3f4b2c8eb"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"71ebadb6-8243-48d5-8967-d3d3f4b2c8eb"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"17914d7a-f02f-4065-ace7-00b27e7eb7be"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"17914d7a-f02f-4065-ace7-00b27e7eb7be"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"4a858b90-8668-48aa-874a-591dcc9e2808"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"4a858b90-8668-48aa-874a-591dcc9e2808"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"37aa0a6d-ed77-47c3-a04f-3bf48248ae42"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"37aa0a6d-ed77-47c3-a04f-3bf48248ae42"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"7ee22369-a92f-4893-9989-1fdb3d38f7ca"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"7ee22369-a92f-4893-9989-1fdb3d38f7ca"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"52600bb7-571a-4a17-b842-ea3236941d42"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"52600bb7-571a-4a17-b842-ea3236941d42"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"dde22978-7a8e-48ef-ba1f-b89589b4e411"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"dde22978-7a8e-48ef-ba1f-b89589b4e411"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"21e16ebc-9b48-49cb-9bab-a7dec2a85801"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"21e16ebc-9b48-49cb-9bab-a7dec2a85801"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"1fd1b423-72b4-4651-b7ec-5117d3a2f808"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"1fd1b423-72b4-4651-b7ec-5117d3a2f808"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"44369603-6747-422c-8ec1-e372ae9e61d5"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"44369603-6747-422c-8ec1-e372ae9e61d5"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"937aa567-be32-43a1-89ad-bc2dcf50b293"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"937aa567-be32-43a1-89ad-bc2dcf50b293"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"0ea909de-a08d-4738-ac58-6a13639c60f1"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"0ea909de-a08d-4738-ac58-6a13639c60f1"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"97a19064-4301-4bd0-9a0f-940c4e09c856"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"97a19064-4301-4bd0-9a0f-940c4e09c856"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"a6288807-1861-4e9f-a204-e90219670f04"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"a6288807-1861-4e9f-a204-e90219670f04"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"58806cdf-a0d3-47c7-adfb-c9f5073b594c"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":3,"requestId":"58806cdf-a0d3-47c7-adfb-c9f5073b594c"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"5648f060-9ef6-453d-9dbe-be0cb5ac3943"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":5,"requestId":"5648f060-9ef6-453d-9dbe-be0cb5ac3943"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"75891e05-953d-4931-beca-a8c9c272dbab"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"75891e05-953d-4931-beca-a8c9c272dbab"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"0e1795d6-714d-484f-9f4e-81d4955109ed"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"0e1795d6-714d-484f-9f4e-81d4955109ed"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"a59729ca-202a-4611-a4e2-bcb92aa57112"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":4,"requestId":"a59729ca-202a-4611-a4e2-bcb92aa57112"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"7118ba6b-11e2-4b50-913d-e3dc257ea247"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"7118ba6b-11e2-4b50-913d-e3dc257ea247"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"4b8be485-50e9-4b8f-abfb-24d2b6c41302"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"4b8be485-50e9-4b8f-abfb-24d2b6c41302"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"cec33731-c88d-4761-a0b2-e8074f1365be"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"cec33731-c88d-4761-a0b2-e8074f1365be"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"06bb8b0b-6199-4bdc-b343-21d713c0feb3"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":8,"requestId":"06bb8b0b-6199-4bdc-b343-21d713c0feb3"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"ba5b9a41-0fbf-46e0-9c12-3339f017ae1f"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"ba5b9a41-0fbf-46e0-9c12-3339f017ae1f"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"c7e2f1b9-022e-4ad4-8f85-0915dd62cfa1"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"c7e2f1b9-022e-4ad4-8f85-0915dd62cfa1"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"21991de5-7e4c-4d3c-92e9-755774ca9b83"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"21991de5-7e4c-4d3c-92e9-755774ca9b83"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"15539728-a498-4952-b3f3-5b3e6c4cae89"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":0,"requestId":"15539728-a498-4952-b3f3-5b3e6c4cae89"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"65b08151-0943-4fd2-8cbe-95830ed3bf76"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"65b08151-0943-4fd2-8cbe-95830ed3bf76"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"cfb9c9ea-e283-43a9-8fe4-908ea874a27d"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"cfb9c9ea-e283-43a9-8fe4-908ea874a27d"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"3b5e4d3e-f1aa-4659-81b4-76847b5feee9"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"3b5e4d3e-f1aa-4659-81b4-76847b5feee9"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"9352cb39-beaf-442a-b30f-4abd8c075cea"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"9352cb39-beaf-442a-b30f-4abd8c075cea"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"31b05d8e-3eb2-49dd-9b75-9ca232753263"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"31b05d8e-3eb2-49dd-9b75-9ca232753263"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"a48386ef-fa63-4b8c-884d-329a7b126fac"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"a48386ef-fa63-4b8c-884d-329a7b126fac"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"fa7a2936-1f69-4e0c-b44e-4a4a7660bb01"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"fa7a2936-1f69-4e0c-b44e-4a4a7660bb01"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"96dd1845-7f0a-4f91-8529-8155eefd2cf9"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"96dd1845-7f0a-4f91-8529-8155eefd2cf9"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"0bdc77e5-e17a-4616-89ce-80bd2537423b"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"0bdc77e5-e17a-4616-89ce-80bd2537423b"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"976bdf0e-dcff-4c8d-9bbe-8323233f0cbc"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":0,"requestId":"976bdf0e-dcff-4c8d-9bbe-8323233f0cbc"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"acf9643e-4a7a-4fb1-aa55-d90769cd340e"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"acf9643e-4a7a-4fb1-aa55-d90769cd340e"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"7d6c3505-855b-439a-b165-11abd8b5fa02"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"7d6c3505-855b-439a-b165-11abd8b5fa02"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"3d9527ee-ef2f-418a-bd46-9568ebcceda8"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"3d9527ee-ef2f-418a-bd46-9568ebcceda8"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"70449338-e264-4b3c-842f-febf3cf38eb2"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"70449338-e264-4b3c-842f-febf3cf38eb2"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"3df13bf9-9979-4c65-91cf-53e09072912a"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":0,"requestId":"3df13bf9-9979-4c65-91cf-53e09072912a"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"a7de8512-b904-4766-ab55-7ed533600901"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"a7de8512-b904-4766-ab55-7ed533600901"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"d8fc9ee8-d9f7-4111-960c-046cd7b6e7f9"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":0,"requestId":"d8fc9ee8-d9f7-4111-960c-046cd7b6e7f9"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"3db689ab-6e66-499b-9e71-63bc2ffc5fe2"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":9,"requestId":"3db689ab-6e66-499b-9e71-63bc2ffc5fe2"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"99ab1c2d-3e46-4c5d-8caa-bee5d1682c6c"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"99ab1c2d-3e46-4c5d-8caa-bee5d1682c6c"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"5cd34ae2-22b0-4cd5-9ea8-a4970a3bf079"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":3,"requestId":"5cd34ae2-22b0-4cd5-9ea8-a4970a3bf079"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"3c772c06-431d-41a0-8a24-3cb4a483a652"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":3,"requestId":"3c772c06-431d-41a0-8a24-3cb4a483a652"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"3473bad1-dcca-4413-8cb5-ae746b381813"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"3473bad1-dcca-4413-8cb5-ae746b381813"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"6c649798-19a8-442a-beac-84b8bf591e9f"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"6c649798-19a8-442a-beac-84b8bf591e9f"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"b09e3348-89e2-440d-84c8-78c5e54ccaae"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"b09e3348-89e2-440d-84c8-78c5e54ccaae"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"619992f2-1f63-467e-a5bd-8945c2899cc9"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"619992f2-1f63-467e-a5bd-8945c2899cc9"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"f2de8965-0d06-484f-8863-2a3b85b72c8a"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"f2de8965-0d06-484f-8863-2a3b85b72c8a"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"03a47369-9f49-4a0c-97eb-c172f9c7c55d"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"03a47369-9f49-4a0c-97eb-c172f9c7c55d"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"5fc94924-2792-4643-b3fd-c1bc116e4bf6"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"5fc94924-2792-4643-b3fd-c1bc116e4bf6"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"f6846d25-76b1-4cdc-9795-2c558953ce26"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"f6846d25-76b1-4cdc-9795-2c558953ce26"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"020e5680-b105-457b-86a9-bdc06c5abca3"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":0,"requestId":"020e5680-b105-457b-86a9-bdc06c5abca3"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"d6119d08-dfab-4611-9977-2f87f2bafb8c"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":6,"requestId":"d6119d08-dfab-4611-9977-2f87f2bafb8c"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"bc48349e-6c4a-473d-897f-9fecce818b3e"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":8,"requestId":"bc48349e-6c4a-473d-897f-9fecce818b3e"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"6d408485-ae5a-4bcd-b200-c367c6663a63"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":9,"requestId":"6d408485-ae5a-4bcd-b200-c367c6663a63"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"fa419c3c-5514-4fa0-a14b-de38c1c4814e"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":5,"requestId":"fa419c3c-5514-4fa0-a14b-de38c1c4814e"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"45f13240-7854-4bf4-a80c-d369847cf9a6"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":5,"requestId":"45f13240-7854-4bf4-a80c-d369847cf9a6"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"a29a0ca3-aab4-4e9b-bfda-716c9fad8dcd"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":0,"requestId":"a29a0ca3-aab4-4e9b-bfda-716c9fad8dcd"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"656305b2-347e-4290-b5fa-5086db6ce451"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"656305b2-347e-4290-b5fa-5086db6ce451"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"a5666a00-30aa-4762-92f5-dff0f90a8a46"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"a5666a00-30aa-4762-92f5-dff0f90a8a46"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"fee9bcc4-e6bd-49f9-be5a-d2c9489bdd62"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"fee9bcc4-e6bd-49f9-be5a-d2c9489bdd62"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"e32083bd-a26f-4e50-87fd-3997ef0c86ba"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"e32083bd-a26f-4e50-87fd-3997ef0c86ba"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"0da10008-d25d-4dac-a356-b469476b391b"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"0da10008-d25d-4dac-a356-b469476b391b"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"d42dead4-bc94-4b92-86b4-2a4fc36ab00a"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":5,"requestId":"d42dead4-bc94-4b92-86b4-2a4fc36ab00a"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"dc2ab49a-1c76-4098-905e-bab2da71d56d"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"dc2ab49a-1c76-4098-905e-bab2da71d56d"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"afc0d609-b726-4f0e-b44c-4dc4f9bdca00"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":5,"requestId":"afc0d609-b726-4f0e-b44c-4dc4f9bdca00"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"b7755fb6-cca2-4471-9771-7834654083b4"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"b7755fb6-cca2-4471-9771-7834654083b4"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"1f802073-f9fb-4a6e-bef7-6310cef18f5d"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":3,"requestId":"1f802073-f9fb-4a6e-bef7-6310cef18f5d"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"f643cc67-45d6-48e6-b6f6-701f4c988df0"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"f643cc67-45d6-48e6-b6f6-701f4c988df0"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"b5044402-754b-475e-8086-cff6c5946a97"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":6,"requestId":"b5044402-754b-475e-8086-cff6c5946a97"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"ea91b354-63eb-48f5-af24-2ef5502adbcc"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":6,"requestId":"ea91b354-63eb-48f5-af24-2ef5502adbcc"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"dc3ebf5c-9c7b-45df-9c6b-0126685b70ae"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":3,"requestId":"dc3ebf5c-9c7b-45df-9c6b-0126685b70ae"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"34db9cc9-c5dc-42ad-bfaf-18ba2c78a8db"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":10,"requestId":"34db9cc9-c5dc-42ad-bfaf-18ba2c78a8db"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"b0c7fc82-7476-4b97-98ad-6e20b672d3b5"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"b0c7fc82-7476-4b97-98ad-6e20b672d3b5"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"5227de4c-01ff-414a-b668-442768e892e2"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"5227de4c-01ff-414a-b668-442768e892e2"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"35bc7754-cdcb-4854-802a-bc01ea745932"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"35bc7754-cdcb-4854-802a-bc01ea745932"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"5d9e4812-0832-4939-a967-68caf337786f"} + + ✓ app/generator/data/technologies.responsive-breakpoints.test.ts (5 tests) 7175ms + ✓ renders the real technology catalog under standard 375px mobile coordinates 1428ms + ✓ renders technology columns as the real one-column vertical mobile list 366ms + ✓ uses fluid real row and input classes instead of absolute widths that cause mobile overflow 773ms + ✓ renders real category navigation as wrapping compact mobile controls 3396ms + ✓ responds to real mobile technology toggle states with valid catalog IDs 1205ms +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"5d9e4812-0832-4939-a967-68caf337786f"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"4941f84d-bd06-40f5-9784-4835366084bf"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"4941f84d-bd06-40f5-9784-4835366084bf"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"6189206a-3074-4e3b-ae83-c7746e02d215"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"6189206a-3074-4e3b-ae83-c7746e02d215"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"b7187b52-6f2e-478b-865c-381c15aca5a4"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"b7187b52-6f2e-478b-865c-381c15aca5a4"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"3db91e6e-20b8-450d-828e-a55f4033e3ba"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"3db91e6e-20b8-450d-828e-a55f4033e3ba"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"937397d9-2406-431b-a2be-eb78926a8048"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"937397d9-2406-431b-a2be-eb78926a8048"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"ba7142c4-2a67-4f0f-821e-422e7336ba44"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":3,"requestId":"ba7142c4-2a67-4f0f-821e-422e7336ba44"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"502eb33e-3d7a-42d1-8697-59110548eb7b"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":5,"requestId":"502eb33e-3d7a-42d1-8697-59110548eb7b"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"606f4c74-1977-48a1-bce6-5c389f50169e"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"606f4c74-1977-48a1-bce6-5c389f50169e"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"fd39a7ed-5b26-444c-9835-864099a9507f"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":0,"requestId":"fd39a7ed-5b26-444c-9835-864099a9507f"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"eed7d389-3b34-4a34-abdb-89e3b4560422"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"eed7d389-3b34-4a34-abdb-89e3b4560422"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"27281589-4720-4430-abfa-da6434d8794c"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":0,"requestId":"27281589-4720-4430-abfa-da6434d8794c"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"0ea731e6-afec-4e36-848d-314f5160ba23"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"0ea731e6-afec-4e36-848d-314f5160ba23"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"e4f2462f-ff7b-4f2a-82d5-15fcaf9f1f47"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"e4f2462f-ff7b-4f2a-82d5-15fcaf9f1f47"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"b9e7f9fa-af4d-450f-b381-fa30ebf0cfb8"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"b9e7f9fa-af4d-450f-b381-fa30ebf0cfb8"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"f416b5c4-9e82-4b63-a1bf-50bc1a38eb21"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"f416b5c4-9e82-4b63-a1bf-50bc1a38eb21"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"58edcad1-66fd-4c9a-bc4a-d3d08ff21211"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"58edcad1-66fd-4c9a-bc4a-d3d08ff21211"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"b6e51dab-27c4-4131-bd08-128b2d268fc4"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"b6e51dab-27c4-4131-bd08-128b2d268fc4"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"330335e3-0abd-4281-be17-063ff5316315"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"330335e3-0abd-4281-be17-063ff5316315"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"97af9c6d-652e-46a1-bfc1-b0d1e07a0090"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":4,"requestId":"97af9c6d-652e-46a1-bfc1-b0d1e07a0090"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"ac8a4275-26d6-4bd5-b41c-e1ce44bf255e"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":5,"requestId":"ac8a4275-26d6-4bd5-b41c-e1ce44bf255e"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"a60aedd4-9960-49b5-b29f-fb9a9941be18"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"a60aedd4-9960-49b5-b29f-fb9a9941be18"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"604af24b-1d2a-4a50-b0ee-9fe21abf60b4"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"604af24b-1d2a-4a50-b0ee-9fe21abf60b4"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"fefb5fa4-a779-4e89-97dd-2c2a9c0a1599"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"fefb5fa4-a779-4e89-97dd-2c2a9c0a1599"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"0f6b0415-f619-4696-9b26-974250ddef74"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"0f6b0415-f619-4696-9b26-974250ddef74"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"f857480e-8571-4fa6-8f37-3fbcaebeb76b"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":4,"requestId":"f857480e-8571-4fa6-8f37-3fbcaebeb76b"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"6b90c1c6-903b-43f8-a07f-409d52eedc0a"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":12,"requestId":"6b90c1c6-903b-43f8-a07f-409d52eedc0a"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"cf6cddf8-5163-4871-b433-edec25208e22"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"cf6cddf8-5163-4871-b433-edec25208e22"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"7382485d-8fe3-419c-961c-7b618a8cd3e6"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"7382485d-8fe3-419c-961c-7b618a8cd3e6"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"22d9e957-2945-421d-8b82-ee529a961121"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"22d9e957-2945-421d-8b82-ee529a961121"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"ecdb1b17-142f-44f0-b512-f997c19eb04c"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"ecdb1b17-142f-44f0-b512-f997c19eb04c"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"d8a2ab17-d04c-4b8f-8eda-1c0cd72475e9"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"d8a2ab17-d04c-4b8f-8eda-1c0cd72475e9"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"014c5e8d-0083-45cb-a144-2a19dff267cc"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"014c5e8d-0083-45cb-a144-2a19dff267cc"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"ef525254-bb9a-4793-8554-0c24f7155b50"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"ef525254-bb9a-4793-8554-0c24f7155b50"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"0f92cac6-eb4d-4f39-b5cd-95a06c179fb7"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":0,"requestId":"0f92cac6-eb4d-4f39-b5cd-95a06c179fb7"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"fc3e4f5a-fcf8-4530-8a2b-a6fb198c7107"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"fc3e4f5a-fcf8-4530-8a2b-a6fb198c7107"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"875e0394-e282-4e6b-8761-77c8cb7eee1b"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"875e0394-e282-4e6b-8761-77c8cb7eee1b"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"d4abd063-5aec-4201-bd4d-a5cfb8d5cd88"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"d4abd063-5aec-4201-bd4d-a5cfb8d5cd88"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"753a9c4c-86e1-46e4-a07e-79e9b6db6666"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"753a9c4c-86e1-46e4-a07e-79e9b6db6666"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"915196d0-0d2d-470a-b0c9-090eb7480f84"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"915196d0-0d2d-470a-b0c9-090eb7480f84"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"b7f4539a-de43-4c95-855d-4311d429ac22"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"b7f4539a-de43-4c95-855d-4311d429ac22"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"764b6ebd-cfc3-448b-a3e0-6c5966c739a1"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"764b6ebd-cfc3-448b-a3e0-6c5966c739a1"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"c3aaa532-8016-4fe0-8032-f7ec8b806fe2"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"c3aaa532-8016-4fe0-8032-f7ec8b806fe2"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"60bf6da0-8f21-401b-8a32-daea92656f95"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"60bf6da0-8f21-401b-8a32-daea92656f95"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"0c48eebb-c2f3-4134-a53d-7cded3b4f125"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":3,"requestId":"0c48eebb-c2f3-4134-a53d-7cded3b4f125"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"8aee5cd2-3346-48e1-9d9b-44b0ca0eafbc"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"8aee5cd2-3346-48e1-9d9b-44b0ca0eafbc"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"364289bb-acab-47a6-9301-53e65ef889b9"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":3,"requestId":"364289bb-acab-47a6-9301-53e65ef889b9"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"3615eae2-90ab-4f5c-b065-1ef63d14d5f1"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"3615eae2-90ab-4f5c-b065-1ef63d14d5f1"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"8cd4adbe-ccee-479e-9d07-8d8955e46299"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":3,"requestId":"8cd4adbe-ccee-479e-9d07-8d8955e46299"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"ba7e05d4-3240-4b09-b81c-5a716a990853"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"ba7e05d4-3240-4b09-b81c-5a716a990853"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"d164ad48-ed52-4b23-add0-e74ae9078bb2"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":3,"requestId":"d164ad48-ed52-4b23-add0-e74ae9078bb2"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"ca23dc4b-abda-4de6-9c9a-8b6ee99ed1aa"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"ca23dc4b-abda-4de6-9c9a-8b6ee99ed1aa"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"94ec1972-4ff9-4ee1-86e6-076a00aa2e85"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"94ec1972-4ff9-4ee1-86e6-076a00aa2e85"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"b5be55e3-de6e-43b1-b69b-a32a034f0c01"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"b5be55e3-de6e-43b1-b69b-a32a034f0c01"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"3f06ee1c-453f-490e-adf1-7b6ffdca2a3a"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"3f06ee1c-453f-490e-adf1-7b6ffdca2a3a"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"aadaa306-4a34-4d7f-9de9-81ec8ee3d07c"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"aadaa306-4a34-4d7f-9de9-81ec8ee3d07c"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"64ba28e2-f45e-4dc1-8f30-6a37b867df55"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"64ba28e2-f45e-4dc1-8f30-6a37b867df55"} + + ✓ app/api/streak/route.test.ts (204 tests) 7866ms + ✓ uses LRU eviction so frequently accessed entries survive 2194ms + ✓ evicts least recently used entries when cache is full 3134ms + ✓ app/generator/components/sections/TechnologiesSection.accessibility.test.tsx (5 tests) 6456ms + ✓ renders accessible search input with placeholder 1044ms + ✓ renders category filter buttons accessible by role 2464ms + ✓ supports keyboard navigation to interactive controls 855ms + ✓ renders technologies section title and description 454ms + ✓ shows clear all button when technologies are selected 1619ms + ✓ components/KonamiEasterEgg.mouse-interactivity.test.tsx (5 tests) 6315ms + ✓ triggers simulated mouseenter/hover gestures on active segments or interactive nodes 1994ms + ✓ verifies that responsive tooltip layouts display at computed coordinates 1803ms + ✓ tests custom click/touch gestures and ensure click events propagate correctly 1015ms + ✓ asserts appropriate cursor style classes (like pointer) are applied on hover 778ms + ✓ checks that mouseleave events successfully hide temporary overlay visuals 712ms + ✓ components/dashboard/DashboardClient.mouse-interactivity.test.tsx (5 tests) 5390ms + ✓ Assert appropriate cursor style classes (like pointer) are applied on hover: verifies interactive class names on buttons 1609ms + ✓ Trigger simulated mouseenter/hover gestures on active segments or interactive nodes: buttons accept hover safely 1050ms + ✓ Test custom click/touch gestures and ensure click events propagate correctly: Profile Optimizer button sets modal state 631ms + ✓ Verify that responsive tooltip layouts display at computed coordinates: delegates stats formatting to StatsCard 398ms + ✓ Check that mouseleave events successfully hide temporary overlay visuals: handles Escape key overlay exit 1694ms + ✓ app/generator/GeneratorClient.timezone-boundaries.test.tsx (5 tests) 9925ms + ✓ renders stably when the host timezone is stubbed to UTC, EST, IST, or JST 4688ms + ✓ anchors its initial render to a fixed system clock so visible dates stay deterministic 742ms + ✓ renders on Feb 29 of a leap year without throwing a date-parse error 1461ms + ✓ produces stable Intl.DateTimeFormat output for en-US, en-IN, ja-JP, and de-DE locales 982ms + ✓ renders identically on both sides of the US spring-forward DST boundary 2045ms + ✓ components/dashboard/PopularPinnedRepos.response-breakpoints.test.tsx (47 tests) 3596ms + ✓ dropdown wrapper uses relative positioning at every breakpoint 624ms + ✓ dropdown listbox has z-10 to float above card content at all breakpoints 315ms + ✓ components/dashboard/DashboardClient.test.tsx (18 tests) 10754ms + ✓ does not paint the worse user green in "Longest Inactive Period" when the other gap is 0 1062ms + ✓ opens and closes the compare profile modal 490ms + ✓ transitions to compare mode when a user is successfully fetched 620ms + ✓ exits compare mode and restores single profile view 783ms + ✓ generate your own button points to root / 465ms + ✓ shows a success toast after the dashboard link is copied 654ms + ✓ shows an error toast when the dashboard link copy fails 481ms + ✓ copies the comparison link when native sharing is unavailable 831ms + ✓ shows an error toast when comparison link copy fails 978ms + ✓ does not show an error toast when native comparison sharing is cancelled 602ms + ✓ shows an error when comparing with the same username (case-insensitive) 377ms + ✓ verify compare modal input can be cleared 686ms + ✓ renders personality tags for both profiles in compare mode 1181ms + ✓ renders repository count truncation warning banner when repositories count > fetched repos count 354ms + ✓ shows Most Consistent badge for profile with higher peak streak in compare mode 734ms + ✓ app/customize/components/ThemeQuickPresets.timezone-boundaries.test.tsx (14 tests) 9550ms + ✓ renders consistently in timezone UTC 3760ms + ✓ renders consistently in timezone America/New_York 1268ms + ✓ renders consistently in timezone Asia/Kolkata 1040ms + ✓ renders consistently in timezone Asia/Tokyo 1191ms + ✓ timezone transitions do not alter available presets 610ms + ✓ components/DeveloperArena.accessibility.test.tsx (10 tests) 6130ms + ✓ gives every rendered image a non-empty accessible name 764ms + ✓ exposes the primary action buttons with descriptive accessible names 588ms + ✓ gives the icon-only "next prediction" button an accessible name via aria-label 306ms + ✓ reveals an accessible "Challenge Linus!" button after the reveal action 1173ms + ✓ does not pull the mouse-driven showdown/legend marquee cards into the tab order 780ms + ✓ keeps a logical, non-skipping heading hierarchy under a page-level h1 445ms + ✓ does not introduce duplicate element ids when rendered more than once 427ms + ✓ does not disturb surrounding tab order or focus when embedded in a page 423ms + ✓ scopes the trivia-game reveal heading to its own panel, not duplicated app-wide 1063ms + ✓ app/customize/components/ThemeSelector.test.tsx (18 tests) 5225ms + ✓ renders without crashing 1051ms + ✓ renders a select element with all theme options 322ms + ✓ verifies that selecting Dracula preset calls onThemeChange("dracula") 587ms + ✓ verifies that selecting Neon preset calls onThemeChange("neon") 531ms + ✓ verifies the select dropdown calls onThemeChange with the selected theme 307ms + ✓ check if active preset button updates when switching from Dracula to Neon 483ms +stderr | app/compare/CompareClient.mouse-interactivity.test.tsx > CompareClient Interactive Tooltips, Cursor Hovers & Touch Event Propagation > verifies mouse hover styling and hover class application on search and action elements +React does not recognize the `whileHover` prop on a DOM element. If you intentionally want it to appear in the DOM as a custom attribute, spell it as lowercase `whilehover` instead. If you accidentally passed it from a parent component, remove it from the DOM element. +React does not recognize the `whileTap` prop on a DOM element. If you intentionally want it to appear in the DOM as a custom attribute, spell it as lowercase `whiletap` instead. If you accidentally passed it from a parent component, remove it from the DOM element. + + ✓ lib/github.fetch-org-members-rate-limit.test.ts (3 tests) 3248ms + ✓ throws a rate-limit error when org members request exhausts GitHub quota 341ms + ✓ preserves the generic org members error for non-rate-limited failures 2837ms +stderr | app/compare/page.mouse-interactivity.test.tsx > CompareClient Mouse Interactivity & Touch Events > verifies mouse hover styling and hover class application on search and action elements +React does not recognize the `whileHover` prop on a DOM element. If you intentionally want it to appear in the DOM as a custom attribute, spell it as lowercase `whilehover` instead. If you accidentally passed it from a parent component, remove it from the DOM element. +React does not recognize the `whileTap` prop on a DOM element. If you intentionally want it to appear in the DOM as a custom attribute, spell it as lowercase `whiletap` instead. If you accidentally passed it from a parent component, remove it from the DOM element. + +stderr | app/compare/CompareClient.mouse-interactivity.test.tsx > CompareClient Interactive Tooltips, Cursor Hovers & Touch Event Propagation > verifies touch start propagation on controls and action buttons +An update to CompareClient inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act +An update to CompareClient inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act + +stderr | app/compare/CompareClient.mouse-interactivity.test.tsx > CompareClient Interactive Tooltips, Cursor Hovers & Touch Event Propagation > verifies touch start propagation on controls and action buttons +An update to CompareClient inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act +An update to CompareClient inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act + + ✓ app/compare/CompareClient.mouse-interactivity.test.tsx (5 tests) 6153ms + ✓ verifies mouse hover styling and hover class application on search and action elements 2098ms + ✓ renders stats showdown cards and verifies hover-related border transitions 1788ms + ✓ triggers mouse hover interactions on coding habits cards 965ms + ✓ verifies touch start propagation on controls and action buttons 512ms + ✓ renders contribution activity heatmap and verifies hover title-tooltips exist 762ms + ✓ app/generator/components/sections/TechnologiesSection.empty-fallback.test.tsx (5 tests) 5311ms + ✓ Case 1: Render the component with empty arrays and verify that a clear, non-breaking fallback UI is displayed 1085ms + ✓ Case 2: Pass null parameters for selected list and verify no crashes occur 644ms + ✓ Case 3: Verify standard structural CSS styles or container class names are maintained even when in its default empty layout state 578ms + ✓ Case 4: Assert that no unexpected runtime errors occur when interacting with the component when callback is missing or undefined 2158ms + ✓ Case 5: Check key DOM structures to make sure empty markers exist 835ms + ✓ app/customize/components/ThemeQuickPresets.test.tsx (17 tests) 5903ms + ✓ renders without crashing 1661ms + ✓ renders a button for each valid theme key 404ms + ✓ renders at least one button for each concrete theme excluding auto and random 1105ms + ✓ checks rendering of preset buttons on sm and lg viewports 472ms + ✓ checks rendering of all preset buttons with accessible labels 310ms +stderr | app/compare/CompareClient.test.tsx > CompareClient > renders comparison page +React does not recognize the `whileHover` prop on a DOM element. If you intentionally want it to appear in the DOM as a custom attribute, spell it as lowercase `whilehover` instead. If you accidentally passed it from a parent component, remove it from the DOM element. +React does not recognize the `whileTap` prop on a DOM element. If you intentionally want it to appear in the DOM as a custom attribute, spell it as lowercase `whiletap` instead. If you accidentally passed it from a parent component, remove it from the DOM element. + +stderr | app/compare/CompareClient.test.tsx > CompareClient > renders comparison page +An update to CompareClient inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act +An update to CompareClient inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act + +stderr | app/compare/CompareClient.test.tsx > CompareClient > renders comparison page +An update to CompareClient inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act +An update to CompareClient inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act + +stderr | app/compare/CompareClient.test.tsx > CompareClient > allows usernames to be modified via controls +An update to CompareClient inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act +An update to CompareClient inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act + +stderr | app/compare/CompareClient.test.tsx > CompareClient > allows usernames to be modified via controls +An update to CompareClient inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act +An update to CompareClient inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act + + ✓ app/compare/page.mouse-interactivity.test.tsx (5 tests) 7466ms + ✓ verifies mouse hover styling and hover class application on search and action elements 2037ms + ✓ renders stats showdown cards and verifies hover-related border transitions 1822ms + ✓ triggers mouse hover interactions on coding habits cards 1534ms + ✓ verifies touch start propagation on controls and action buttons 627ms + ✓ renders contribution activity heatmap and verifies hover title-tooltips exist 1431ms +stderr | app/compare/CompareClient.responsive-breakpoints.test.tsx > CompareClient responsive breakpoints > renders mobile friendly input controls +React does not recognize the `whileHover` prop on a DOM element. If you intentionally want it to appear in the DOM as a custom attribute, spell it as lowercase `whilehover` instead. If you accidentally passed it from a parent component, remove it from the DOM element. +React does not recognize the `whileTap` prop on a DOM element. If you intentionally want it to appear in the DOM as a custom attribute, spell it as lowercase `whiletap` instead. If you accidentally passed it from a parent component, remove it from the DOM element. + + ✓ app/compare/CompareClient.mock-integrations.test.tsx (5 tests) 5386ms + ✓ Test 1: should mock standard asynchronous imports and databases using stubs 1877ms + ✓ Test 2: should test service loading paths to ensure pending state overlays render 942ms + ✓ Test 3: should assert local cache layers are queried before triggering database retrievals 697ms + ✓ Test 4: should verify correct fallback procedures during fake endpoint timeout blocks 960ms + ✓ Test 5: should assert complete cache sync is written on success callbacks 898ms + ✓ app/generator/components/sections/TechnologiesSection.theme-contrast.test.tsx (5 tests) 5793ms + ✓ renders correctly in light theme with proper structure 1150ms + ✓ renders correctly in dark theme with proper structure 871ms + ✓ ensures text remains visible in light mode (contrast proxy check) 1572ms + ✓ ensures text remains visible in dark mode (contrast proxy check) 1176ms + ✓ maintains UI stability when filtering technologies in dark mode 1017ms + ✓ app/compare/CompareClient.test.tsx (7 tests) 4896ms + ✓ renders comparison page 917ms + ✓ allows usernames to be modified via controls 465ms + ✓ renders comparative scores correctly 1012ms + ✓ updates route when compare button is clicked 650ms + ✓ shows error message when api request fails 673ms + ✓ stops loading and shows an error when the comparison request times out 644ms + ✓ does not start a duplicate request while the same comparison is already loading 523ms + ✓ components/KonamiEasterEgg.responsive-breakpoints.test.tsx (5 tests) 5531ms + ✓ 1. Mock standard mobile-width media coordinates (375px): Simulates mobile viewport size and renders without crashing 1372ms + ✓ 2. Assert that layout columns reflow: Matrix rain drops and text lines structure flow vertically to prevent squishing 1651ms + ✓ 3. Verify styling values prevent absolute-width overflow: Overlays and container boxes use relative constraints 1387ms + ✓ 4. Check that navigation components scale down gracefully: Accent labels and typographic sizes adjust for mobile views 582ms + ✓ 5. Assert mobile-specific toggle states: Verify typing inside input fields disables the overlay trigger 532ms + ✓ components/dashboard/ThemeSelector.test.tsx (12 tests) 3045ms + ✓ renders theme preset buttons with accessibility labels 593ms + ✓ renders accessible theme controls consistently after rerender 868ms + ✓ renders all preset buttons as visible elements 348ms + ✓ app/compare/CompareClient.responsive-breakpoints.test.tsx (5 tests) 4772ms + ✓ renders mobile friendly input controls 1901ms + ✓ renders compare button for small viewport interactions 1383ms + ✓ uses responsive container spacing classes 503ms + ✓ uses responsive layout grid classes 504ms + ✓ contains responsive typography classes for mobile scaling 472ms + ✓ components/WallOfLove.empty-fallback.test.tsx (8 tests) 5053ms + ✓ renders the Wall of Love heading without external data dependencies 1512ms + ✓ renders the developer feedback section text 561ms + ✓ renders the statistics section with hardcoded fallback values 750ms + ✓ renders testimonial content from internal hardcoded data 847ms + ✓ renders the developer community badge CTA 354ms + ✓ renders without GSAP ScrollTrigger registration errors 302ms + ✓ renders all stat items from the internal data set 365ms + ✓ renders testimonial cards with platform indicators 354ms + ✓ components/KonamiEasterEgg.theme-contrast.test.tsx (5 tests) 7004ms + ✓ renders dark-theme overlay with sufficient contrast styling 2244ms + ✓ renders correctly in light theme environments 1311ms + ✓ displays foreground content without clipping through backdrop overlay 1229ms + ✓ renders contrast-oriented emerald visual styling elements 1285ms + ✓ renders gradient and accent elements used for visual cohesion 926ms +stderr | app/compare/CompareClient.accessibility.test.tsx > CompareClient Accessibility Standards > ensures inputs and controls have accessible names +React does not recognize the `whileHover` prop on a DOM element. If you intentionally want it to appear in the DOM as a custom attribute, spell it as lowercase `whilehover` instead. If you accidentally passed it from a parent component, remove it from the DOM element. +React does not recognize the `whileTap` prop on a DOM element. If you intentionally want it to appear in the DOM as a custom attribute, spell it as lowercase `whiletap` instead. If you accidentally passed it from a parent component, remove it from the DOM element. + + ✓ components/InteractiveViewer.test.tsx (35 tests) 2932ms + ✓ renders children correctly 361ms + ✓ shows a tooltip with the formatted date when hovering a tower and updates it across towers 448ms + ✓ app/generator/components/sections/TechnologiesSection.timezone-boundaries.test.tsx (5 tests) 5023ms + ✓ 1. Mock standard timezone settings (e.g., UTC, EST, IST, and JST) 2154ms + ✓ 2. Assert calculations align commits onto the correct visual dates 495ms + ✓ 3. Verify leap year boundaries parse without leaving gaps in grids 398ms + ✓ 4. Assert calendar date format utility outputs match expectations in each locale 577ms + ✓ 5. Test offsets around transition dates like daylight savings 1383ms + ✓ components/KonamiEasterEgg.accessibility.test.tsx (5 tests) 6592ms + ✓ 1. overlay container exposes an accessible role so screen readers can announce its presence 2257ms + ✓ 2. heading inside the overlay is h2 maintaining correct logical heading hierarchy 1876ms + ✓ 3. overlay contains descriptive human-readable text that screen readers can announce 1007ms + ✓ 4. overlay is not present in the accessibility tree before the secret code is typed 829ms + ✓ 5. overlay heading is removed from accessibility tree after display duration expires 611ms + ✓ components/KonamiEasterEgg.timezone-boundaries.test.tsx (5 tests) 6347ms + ✓ renders overlay successfully across multiple timezone settings (UTC, EST, IST, JST) 6281ms + ✓ app/compare/CompareClient.accessibility.test.tsx (5 tests) 4568ms + ✓ ensures inputs and controls have accessible names 1335ms + ✓ keeps primary actions keyboard focusable with visible outline 1185ms + ✓ associates tooltip content using aria-describedby 844ms + ✓ maintains logical keyboard tab order for interactive elements 494ms + ✓ renders proper heading hierarchy without skipping levels 687ms + ✓ components/WallOfLove.mouse-interactivity.test.tsx (8 tests) 5862ms + ✓ renders section heading 1656ms + ✓ renders testimonial author names 669ms + ✓ renders testimonial handles 877ms + ✓ renders testimonial avatars 651ms + ✓ renders stats section values 772ms + ✓ renders testimonial cards with pointer cursor 544ms + ✓ handles mouse enter on testimonial card 507ms + ✓ components/DeveloperArena.test.tsx (5 tests) 4207ms + ✓ renders correctly with sections and headings 1444ms + ✓ triggers onSelectBattle when a trending showdown is clicked 434ms + ✓ reveals the developer in the trivia game when Reveal button is clicked 1027ms + ✓ triggers correct challenge action when Challenge Linus is clicked after reveal 821ms + ✓ allows skipping a trivia game challenge 451ms +stderr | app/contributors/ContributorsClient.mouse-interactivity.test.tsx > ContributorsClient - Interactive Tooltips, Cursor Hovers & Touch Event Propagation > triggers mouse hover gestures on magnetic CTA nodes and computes local shift coordinates +React does not recognize the `whileInView` prop on a DOM element. If you intentionally want it to appear in the DOM as a custom attribute, spell it as lowercase `whileinview` instead. If you accidentally passed it from a parent component, remove it from the DOM element. + + ✓ components/DeveloperArena.empty-fallback.test.tsx (6 tests) 3112ms + ✓ 1. renders without crashing when IntersectionObserver is unavailable in the runtime 860ms + ✓ 2. immediately shows the final stat counts instead of starting from zero 536ms + ✓ 3. still renders the core section headings while running in fallback mode 655ms + ✓ 5. survives repeated mount/unmount cycles under the fallback path without leaking errors 608ms + ✓ components/WallOfLove.mock-integrations.test.tsx (5 tests) 2888ms + ✓ registers ScrollTrigger plugin through gsap 938ms + ✓ creates gsap context during render lifecycle 334ms + ✓ creates animation timelines through mocked gsap 448ms + ✓ renders successfully with reduced motion enabled 637ms + ✓ renders testimonials without requiring external services 500ms + ✓ app/contributors/ContributorsClient.mouse-interactivity.test.tsx (5 tests) 3633ms + ✓ triggers mouse hover gestures on magnetic CTA nodes and computes local shift coordinates 1400ms + ✓ propagates click and touch gestures from CTA links through the client boundary 927ms + ✓ applies cursor-safe hover classes to interactive links without blocking pointer events 447ms + ✓ hides temporary magnetic offset visuals when mouseleave resets the CTA transform 732ms + ✓ components/WallOfLove.test.tsx (6 tests) 3664ms + ✓ renders section heading 1472ms + ✓ renders testimonial author names 571ms + ✓ renders testimonial handles 385ms + ✓ renders testimonial avatars 404ms + ✓ renders stats section values 418ms + ✓ links the testimonial CTA to the review form route 403ms +stderr | app/compare/CompareClient.theme-contrast.test.tsx > CompareClient Theme Contrast > applies theme contrast classes to heading +React does not recognize the `whileHover` prop on a DOM element. If you intentionally want it to appear in the DOM as a custom attribute, spell it as lowercase `whilehover` instead. If you accidentally passed it from a parent component, remove it from the DOM element. +React does not recognize the `whileTap` prop on a DOM element. If you intentionally want it to appear in the DOM as a custom attribute, spell it as lowercase `whiletap` instead. If you accidentally passed it from a parent component, remove it from the DOM element. + + ✓ lib/crypto.empty-fallback.test.ts (11 tests) 2437ms + ✓ encrypts and decrypts a normal token string 497ms + ✓ rejects malformed payload with wrong number of parts 323ms + ✓ throws on decrypt with wrong key 481ms + ✓ app/compare/CompareClient.theme-contrast.test.tsx (5 tests) 3742ms + ✓ applies theme contrast classes to heading 1774ms + ✓ applies light and dark theme classes to first username input 703ms + ✓ applies light and dark theme classes to second username input 370ms + ✓ applies contrast classes to compare button 413ms + ✓ renders developer showdown badge with theme-aware styling 472ms + ✓ app/generator/components/sections/TechnologiesSection.mock-integrations.test.tsx (5 tests) 4299ms + ✓ 1. Mock standard asynchronous imports and databases using stubs 1545ms + ✓ 3. Assert local cache layers are queried before triggering database retrievals 1428ms + ✓ 5. Assert complete cache sync is written on success callbacks 1111ms + ✓ app/compare/page.accessibility.test.tsx (5 tests) 4190ms + ✓ should verify accessible labels and aria attributes are correctly mapped 1077ms + ✓ should maintain visible focus indicators or appropriate focus styles on interactive elements 662ms + ✓ should verify tooltip labels provide correct screen reader descriptions 634ms + ✓ should ensure sequential keyboard navigation follows a logical tab order 945ms + ✓ should maintain a logically ordered heading hierarchy 862ms + ✓ app/customize/components/ThemeQuickPresets.responsive-breakpoints.test.tsx (5 tests) 3339ms + ✓ renders correctly on a mobile viewport (375px) 2140ms + ✓ renders the same preset buttons across viewport sizes 468ms + ✓ does not introduce fixed-width layout issues on small screens 347ms + ✓ components/WallOfLove.accessibility.test.tsx (5 tests) 3407ms + ✓ renders the main heading 1331ms + ✓ renders avatars with alt text 766ms + ✓ renders accessibility badge text 323ms + ✓ renders statistics labels 738ms + ✓ app/generator/components/sections/SocialsSection.accessibility.test.tsx (5 tests) 2984ms + ✓ renders accessible tab buttons 782ms + ✓ allows keyboard navigation through primary controls 1205ms + ✓ ensures social icons expose accessible names through alt text 515ms + ✓ app/compare/CompareClient.timezone-boundaries.test.tsx (5 tests) 3365ms + ✓ Test 1: should mock standard timezone settings (e.g., UTC, EST, IST, and JST) 1413ms + ✓ Test 2: should assert calculations align commits onto the correct visual dates 534ms + ✓ Test 3: should verify leap year boundaries parse without leaving gaps in grids 502ms + ✓ Test 4: should assert calendar date format utility outputs match expectations in each locale 384ms + ✓ Test 5: should test offsets around transition dates like daylight savings 492ms + ✓ app/customize/components/ThemeSelector.empty-fallback.test.tsx (5 tests) 2596ms + ✓ renders a non-breaking fallback UI when theme prop is an empty string 1493ms + ✓ renders a clear, non-breaking fallback when theme is an unrecognised key not in THEME_KEYS 445ms + ✓ components/reviewform.empty-fallback.test.tsx (5 tests) 3043ms + ✓ renders the empty default form without runtime errors 577ms + ✓ shows a clear fallback validation message when handle is missing 440ms + ✓ shows a non-breaking fallback validation message for invalid handle input 1577ms + ✓ components/KonamiEasterEgg.mock-integrations.test.tsx (5 tests) 3889ms + ✓ schedules an auto-dismiss timeout stub with the configured displayDuration when triggered 1465ms + ✓ dismisses the overlay automatically after the displayDuration timeout stub elapses 1432ms + ✓ does not trigger the overlay on a partial or incorrect secret code — buffer cache must not flush prematurely 930ms + ✓ app/components/Footer.test.tsx (15 tests) 3621ms + ✓ renders Documentation link with the correct destination 738ms + ✓ includes Resources section with documentation and repository links 312ms + ✓ includes Connect section with social media links 336ms + ✓ app/generator/components/sections/DescriptionSection.massive_scaling.test.tsx (5 tests) 2471ms + ✓ Case 1: renders correctly at the exact 280-character limit — counter reads zero and layout stays intact 506ms + ✓ Case 3: amber warning activates at the near-limit threshold across full range re-renders 665ms + ✓ Case 5: DOM structure stays intact after 500 rapid re-renders at extreme bounds 1179ms +stderr | lib/github.rotation.test.ts > GitHub Multi-Token Rotation & Fallback > discards an undecryptable token instead of forwarding a malformed credential +[WARN] Failed to decrypt GitHub token: Token decryption failed: Encryption key must be at least 32 characters + + ✓ lib/github.rotation.test.ts (10 tests) 1663ms + ✓ rotates to the next token on HTTP 429 rate limiting 518ms + ✓ rotates to the next token on HTTP 401 unauthorized and excludes the bad token for 24h 315ms + ✓ decrypts encrypted tokens if GITHUB_TOKEN_ENCRYPTION_KEY is present 335ms + ✓ deduplicates concurrent 401 rotations using the pending refresh promise pattern (Issue #7213) 457ms + ✓ components/WallOfLove.responsive-breakpoints.test.tsx (5 tests) 2556ms + ✓ Mock standard mobile-width media coordinates (e.g. 375px wide viewports): Mock window viewport to simulate iPhone SE size 1168ms + ✓ Assert that columns reflow into standard vertical flex lists: Container stacks rows vertically and tracks align horizontally 341ms + ✓ Verify styling values are not absolute widths that cause horizontal scrollbars on smaller viewports: containers use relative constraints 374ms + ✓ Check that navigation components scale down gracefully: Click/touch targets and layout bounds are properly configured 381ms +stderr | app/compare/page.theme-contrast.test.tsx > ComparePage Theme Contrast (Variation 3) > renders heading with dark and light text contrast classes +React does not recognize the `whileHover` prop on a DOM element. If you intentionally want it to appear in the DOM as a custom attribute, spell it as lowercase `whilehover` instead. If you accidentally passed it from a parent component, remove it from the DOM element. +React does not recognize the `whileTap` prop on a DOM element. If you intentionally want it to appear in the DOM as a custom attribute, spell it as lowercase `whiletap` instead. If you accidentally passed it from a parent component, remove it from the DOM element. + +stderr | components/dashboard/PRInsights/PRInsightsClient.accessibility.test.tsx > PRInsightsClient accessibility compliance > exposes accessible names through real headings, links, and table coordinates +React does not recognize the `whileHover` prop on a DOM element. If you intentionally want it to appear in the DOM as a custom attribute, spell it as lowercase `whilehover` instead. If you accidentally passed it from a parent component, remove it from the DOM element. +Unknown event handler property `onHoverStart`. It will be ignored. +Unknown event handler property `onHoverEnd`. It will be ignored. + + ✓ app/compare/CompareClient.empty-fallback.test.tsx (5 tests) 3109ms + ✓ renders input fields with empty values by default 1052ms + ✓ renders compare button in default state 504ms + ✓ does not render results section when no data is present 684ms + ✓ does not show error message on initial empty render 354ms + ✓ renders page heading in empty state 484ms + ✓ components/dashboard/PRInsights/PRInsightsClient.accessibility.test.tsx (5 tests) 5074ms + ✓ exposes accessible names through real headings, links, and table coordinates 1411ms + ✓ keeps focusable controls visible and avoids suppressing outline behavior 450ms + ✓ provides tooltip-style repository labels for truncated names 682ms + ✓ supports normal keyboard tab order across chart controls and PR highlight links 1583ms + ✓ renders headings with a logical structural hierarchy 917ms + ✓ components/dashboard/PopularPinnedRepos.test.tsx (49 tests) 5459ms + ✓ renders repo cards as anchor tags with correct href 1188ms + ✓ shows "Pinned Repositories" after switching to pinned 428ms + ✓ app/compare/page.theme-contrast.test.tsx (5 tests) 6495ms + ✓ renders heading with dark and light text contrast classes 1427ms + ✓ renders username input fields with dark and light theme styling 780ms + ✓ renders compare button with proper contrast classes for both themes 1506ms + ✓ applies border contrast styling to form controls 1212ms + ✓ renders decorative badge with theme-aware background styling 1513ms + ✓ app/customize/components/ControlsPanel.accessibility.test.tsx (5 tests) 7116ms + ✓ renders username input control 1058ms + ✓ renders color pickers with accessible aria labels 1406ms + ✓ renders scale buttons with accessible names 3629ms + ✓ renders select controls used by keyboard and screen readers 390ms + ✓ renders radius slider control 608ms + ✓ app/generator/GeneratorClient.mock-integrations.test.tsx (5 tests) 8085ms + ✓ Case 3: asserts local cache layers are queried before triggering database retrievals 4479ms + ✓ Case 5: asserts complete cache sync is written on success callbacks 3155ms +stderr | app/contributors/ContributorsClient.mock-integrations.test.tsx > ContributorsClient - Interactive Tooltips, Cursor Hovers & Touch Event Propagation > renders successfully with mocked contributor data +React does not recognize the `whileInView` prop on a DOM element. If you intentionally want it to appear in the DOM as a custom attribute, spell it as lowercase `whileinview` instead. If you accidentally passed it from a parent component, remove it from the DOM element. + + ✓ app/customize/components/ControlsPanel.test.tsx (8 tests) 7864ms + ✓ renders the GitHub Username label 2550ms + ✓ renders username input with correct id 571ms + ✓ renders a generic username placeholder 647ms + ✓ renders Linear and Logarithmic buttons 2923ms + ✓ calls onScaleChange with log 448ms +stderr | lib/github.token-encryption.test.ts > github-token-encryption > encryptGitHubToken > returns token as-is when encryption key is not configured +GITHUB_TOKEN_ENCRYPTION_KEY not configured. GitHub tokens should be encrypted in production. + + ✓ lib/github.token-encryption.test.ts (19 tests) 2053ms + ✓ decrypts encrypted token correctly 503ms + ✓ parses and encrypts comma-separated tokens 340ms + ✓ decrypts and rotates tokens 367ms + ✓ wraps around to first token 499ms +stderr | app/contributors/ContributorsClient.mock-integrations.test.tsx > ContributorsClient - Interactive Tooltips, Cursor Hovers & Touch Event Propagation > renders successfully with a large mocked contributor list +React does not recognize the `whileHover` prop on a DOM element. If you intentionally want it to appear in the DOM as a custom attribute, spell it as lowercase `whilehover` instead. If you accidentally passed it from a parent component, remove it from the DOM element. +An empty string ("") was passed to the src attribute. This may cause the browser to download the whole page again over the network. To fix this, either do not render the element at all or pass null to src instead of an empty string. +An empty string ("") was passed to the src attribute. This may cause the browser to download the whole page again over the network. To fix this, either do not render the element at all or pass null to src instead of an empty string. +An empty string ("") was passed to the src attribute. This may cause the browser to download the whole page again over the network. To fix this, either do not render the element at all or pass null to src instead of an empty string. +An empty string ("") was passed to the src attribute. This may cause the browser to download the whole page again over the network. To fix this, either do not render the element at all or pass null to src instead of an empty string. +An empty string ("") was passed to the src attribute. This may cause the browser to download the whole page again over the network. To fix this, either do not render the element at all or pass null to src instead of an empty string. +An empty string ("") was passed to the src attribute. This may cause the browser to download the whole page again over the network. To fix this, either do not render the element at all or pass null to src instead of an empty string. +An empty string ("") was passed to the src attribute. This may cause the browser to download the whole page again over the network. To fix this, either do not render the element at all or pass null to src instead of an empty string. +An empty string ("") was passed to the src attribute. This may cause the browser to download the whole page again over the network. To fix this, either do not render the element at all or pass null to src instead of an empty string. +An empty string ("") was passed to the src attribute. This may cause the browser to download the whole page again over the network. To fix this, either do not render the element at all or pass null to src instead of an empty string. +An empty string ("") was passed to the src attribute. This may cause the browser to download the whole page again over the network. To fix this, either do not render the element at all or pass null to src instead of an empty string. +An empty string ("") was passed to the src attribute. This may cause the browser to download the whole page again over the network. To fix this, either do not render the element at all or pass null to src instead of an empty string. +An empty string ("") was passed to the src attribute. This may cause the browser to download the whole page again over the network. To fix this, either do not render the element at all or pass null to src instead of an empty string. +An empty string ("") was passed to the src attribute. This may cause the browser to download the whole page again over the network. To fix this, either do not render the element at all or pass null to src instead of an empty string. +An empty string ("") was passed to the src attribute. This may cause the browser to download the whole page again over the network. To fix this, either do not render the element at all or pass null to src instead of an empty string. +An empty string ("") was passed to the src attribute. This may cause the browser to download the whole page again over the network. To fix this, either do not render the element at all or pass null to src instead of an empty string. +An empty string ("") was passed to the src attribute. This may cause the browser to download the whole page again over the network. To fix this, either do not render the element at all or pass null to src instead of an empty string. +An empty string ("") was passed to the src attribute. This may cause the browser to download the whole page again over the network. To fix this, either do not render the element at all or pass null to src instead of an empty string. +An empty string ("") was passed to the src attribute. This may cause the browser to download the whole page again over the network. To fix this, either do not render the element at all or pass null to src instead of an empty string. +An empty string ("") was passed to the src attribute. This may cause the browser to download the whole page again over the network. To fix this, either do not render the element at all or pass null to src instead of an empty string. +An empty string ("") was passed to the src attribute. This may cause the browser to download the whole page again over the network. To fix this, either do not render the element at all or pass null to src instead of an empty string. +An empty string ("") was passed to the src attribute. This may cause the browser to download the whole page again over the network. To fix this, either do not render the element at all or pass null to src instead of an empty string. +An empty string ("") was passed to the src attribute. This may cause the browser to download the whole page again over the network. To fix this, either do not render the element at all or pass null to src instead of an empty string. +An empty string ("") was passed to the src attribute. This may cause the browser to download the whole page again over the network. To fix this, either do not render the element at all or pass null to src instead of an empty string. +An empty string ("") was passed to the src attribute. This may cause the browser to download the whole page again over the network. To fix this, either do not render the element at all or pass null to src instead of an empty string. +An empty string ("") was passed to the src attribute. This may cause the browser to download the whole page again over the network. To fix this, either do not render the element at all or pass null to src instead of an empty string. +An empty string ("") was passed to the src attribute. This may cause the browser to download the whole page again over the network. To fix this, either do not render the element at all or pass null to src instead of an empty string. +An empty string ("") was passed to the src attribute. This may cause the browser to download the whole page again over the network. To fix this, either do not render the element at all or pass null to src instead of an empty string. +An empty string ("") was passed to the src attribute. This may cause the browser to download the whole page again over the network. To fix this, either do not render the element at all or pass null to src instead of an empty string. +An empty string ("") was passed to the src attribute. This may cause the browser to download the whole page again over the network. To fix this, either do not render the element at all or pass null to src instead of an empty string. +An empty string ("") was passed to the src attribute. This may cause the browser to download the whole page again over the network. To fix this, either do not render the element at all or pass null to src instead of an empty string. +An empty string ("") was passed to the src attribute. This may cause the browser to download the whole page again over the network. To fix this, either do not render the element at all or pass null to src instead of an empty string. +An empty string ("") was passed to the src attribute. This may cause the browser to download the whole page again over the network. To fix this, either do not render the element at all or pass null to src instead of an empty string. +An empty string ("") was passed to the src attribute. This may cause the browser to download the whole page again over the network. To fix this, either do not render the element at all or pass null to src instead of an empty string. +An empty string ("") was passed to the src attribute. This may cause the browser to download the whole page again over the network. To fix this, either do not render the element at all or pass null to src instead of an empty string. +An empty string ("") was passed to the src attribute. This may cause the browser to download the whole page again over the network. To fix this, either do not render the element at all or pass null to src instead of an empty string. +An empty string ("") was passed to the src attribute. This may cause the browser to download the whole page again over the network. To fix this, either do not render the element at all or pass null to src instead of an empty string. +An empty string ("") was passed to the src attribute. This may cause the browser to download the whole page again over the network. To fix this, either do not render the element at all or pass null to src instead of an empty string. +An empty string ("") was passed to the src attribute. This may cause the browser to download the whole page again over the network. To fix this, either do not render the element at all or pass null to src instead of an empty string. +An empty string ("") was passed to the src attribute. This may cause the browser to download the whole page again over the network. To fix this, either do not render the element at all or pass null to src instead of an empty string. +An empty string ("") was passed to the src attribute. This may cause the browser to download the whole page again over the network. To fix this, either do not render the element at all or pass null to src instead of an empty string. +An empty string ("") was passed to the src attribute. This may cause the browser to download the whole page again over the network. To fix this, either do not render the element at all or pass null to src instead of an empty string. +An empty string ("") was passed to the src attribute. This may cause the browser to download the whole page again over the network. To fix this, either do not render the element at all or pass null to src instead of an empty string. +An empty string ("") was passed to the src attribute. This may cause the browser to download the whole page again over the network. To fix this, either do not render the element at all or pass null to src instead of an empty string. +An empty string ("") was passed to the src attribute. This may cause the browser to download the whole page again over the network. To fix this, either do not render the element at all or pass null to src instead of an empty string. +An empty string ("") was passed to the src attribute. This may cause the browser to download the whole page again over the network. To fix this, either do not render the element at all or pass null to src instead of an empty string. +An empty string ("") was passed to the src attribute. This may cause the browser to download the whole page again over the network. To fix this, either do not render the element at all or pass null to src instead of an empty string. +An empty string ("") was passed to the src attribute. This may cause the browser to download the whole page again over the network. To fix this, either do not render the element at all or pass null to src instead of an empty string. +An empty string ("") was passed to the src attribute. This may cause the browser to download the whole page again over the network. To fix this, either do not render the element at all or pass null to src instead of an empty string. +An empty string ("") was passed to the src attribute. This may cause the browser to download the whole page again over the network. To fix this, either do not render the element at all or pass null to src instead of an empty string. +An empty string ("") was passed to the src attribute. This may cause the browser to download the whole page again over the network. To fix this, either do not render the element at all or pass null to src instead of an empty string. +An empty string ("") was passed to the src attribute. This may cause the browser to download the whole page again over the network. To fix this, either do not render the element at all or pass null to src instead of an empty string. +An empty string ("") was passed to the src attribute. This may cause the browser to download the whole page again over the network. To fix this, either do not render the element at all or pass null to src instead of an empty string. +An empty string ("") was passed to the src attribute. This may cause the browser to download the whole page again over the network. To fix this, either do not render the element at all or pass null to src instead of an empty string. +An empty string ("") was passed to the src attribute. This may cause the browser to download the whole page again over the network. To fix this, either do not render the element at all or pass null to src instead of an empty string. +An empty string ("") was passed to the src attribute. This may cause the browser to download the whole page again over the network. To fix this, either do not render the element at all or pass null to src instead of an empty string. +An empty string ("") was passed to the src attribute. This may cause the browser to download the whole page again over the network. To fix this, either do not render the element at all or pass null to src instead of an empty string. +An empty string ("") was passed to the src attribute. This may cause the browser to download the whole page again over the network. To fix this, either do not render the element at all or pass null to src instead of an empty string. +An empty string ("") was passed to the src attribute. This may cause the browser to download the whole page again over the network. To fix this, either do not render the element at all or pass null to src instead of an empty string. +An empty string ("") was passed to the src attribute. This may cause the browser to download the whole page again over the network. To fix this, either do not render the element at all or pass null to src instead of an empty string. +An empty string ("") was passed to the src attribute. This may cause the browser to download the whole page again over the network. To fix this, either do not render the element at all or pass null to src instead of an empty string. +An empty string ("") was passed to the src attribute. This may cause the browser to download the whole page again over the network. To fix this, either do not render the element at all or pass null to src instead of an empty string. +An empty string ("") was passed to the src attribute. This may cause the browser to download the whole page again over the network. To fix this, either do not render the element at all or pass null to src instead of an empty string. +An empty string ("") was passed to the src attribute. This may cause the browser to download the whole page again over the network. To fix this, either do not render the element at all or pass null to src instead of an empty string. +An empty string ("") was passed to the src attribute. This may cause the browser to download the whole page again over the network. To fix this, either do not render the element at all or pass null to src instead of an empty string. +An empty string ("") was passed to the src attribute. This may cause the browser to download the whole page again over the network. To fix this, either do not render the element at all or pass null to src instead of an empty string. +An empty string ("") was passed to the src attribute. This may cause the browser to download the whole page again over the network. To fix this, either do not render the element at all or pass null to src instead of an empty string. +An empty string ("") was passed to the src attribute. This may cause the browser to download the whole page again over the network. To fix this, either do not render the element at all or pass null to src instead of an empty string. +An empty string ("") was passed to the src attribute. This may cause the browser to download the whole page again over the network. To fix this, either do not render the element at all or pass null to src instead of an empty string. +An empty string ("") was passed to the src attribute. This may cause the browser to download the whole page again over the network. To fix this, either do not render the element at all or pass null to src instead of an empty string. +An empty string ("") was passed to the src attribute. This may cause the browser to download the whole page again over the network. To fix this, either do not render the element at all or pass null to src instead of an empty string. +An empty string ("") was passed to the src attribute. This may cause the browser to download the whole page again over the network. To fix this, either do not render the element at all or pass null to src instead of an empty string. +An empty string ("") was passed to the src attribute. This may cause the browser to download the whole page again over the network. To fix this, either do not render the element at all or pass null to src instead of an empty string. +An empty string ("") was passed to the src attribute. This may cause the browser to download the whole page again over the network. To fix this, either do not render the element at all or pass null to src instead of an empty string. +An empty string ("") was passed to the src attribute. This may cause the browser to download the whole page again over the network. To fix this, either do not render the element at all or pass null to src instead of an empty string. +An empty string ("") was passed to the src attribute. This may cause the browser to download the whole page again over the network. To fix this, either do not render the element at all or pass null to src instead of an empty string. +An empty string ("") was passed to the src attribute. This may cause the browser to download the whole page again over the network. To fix this, either do not render the element at all or pass null to src instead of an empty string. +An empty string ("") was passed to the src attribute. This may cause the browser to download the whole page again over the network. To fix this, either do not render the element at all or pass null to src instead of an empty string. +An empty string ("") was passed to the src attribute. This may cause the browser to download the whole page again over the network. To fix this, either do not render the element at all or pass null to src instead of an empty string. +An empty string ("") was passed to the src attribute. This may cause the browser to download the whole page again over the network. To fix this, either do not render the element at all or pass null to src instead of an empty string. +An empty string ("") was passed to the src attribute. This may cause the browser to download the whole page again over the network. To fix this, either do not render the element at all or pass null to src instead of an empty string. +An empty string ("") was passed to the src attribute. This may cause the browser to download the whole page again over the network. To fix this, either do not render the element at all or pass null to src instead of an empty string. +An empty string ("") was passed to the src attribute. This may cause the browser to download the whole page again over the network. To fix this, either do not render the element at all or pass null to src instead of an empty string. +An empty string ("") was passed to the src attribute. This may cause the browser to download the whole page again over the network. To fix this, either do not render the element at all or pass null to src instead of an empty string. +An empty string ("") was passed to the src attribute. This may cause the browser to download the whole page again over the network. To fix this, either do not render the element at all or pass null to src instead of an empty string. +An empty string ("") was passed to the src attribute. This may cause the browser to download the whole page again over the network. To fix this, either do not render the element at all or pass null to src instead of an empty string. +An empty string ("") was passed to the src attribute. This may cause the browser to download the whole page again over the network. To fix this, either do not render the element at all or pass null to src instead of an empty string. +An empty string ("") was passed to the src attribute. This may cause the browser to download the whole page again over the network. To fix this, either do not render the element at all or pass null to src instead of an empty string. +An empty string ("") was passed to the src attribute. This may cause the browser to download the whole page again over the network. To fix this, either do not render the element at all or pass null to src instead of an empty string. +An empty string ("") was passed to the src attribute. This may cause the browser to download the whole page again over the network. To fix this, either do not render the element at all or pass null to src instead of an empty string. +An empty string ("") was passed to the src attribute. This may cause the browser to download the whole page again over the network. To fix this, either do not render the element at all or pass null to src instead of an empty string. +An empty string ("") was passed to the src attribute. This may cause the browser to download the whole page again over the network. To fix this, either do not render the element at all or pass null to src instead of an empty string. +An empty string ("") was passed to the src attribute. This may cause the browser to download the whole page again over the network. To fix this, either do not render the element at all or pass null to src instead of an empty string. +An empty string ("") was passed to the src attribute. This may cause the browser to download the whole page again over the network. To fix this, either do not render the element at all or pass null to src instead of an empty string. +An empty string ("") was passed to the src attribute. This may cause the browser to download the whole page again over the network. To fix this, either do not render the element at all or pass null to src instead of an empty string. +An empty string ("") was passed to the src attribute. This may cause the browser to download the whole page again over the network. To fix this, either do not render the element at all or pass null to src instead of an empty string. +An empty string ("") was passed to the src attribute. This may cause the browser to download the whole page again over the network. To fix this, either do not render the element at all or pass null to src instead of an empty string. +An empty string ("") was passed to the src attribute. This may cause the browser to download the whole page again over the network. To fix this, either do not render the element at all or pass null to src instead of an empty string. +An empty string ("") was passed to the src attribute. This may cause the browser to download the whole page again over the network. To fix this, either do not render the element at all or pass null to src instead of an empty string. +An empty string ("") was passed to the src attribute. This may cause the browser to download the whole page again over the network. To fix this, either do not render the element at all or pass null to src instead of an empty string. +An empty string ("") was passed to the src attribute. This may cause the browser to download the whole page again over the network. To fix this, either do not render the element at all or pass null to src instead of an empty string. + + ✓ components/dashboard/ShareSheet.test.tsx (23 tests) 3124ms + ✓ renders correctly when isOpen is true 434ms + ✓ calls onClose when close button is clicked 580ms +stderr | app/contributors/ContributorsClient.mock-integrations.test.tsx > ContributorsClient - Interactive Tooltips, Cursor Hovers & Touch Event Propagation > updates the rendered contributors when mocked data changes +An empty string ("") was passed to the src attribute. This may cause the browser to download the whole page again over the network. To fix this, either do not render the element at all or pass null to src instead of an empty string. + + ✓ app/contributors/ContributorsClient.mock-integrations.test.tsx (5 tests) 5259ms + ✓ renders successfully with mocked contributor data 2352ms + ✓ renders successfully when contributor lists are empty 318ms + ✓ renders successfully with a large mocked contributor list 2146ms +stderr | components/dashboard/DashboardClient.error-resilience.test.tsx > DashboardClient Exception safety, Hydration Stability & Error Fallbacks > verify initialization stability: handles undefined insights and popularRepos lists gracefully +Received `true` for a non-boolean attribute `layout`. + +If you want to write it to the DOM, pass a string instead: layout="true" or layout={value.toString()}. + +Not implemented: HTMLCanvasElement's getContext() method: without installing the canvas npm package +Not implemented: HTMLCanvasElement's getContext() method: without installing the canvas npm package +Not implemented: HTMLCanvasElement's getContext() method: without installing the canvas npm package +Not implemented: HTMLCanvasElement's getContext() method: without installing the canvas npm package +Not implemented: HTMLCanvasElement's getContext() method: without installing the canvas npm package +Not implemented: HTMLCanvasElement's getContext() method: without installing the canvas npm package +stderr | components/dashboard/DashboardClient.error-resilience.test.tsx > DashboardClient Exception safety, Hydration Stability & Error Fallbacks > verify comparison fetch failure exception safety: displays the network error message +Unknown event handler property `onAnimationComplete`. It will be ignored. + +Not implemented: HTMLCanvasElement's getContext() method: without installing the canvas npm package +Not implemented: HTMLCanvasElement's getContext() method: without installing the canvas npm package +Not implemented: HTMLCanvasElement's getContext() method: without installing the canvas npm package +Not implemented: HTMLCanvasElement's getContext() method: without installing the canvas npm package + ✓ app/customize/components/ThemeQuickPresets.theme-contrast.test.tsx (5 tests) 3177ms + ✓ renders dark theme preset button 1838ms + ✓ renders light theme preset button 305ms + ✓ marks active theme with aria-pressed=true 312ms + ✓ renders preset buttons with theme styling 400ms +Not implemented: HTMLCanvasElement's getContext() method: without installing the canvas npm package +Not implemented: HTMLCanvasElement's getContext() method: without installing the canvas npm package +Not implemented: HTMLCanvasElement's getContext() method: without installing the canvas npm package +Not implemented: HTMLCanvasElement's getContext() method: without installing the canvas npm package +Not implemented: HTMLCanvasElement's getContext() method: without installing the canvas npm package +Not implemented: HTMLCanvasElement's getContext() method: without installing the canvas npm package +Not implemented: HTMLCanvasElement's getContext() method: without installing the canvas npm package +Not implemented: HTMLCanvasElement's getContext() method: without installing the canvas npm package +Not implemented: HTMLCanvasElement's getContext() method: without installing the canvas npm package +Not implemented: HTMLCanvasElement's getContext() method: without installing the canvas npm package +Not implemented: HTMLCanvasElement's getContext() method: without installing the canvas npm package +Not implemented: HTMLCanvasElement's getContext() method: without installing the canvas npm package + ✓ app/customize/components/ControlsPanel.mouse-interactivity.test.tsx (5 tests) 3499ms + ✓ keeps scale hover passive and changes scale only when a real segmented control is clicked 1915ms + ✓ routes click and touch events through the actual scale button 486ms + ✓ exposes pointer affordances on real select, color-picker, and shuffle controls 327ms + ✓ disables and restores custom color controls based on the real theme prop 453ms +Not implemented: HTMLCanvasElement's getContext() method: without installing the canvas npm package +Not implemented: HTMLCanvasElement's getContext() method: without installing the canvas npm package +Not implemented: HTMLCanvasElement's getContext() method: without installing the canvas npm package +Not implemented: HTMLCanvasElement's getContext() method: without installing the canvas npm package +Not implemented: HTMLCanvasElement's getContext() method: without installing the canvas npm package +Not implemented: HTMLCanvasElement's getContext() method: without installing the canvas npm package +Not implemented: HTMLCanvasElement's getContext() method: without installing the canvas npm package +Not implemented: HTMLCanvasElement's getContext() method: without installing the canvas npm package +Not implemented: HTMLCanvasElement's getContext() method: without installing the canvas npm package +Not implemented: HTMLCanvasElement's getContext() method: without installing the canvas npm package +Not implemented: HTMLCanvasElement's getContext() method: without installing the canvas npm package +Not implemented: HTMLCanvasElement's getContext() method: without installing the canvas npm package +Not implemented: HTMLCanvasElement's getContext() method: without installing the canvas npm package +Not implemented: HTMLCanvasElement's getContext() method: without installing the canvas npm package +Not implemented: HTMLCanvasElement's getContext() method: without installing the canvas npm package +Not implemented: HTMLCanvasElement's getContext() method: without installing the canvas npm package + ✓ components/AdvancedColorPicker.test.tsx (21 tests) 2869ms + ✓ renders Presets tab as active by default when presets are provided 631ms + ✓ components/dashboard/DashboardClient.error-resilience.test.tsx (5 tests) 2705ms + ✓ verify initialization stability: handles undefined insights and popularRepos lists gracefully 441ms + ✓ verify comparison fetch failure exception safety: displays the network error message 703ms + ✓ verify comparison non-ok response handling: displays custom server error message 748ms + ✓ verify transition state boundary safety: switches between single profile and compare mode safely 503ms + ✓ app/components/CustomizeCTA.mouse-interactivity.test.tsx (5 tests) 1357ms + ✓ should display the tooltip when hovering over an interactive node 1271ms + ✓ app/customize/components/AdvancedSettingsPanel.mouse-interactivity.test.tsx (5 tests) 1560ms + ✓ should display the interactive tooltip when mouse enters an active segment 1276ms + ✓ components/dashboard/Heatmap.test.tsx (6 tests) 1620ms + ✓ renders all provided historical entries as grid cells 690ms + ✓ renders without crashing with 365 days of data 806ms + ✓ components/WallOfLove.theme-contrast.test.tsx (5 tests) 2903ms + ✓ renders Wall Of Love heading 1277ms + ✓ renders developer feedback text 419ms + ✓ renders statistics section 439ms + ✓ renders dark mode classes 404ms + ✓ renders testimonial cards 340ms + ✓ lib/crypto.test.ts (8 tests) 1808ms + ✓ round-trips a plain text token 500ms + ✓ produces different ciphertexts for the same input (random salt/IV) 314ms + ✓ handles special characters 356ms + ✓ components/WallOfLove.timezone-boundaries.test.tsx (5 tests) 3285ms + ✓ Reduced Motion Boundary (UTC Equivalent): renders content when motion reduction is enabled 1270ms + ✓ Visual Alignment Boundary (Calendar Date Alignment Equivalent): preserves testimonial visibility across marquee boundaries 500ms + ✓ Stats Continuity Boundary (Leap Year Equivalent): renders all statistic values without gaps 662ms + ✓ Avatar Mapping Boundary (Timezone Offset Equivalent): preserves avatar-to-author associations 412ms + ✓ Content Preservation Boundary (Calendar Grid Integrity Equivalent): preserves testimonial message content across render boundaries 412ms +stderr | components/dashboard/DashboardClient.accessibility.test.tsx > DashboardClient - Accessibility & Aria compliance (Variation 4) > Case 1: Inspect markup to verify correct accessible label coordinates on landmarks and interactive elements +Received `true` for a non-boolean attribute `layout`. + +If you want to write it to the DOM, pass a string instead: layout="true" or layout={value.toString()}. + + ✓ app/contributors/ContributorsClient.empty-fallback.test.tsx (5 tests) 2886ms + ✓ renders safely with empty contributors array 1052ms + ✓ renders safely with empty top contributors array 781ms + ✓ renders correctly when total contributions is zero 496ms + ✓ preserves core navigation actions with all datasets empty 443ms +stderr | app/contributors/page.theme-contrast.test.tsx > ContributorsPage - Theme Contrast & Visual Cohesion > retains theme contrast utility classes in the layout container structure +React does not recognize the `whileInView` prop on a DOM element. If you intentionally want it to appear in the DOM as a custom attribute, spell it as lowercase `whileinview` instead. If you accidentally passed it from a parent component, remove it from the DOM element. + + ✓ components/dashboard/DashboardClient.accessibility.test.tsx (5 tests) 3210ms + ✓ Case 1: Inspect markup to verify correct accessible label coordinates on landmarks and interactive elements 1439ms + ✓ Case 2: Assert focusable interactive nodes maintain visible focus capability 542ms + ✓ Case 3: Verify tooltip labels are announced with correct accessibility descriptions 616ms + ✓ Case 4: Test keyboard control path selectors to ensure normal tab ordering 316ms + ✓ components/InteractiveViewer.accessibility.test.tsx (15 tests) 2246ms + ✓ exposes an accessible name on the interactive container 646ms + ✓ app/customize/components/SectionLabel.mouse-interactivity.test.tsx (5 tests) 1231ms + ✓ should display the interactive tooltip when mouse enters the section label node 1096ms + ✓ app/contributors/page.theme-contrast.test.tsx (5 tests) 2403ms + ✓ retains theme contrast utility classes in the layout container structure 1218ms + ✓ applies text colors that adapt to system preferences on primary headings 364ms + ✓ ensures background glow overlays do not intercept click events on foreground content 312ms + ✓ components/dashboard/PopularPinnedRepos.mouse-interactivity.test.tsx (18 tests) 2059ms + ✓ dropdown opens on toggle button click 405ms + ✓ repo card links are navigable (correct href present) 314ms + ✓ app/components/Footer.accessibility.test.tsx (5 tests) 1561ms + ✓ renders footer landmark with correct heading hierarchy 722ms + ✓ renders social links with descriptive aria-labels for screen readers 526ms + ✓ lib/graph/dependencyGraph.test.ts (23 tests) 2451ms + ✓ should have every edge targetId reference an existing graph node or be an external reference 352ms + ✓ should not have any node self-reference in its own edges 345ms + ✓ should have all edge scores in the valid range [0, 1] 477ms + ✓ lib/github.race-condition.test.ts (3 tests) 1084ms + ✓ never lets concurrent rate-limit handlers corrupt the rotation index 537ms + ✓ concurrent requests across retries exercise the pool without throwing on a corrupted index 526ms + ✓ app/generator/components/sections/TechnologyGraph.mouse-interactivity.test.tsx (5 tests) 1906ms + ✓ triggers onToggle when a technology node is clicked 1129ms + ✓ app/customize/components/ControlsPanel.empty-fallback.test.tsx (5 tests) 2251ms + ✓ renders safely with empty default values 992ms + ✓ shows fallback message and disables custom color controls for auto theme 439ms + ✓ shows fallback message and random-theme warning for random theme 324ms + ✓ app/customize/components/ThemeQuickPresets.empty-fallback.test.tsx (5 tests) 2652ms + ✓ renders successfully with an unknown theme value 1692ms + ✓ renders preset buttons while no active theme matches 355ms + ✓ renders buttons with fallback styling and accessible labels 385ms +stderr | components/dashboard/PRInsights/PRInsightsClient.theme-contrast.test.tsx > PRInsightsClient Theme Contrast and Visual Cohesion > 1. should emulate both dark and light presets +React does not recognize the `whileHover` prop on a DOM element. If you intentionally want it to appear in the DOM as a custom attribute, spell it as lowercase `whilehover` instead. If you accidentally passed it from a parent component, remove it from the DOM element. +Unknown event handler property `onHoverStart`. It will be ignored. +Unknown event handler property `onHoverEnd`. It will be ignored. + + ✓ app/customize/components/ThemeQuickPresets.mouse-interactivity.test.tsx (5 tests) 3020ms + ✓ renders interactive theme buttons with tooltip titles 1612ms + ✓ triggers theme change when a preset is clicked 354ms + ✓ keeps hoverable preset buttons styled with pointer cursor class support 323ms + ✓ preserves active overlay visuals while hovering the selected preset 330ms + ✓ handles touch interactions and propagates theme selection 375ms + ✓ components/FeatureCards.test.tsx (6 tests) 1741ms + ✓ renders card title, description and icon correctly 814ms + ✓ renders all 3 feature cards matching the defined list length 697ms + ✓ components/dashboard/PRInsights/PRInsightsClient.theme-contrast.test.tsx (5 tests) 2181ms + ✓ 1. should emulate both dark and light presets 1118ms + ✓ 2. should assert that visual elements adapt color styling properly for both settings 395ms + ✓ 3. should verify contrast ratio standards for textual elements 331ms + ✓ 5. should ensure background containers do not clip foreground content 303ms + ✓ components/reviewform.mock-integrations.test.tsx (5 tests) 2376ms + ✓ tests service loading paths to ensure pending state overlays render 1201ms + ✓ asserts local cache layers are queried before triggering database retrievals 331ms + ✓ verifies correct fallback procedures during fake endpoint timeout blocks 493ms + ✓ app/generator/components/sections/SocialsSection.timezone-boundaries.test.tsx (5 tests) 3058ms + ✓ 1. mock standard timezone settings (UTC, EST, IST, JST) and verify rendering remains consistent 1752ms + ✓ 2. verify timezone offsets do not shift rendered data unexpectedly across date boundaries 506ms + ✓ 3. verify leap year dates are handled correctly without gaps or rendering failures 303ms + ✓ 4. assert calendar/date formatting behaves consistently across mocked locales and timezones 305ms + ✓ components/dashboard/ContributionCity3D.test.tsx (11 tests) 2446ms + ✓ renders a canvas element 583ms + ✓ accepts different themes without error 397ms + ✓ 3D City toggle button exists in ActivityLandscape 552ms + ✓ clicking 3D City hides the flat activity chart 439ms +stderr | components/dashboard/PRInsights/PRInsightsClient.timezone-boundaries.test.tsx > PRInsightsClient Timezone Normalization & Calendar Data Boundary Alignment > 1. mocks standard timezone settings (e.g., UTC, EST, IST, and JST) +React does not recognize the `whileHover` prop on a DOM element. If you intentionally want it to appear in the DOM as a custom attribute, spell it as lowercase `whilehover` instead. If you accidentally passed it from a parent component, remove it from the DOM element. +Unknown event handler property `onHoverStart`. It will be ignored. +Unknown event handler property `onHoverEnd`. It will be ignored. + + ✓ components/dashboard/PopularPinnedRepos.mock-integrations.test.tsx (21 tests) 3175ms + ✓ renders starred repo names after switching to Starred tab 783ms + ✓ starred repo cards have correct hrefs 362ms + ✓ components/dashboard/PRInsights/PRInsightsClient.timezone-boundaries.test.tsx (5 tests) 1880ms + ✓ 1. mocks standard timezone settings (e.g., UTC, EST, IST, and JST) 1257ms + ✓ lib/graph/types.theme-contrast.test.ts (5 tests) 939ms + ✓ all edges use valid recommendation categories 519ms + ✓ components/dashboard/HistoricalTrendView.accessibility.test.tsx (5 tests) 2300ms + ✓ Case 1: Inspect markup landmarks to verify the correct usage of accessible coordinate labels on container modules 1171ms + ✓ Case 2: Assert interactive nodes designed to accept focus maintain visible outline class parameters 535ms +stderr | components/dashboard/ProfileCard.accessibility.test.tsx > ProfileCard Accessibility Standards & Screen Reader Aria Compliance > renders logical heading hierarchy correctly +React does not recognize the `whileHover` prop on a DOM element. If you intentionally want it to appear in the DOM as a custom attribute, spell it as lowercase `whilehover` instead. If you accidentally passed it from a parent component, remove it from the DOM element. +React does not recognize the `whileTap` prop on a DOM element. If you intentionally want it to appear in the DOM as a custom attribute, spell it as lowercase `whiletap` instead. If you accidentally passed it from a parent component, remove it from the DOM element. + + ✓ components/dashboard/ProfileCard.accessibility.test.tsx (9 tests) 1303ms + ✓ renders logical heading hierarchy correctly 631ms +stderr | components/dashboard/PRInsights/PRTrendChart.accessibility.test.tsx > PRTrendChart accessibility > renders accessible heading for the chart section +The width(-1) and height(-1) of chart should be greater than 0, + please check the style of container, or the props width(100%) and height(100%), + or add a minWidth(0) or minHeight(undefined) or use aspect(undefined) to control the + height and width. +The width(0) and height(0) of chart should be greater than 0, + please check the style of container, or the props width(100%) and height(100%), + or add a minWidth(0) or minHeight(undefined) or use aspect(undefined) to control the + height and width. + +stderr | app/contributors/page.empty-fallback.test.tsx > ContributorsPage empty fallback > handles fetch failures gracefully and still renders fallback state +[ERROR] Failed to fetch contributors {"error":{}} + +stderr | components/dashboard/PRInsights/PRTrendChart.accessibility.test.tsx > PRTrendChart accessibility > renders view toggle buttons with accessible names +The width(-1) and height(-1) of chart should be greater than 0, + please check the style of container, or the props width(100%) and height(100%), + or add a minWidth(0) or minHeight(undefined) or use aspect(undefined) to control the + height and width. +The width(0) and height(0) of chart should be greater than 0, + please check the style of container, or the props width(100%) and height(100%), + or add a minWidth(0) or minHeight(undefined) or use aspect(undefined) to control the + height and width. + +stderr | components/dashboard/PRInsights/PRTrendChart.accessibility.test.tsx > PRTrendChart accessibility > allows keyboard focus on weekly and monthly buttons +The width(-1) and height(-1) of chart should be greater than 0, + please check the style of container, or the props width(100%) and height(100%), + or add a minWidth(0) or minHeight(undefined) or use aspect(undefined) to control the + height and width. +The width(0) and height(0) of chart should be greater than 0, + please check the style of container, or the props width(100%) and height(100%), + or add a minWidth(0) or minHeight(undefined) or use aspect(undefined) to control the + height and width. + +stderr | components/dashboard/PRInsights/PRTrendChart.accessibility.test.tsx > PRTrendChart accessibility > changes chart view when weekly button is activated +The width(-1) and height(-1) of chart should be greater than 0, + please check the style of container, or the props width(100%) and height(100%), + or add a minWidth(0) or minHeight(undefined) or use aspect(undefined) to control the + height and width. +The width(0) and height(0) of chart should be greater than 0, + please check the style of container, or the props width(100%) and height(100%), + or add a minWidth(0) or minHeight(undefined) or use aspect(undefined) to control the + height and width. + +stderr | app/contributors/page.empty-fallback.test.tsx > ContributorsPage empty fallback > handles non-ok API responses without breaking the page +[ERROR] Failed to fetch contributors {"error":{}} + +stderr | components/dashboard/PRInsights/PRTrendChart.accessibility.test.tsx > PRTrendChart accessibility > changes chart view when weekly button is activated +The width(0) and height(0) of chart should be greater than 0, + please check the style of container, or the props width(100%) and height(100%), + or add a minWidth(0) or minHeight(undefined) or use aspect(undefined) to control the + height and width. + +stderr | app/contributors/ContributorsClient.responsive-breakpoints.test.tsx > ContributorsClient - Responsive Multi-device Columns & Mobile Viewport Layouts > reflows the stats grid from three desktop columns into a single mobile column +React does not recognize the `whileInView` prop on a DOM element. If you intentionally want it to appear in the DOM as a custom attribute, spell it as lowercase `whileinview` instead. If you accidentally passed it from a parent component, remove it from the DOM element. + +stderr | components/dashboard/PRInsights/PRTrendChart.accessibility.test.tsx > PRTrendChart accessibility > changes chart view when monthly button is activated +The width(-1) and height(-1) of chart should be greater than 0, + please check the style of container, or the props width(100%) and height(100%), + or add a minWidth(0) or minHeight(undefined) or use aspect(undefined) to control the + height and width. +The width(0) and height(0) of chart should be greater than 0, + please check the style of container, or the props width(100%) and height(100%), + or add a minWidth(0) or minHeight(undefined) or use aspect(undefined) to control the + height and width. + +stderr | components/dashboard/PRInsights/PRTrendChart.accessibility.test.tsx > PRTrendChart accessibility > changes chart view when monthly button is activated +The width(0) and height(0) of chart should be greater than 0, + please check the style of container, or the props width(100%) and height(100%), + or add a minWidth(0) or minHeight(undefined) or use aspect(undefined) to control the + height and width. + +stderr | components/dashboard/PRInsights/PRTrendChart.accessibility.test.tsx > PRTrendChart accessibility > changes chart view when monthly button is activated +The width(0) and height(0) of chart should be greater than 0, + please check the style of container, or the props width(100%) and height(100%), + or add a minWidth(0) or minHeight(undefined) or use aspect(undefined) to control the + height and width. + +stderr | components/dashboard/PRInsights/PRTrendChart.accessibility.test.tsx > PRTrendChart accessibility > keeps heading hierarchy logical with h2 as main chart heading +The width(-1) and height(-1) of chart should be greater than 0, + please check the style of container, or the props width(100%) and height(100%), + or add a minWidth(0) or minHeight(undefined) or use aspect(undefined) to control the + height and width. +The width(0) and height(0) of chart should be greater than 0, + please check the style of container, or the props width(100%) and height(100%), + or add a minWidth(0) or minHeight(undefined) or use aspect(undefined) to control the + height and width. + + ✓ components/dashboard/PRInsights/PRTrendChart.accessibility.test.tsx (6 tests) 1708ms + ✓ renders accessible heading for the chart section 585ms + ✓ changes chart view when weekly button is activated 405ms + ✓ changes chart view when monthly button is activated 350ms + ✓ app/contributors/page.empty-fallback.test.tsx (5 tests) 3165ms + ✓ renders fallback UI when contributors are empty 1089ms + ✓ maintains page layout and empty markers for empty contributor input 604ms + ✓ handles fetch failures gracefully and still renders fallback state 591ms + ✓ handles non-ok API responses without breaking the page 430ms + ✓ does not emit console errors when the fallback page renders 422ms + ✓ app/contributors/ContributorsClient.responsive-breakpoints.test.tsx (5 tests) 4268ms + ✓ reflows the stats grid from three desktop columns into a single mobile column 441ms + ✓ stacks the CTA action row vertically on mobile via flex-col before switching to flex-row on sm+ 1582ms + ✓ does not emit absolute pixel widths on primary layout wrappers that would trigger horizontal scrollbars at 375px 340ms + ✓ keeps mobile-specific toggle states responsive on primary CTAs (active:scale-95 tap feedback) 1772ms +Not implemented: navigation to another Document + ✓ app/components/navbar.responsive-breakpoints.test.tsx (8 tests) 4610ms + ✓ 1. Renders the Navbar component without the mobile menu initially open 2742ms + ✓ 2. Toggles the mobile menu open and closed when hamburger button is clicked 893ms + ✓ 8. Closes the mobile menu via link navigation, independently of the hamburger toggle button 337ms + ✓ app/components/Footer.empty-fallback.test.tsx (5 tests) 1995ms + ✓ renders raw translation keys as fallback when t returns the path keys 1310ms + ✓ handles custom LinkComponent renders safely with missing optional params 397ms + ✓ components/dashboard/ProfileCard.test.tsx (12 tests) 2564ms + ✓ renders user name 462ms + ✓ renders a copy username button beside the username 544ms + ✓ components/WallOfLove.error-resilience.test.tsx (5 tests) 2281ms + ✓ should maintain hydration stability when initial data is missing 1317ms + ✓ should trigger user reset or reload path on recovery panel click 850ms + ✓ app/customize/components/ControlsPanel.timezone-boundaries.test.tsx (5 tests) 4123ms + ✓ labels the "(current)" option using the viewer's local year, not UTC (2026-01-01T00:30:00Z in America/Los_Angeles -> 2025) 2092ms + ✓ generates the year option range down to 2019 with no gaps or duplicates, anchored to the local year 502ms + ✓ does not drop or duplicate a year option across a Feb 29 leap-year boundary 1059ms + ✓ components/NavbarSearch.test.tsx (8 tests) 1579ms + ✓ clears query when clear button is clicked 326ms + ✓ app/customize/components/ThemeQuickPresets.error-resilience.test.tsx (5 tests) 2811ms + ✓ renders normally without crashing 1903ms + ✓ allows user interaction after rerender 581ms +stderr | components/dashboard/PopularPinnedRepos.error-resilience.test.tsx > PopularRepos — error resilience > handles repos with duplicate names without crashing +Encountered two children with the same key, `same`. Keys should be unique so that components maintain their identity across updates. Non-unique keys may cause children to be duplicated and/or omitted — the behavior is unsupported and could change in a future version. +Encountered two children with the same key, `same`. Keys should be unique so that components maintain their identity across updates. Non-unique keys may cause children to be duplicated and/or omitted — the behavior is unsupported and could change in a future version. + + ✓ app/generator/components/PreviewPanel.mock-integrations.test.tsx (5 tests) 1943ms + ✓ 1. copies markdown using mocked clipboard service 978ms + ✓ 4. switches between preview and markdown tabs 315ms +stderr | components/dashboard/PRInsights/PRTrendChart.mouse-interactivity.test.tsx > PRTrendChart mouse interactivity > renders weekly and monthly view buttons +The tag <stop> is unrecognized in this browser. If you meant to render a React component, start its name with an uppercase letter. +<linearGradient /> is using incorrect casing. Use PascalCase for React components, or lowercase for HTML elements. +The tag <linearGradient> is unrecognized in this browser. If you meant to render a React component, start its name with an uppercase letter. +The tag <defs> is unrecognized in this browser. If you meant to render a React component, start its name with an uppercase letter. + +stderr | components/dashboard/PRInsights/PRTrendChart.mouse-interactivity.test.tsx > PRTrendChart mouse interactivity > shows monthly as the default active view +<linearGradient /> is using incorrect casing. Use PascalCase for React components, or lowercase for HTML elements. + +stderr | components/dashboard/PRInsights/PRTrendChart.mouse-interactivity.test.tsx > PRTrendChart mouse interactivity > switches to the weekly view when the weekly button is clicked +<linearGradient /> is using incorrect casing. Use PascalCase for React components, or lowercase for HTML elements. + +stderr | components/dashboard/PRInsights/PRTrendChart.mouse-interactivity.test.tsx > PRTrendChart mouse interactivity > switches back to the monthly view when the monthly button is clicked +<linearGradient /> is using incorrect casing. Use PascalCase for React components, or lowercase for HTML elements. + +stderr | components/dashboard/PRInsights/PRTrendChart.mouse-interactivity.test.tsx > PRTrendChart mouse interactivity > supports repeated view toggling without losing the active state +<linearGradient /> is using incorrect casing. Use PascalCase for React components, or lowercase for HTML elements. + +stderr | components/dashboard/PRInsights/PRTrendChart.mouse-interactivity.test.tsx > PRTrendChart mouse interactivity > keeps the chart mounted during view toggling +<linearGradient /> is using incorrect casing. Use PascalCase for React components, or lowercase for HTML elements. + + ✓ components/dashboard/PRInsights/PRTrendChart.mouse-interactivity.test.tsx (6 tests) 1842ms + ✓ renders weekly and monthly view buttons 861ms + ✓ supports repeated view toggling without losing the active state 302ms +stderr | components/reviewform.theme-contrast.test.tsx > SubmitReviewPage - Dark and Light Prefers-Color-Scheme Visual Cohesion > Dual Theme Setup: component renders without crashing in both dark and light color scheme environments +React does not recognize the `whileHover` prop on a DOM element. If you intentionally want it to appear in the DOM as a custom attribute, spell it as lowercase `whilehover` instead. If you accidentally passed it from a parent component, remove it from the DOM element. +React does not recognize the `whileTap` prop on a DOM element. If you intentionally want it to appear in the DOM as a custom attribute, spell it as lowercase `whiletap` instead. If you accidentally passed it from a parent component, remove it from the DOM element. + + ✓ components/dashboard/PopularPinnedRepos.error-resilience.test.tsx (17 tests) 2919ms + ✓ outside click after unmount does not throw 712ms + ✓ does not crash when switching views back and forth many times 838ms + ✓ renders correctly after receiving new props (starredRepos added after mount) 309ms + ✓ components/reviewform.theme-contrast.test.tsx (5 tests) 2317ms + ✓ Dual Theme Setup: component renders without crashing in both dark and light color scheme environments 851ms + ✓ Background Overlay Safety: error alert uses translucent background that does not clip foreground text color 1151ms +stderr | app/page.test.tsx > LandingPage > can dismiss the SuccessGuide +Received `true` for a non-boolean attribute `unoptimized`. + +If you want to write it to the DOM, pass a string instead: unoptimized="true" or unoptimized={value.toString()}. +React does not recognize the `whileInView` prop on a DOM element. If you intentionally want it to appear in the DOM as a custom attribute, spell it as lowercase `whileinview` instead. If you accidentally passed it from a parent component, remove it from the DOM element. + + ✓ app/generator/components/sections/ContributionGraphSection.test.tsx (15 tests) 3078ms + ✓ shows a sample preview image when the live pacman graph fails to load 356ms + ✓ mentions the entered username in the sample-preview helper text 402ms + ✓ components/dashboard/ActivityLandscape.mouse-interactivity.test.tsx (5 tests) 1534ms + ✓ triggers simulated mouseenter gestures on active segments to show tooltips 1118ms + ✓ app/page.test.tsx (2 tests | 1 skipped) 2498ms + ✓ can dismiss the SuccessGuide 2489ms + ✓ lib/svg/generator.test.ts (205 tests) 2843ms + ✓ generateSVG with all themes produces valid XML 1205ms +stderr | app/generator/components/sections/TechnologyGraph.accessibility.test.tsx > TechnologyGraph Accessibility > toggles technology selection using Enter key +An update to TechnologyGraph inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act + +stderr | app/generator/components/sections/TechnologyGraph.accessibility.test.tsx > TechnologyGraph Accessibility > toggles technology selection using Space key +An update to TechnologyGraph inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act + + ✓ app/generator/components/sections/TechnologyGraph.accessibility.test.tsx (9 tests) 4023ms + ✓ renders graph heading 336ms + ✓ supports keyboard focus 1401ms + ✓ supports keyboard focus on SVG nodes 856ms + ✓ toggles technology selection using Enter key 477ms + ✓ toggles technology selection using Space key 307ms + ✓ app/components/Footer.responsive-breakpoints.test.tsx (10 tests) 4673ms + ✓ renders all four grid sections on mobile viewport 672ms + ✓ renders navigation links with correct ARIA labels across viewports 1999ms + ✓ renders icons with shrink-0 so they scale gracefully instead of distorting on narrow screens 349ms + ✓ centers section headings/links on narrow viewports before left-aligning at the sm breakpoint 374ms + ✓ components/dashboard/ResumeProfileSection.accessibility.test.tsx (5 tests) 3517ms + ✓ ensures all interactive elements have accessible names for screen readers 1476ms + ✓ allows keyboard users to reach all interactive elements via Tab navigation 418ms + ✓ maintains a logical heading hierarchy without skipping levels 468ms + ✓ presents interactive controls in a logical tab order with no hidden focus traps 845ms + ✓ app/components/Footer.mouse-interactivity.test.tsx (5 tests) 3899ms + ✓ renders branding correctly 425ms + ✓ renders navigation links correctly 2423ms + ✓ renders GitHub repository links correctly 398ms + ✓ renders social links using aria-labels (no ambiguity) 553ms + ✓ components/dashboard/ResumeUpload.accessibility.test.tsx (8 tests) 2000ms + ✓ renders the hidden file input with an accessible label and correct accept types 506ms + ✓ renders a remove button with an accessible label when a file is selected 641ms + ✓ clears the file and resets focus/state when the remove button is activated 557ms + ✓ components/dashboard/ShareSheet.error-resilience.test.tsx (5 tests) 2045ms + ✓ renders nothing when isOpen is false, preventing hydration mismatch 309ms + ✓ mounts cleanly when isOpen is true with all key elements present 986ms + ✓ component remains mounted after window.open is called on the GitHub Wrapped button 472ms + ✓ app/customize/components/ThemeSelector.mouse-interactivity.test.tsx (5 tests) 3551ms + ✓ changes theme through the native selector interaction 1527ms + ✓ selects a concrete non-virtual theme when shuffle is clicked 1067ms + ✓ renders auto theme runtime helper text and split swatch state 362ms + ✓ updates rendered swatch state when the selected theme prop changes 338ms + ✓ app/customize/components/ControlsPanel.error-resilience.test.tsx (5 tests) 2810ms + ✓ renders successfully without crashing 1512ms + ✓ continues rendering after simulated runtime exception 521ms + ✓ renders fallback recovery UI instead of crashing 360ms + ✓ supports recovery after dependency failure 371ms + ✓ app/customize/components/ThemeQuickPresets.accessibility.test.tsx (5 tests) 2306ms + ✓ uses correct accessible label coordinates (aria-label and aria-pressed) 1782ms + ✓ app/generator/components/sections/CommitPulseSection.responsive-breakpoints.test.tsx (5 tests) 1436ms + ✓ implements global full-width fluid configurations on core input elements to prevent clipping 447ms + ✓ enforces maximum boundary scaling restrictions on visual asset elements 572ms + ✓ components/dashboard/PopularPinnnedRepos.mouse-interactivity.test.tsx (5 tests) 2689ms + ✓ triggers mouseenter and mouseleave gestures on repository cards and validates transition classes 1480ms + ✓ verifies that title tooltip attributes are present for truncated repository names 322ms + ✓ handles click and touch gestures and ensures events propagate correctly through nodes 505ms + ✓ app/contributors/ContributorsSearch.empty-fallback.test.tsx (4 tests) 2592ms + ✓ keeps the empty collection stable while searching and clearing 1276ms + ✓ moves from populated results to the fallback and back 1103ms + ✓ app/generator/components/sections/SocialsSection.mock-integrations.test.tsx (5 tests) 2497ms + ✓ 2. verify local cache is checked before triggering simulated service/database requests 533ms + ✓ 3. simulate service timeout and verify fallback behavior is rendered without runtime errors 984ms + ✓ 4. verify successful asynchronous callbacks update the mocked cache correctly 433ms + ✓ 5. verify asynchronous failures are handled gracefully without crashing the component 421ms + ✓ components/dashboard/ActivityLandscape.accessibility.test.tsx (5 tests) 2100ms + ✓ renders chart with accessible role and aria-label 1179ms + ✓ renders all interactive controls as accessible buttons 459ms + ✓ lib/cache.distributed-lock.test.ts (6 tests) 1180ms + ✓ accepts custom maxPollTimeMs via LockConfig and stops polling after timeout 956ms + ✓ components/dashboard/ContributionCity3D.accessibility.test.tsx (9 tests) 2540ms + ✓ does not give the canvas a tabindex or pull it into the tab order 1412ms + ✓ remains accessible across all available themes (no role/label regressions) 590ms + ✓ app/customize/components/AdvancedSettingsPanel.mock-integrations.test.tsx (5 tests) 1961ms + ✓ 1. renders all controlled components inside the configuration region 1378ms +stderr | components/dashboard/ResumePreviewForm.mock-integrations.test.tsx > ResumePreviewForm - Mock Integrations & Cache Stubs > DistributedCache.get falls back to local cache when Redis fetch fails +[ERROR] Cache SET failed {"component":"DistributedCache","key":"[REDACTED]","error":{}} + + ✓ components/Leaderboard.accessibility.test.tsx (5 tests) 1425ms + ✓ renders contributor names for screen readers 558ms + ✓ exposes interactive leaderboard entries as buttons 533ms + ✓ components/dashboard/Achievements.timezone-boundaries.test.tsx (12 tests) 2461ms + ✓ renders the component title 368ms + ✓ shows "See All Achievements" button when there are more than four achievements 989ms + ✓ components/dashboard/ResumePreviewForm.mock-integrations.test.tsx (5 tests) 923ms + ✓ component shows pending overlay when save request is pending 737ms + ✓ app/generator/GeneratorClient.mouse-interactivity.test.tsx (5 tests) 1603ms + ✓ renders interactive editor and preview panels 313ms + ✓ exposes pointer hover styling on interactive editor controls 608ms + ✓ propagates touch-style click interactions for CommitPulse options 321ms + ✓ app/customize/components/ThemeSelector.mock-integrations.test.tsx (5 tests) 3876ms + ✓ 1. Local Cache Verification: verifies the local cache is checked before any async service/database call 1608ms + ✓ 2. Pending/Loading State: tests that pending/loading state is rendered while async operations are unresolved 391ms + ✓ 3. Cache Synchronization: verifies successful responses update/synchronize the local cache 694ms + ✓ 4. Fallback Behavior: verifies fallback behavior when the mocked service times out or rejects 1004ms + ✓ app/customize/components/ControlsPanel.responsive-breakpoints.test.tsx (5 tests) 5150ms + ✓ renders correctly on mobile viewport 1674ms + ✓ keeps username input at full width 805ms + ✓ renders scale buttons in a responsive 3-column grid 752ms + ✓ does not render fixed width controls causing overflow 802ms + ✓ renders responsive select controls 1083ms + ✓ app/components/SuccessGuide.mouse-interactivity.test.tsx (5 tests) 4517ms + ✓ should display responsive tooltip layouts at computed coordinates on mouseenter 2588ms + ✓ should successfully hide temporary overlay visuals on mouseleave 403ms + ✓ should apply appropriate cursor style classes (e.g., pointer) on hover 692ms + ✓ should ensure custom click/touch gestures propagate correctly and fire callbacks 434ms + ✓ components/dashboard/ProfileComparisonAnalytics.test.tsx (6 tests) 8685ms + ✓ renders usernames, developer scores, and key stats in side-by-side layout 1316ms + ✓ correctly ranks repositories and calculates impact scores 1143ms + ✓ displays language side-by-side percentage comparisons correctly 892ms + ✓ renders achievements status with unlock/lock badges correctly 2995ms + ✓ supports keyboard accessibility controls and ARIA compliance 2101ms + ✓ components/dashboard/DashboardSkeleton.mock-integrations.test.tsx (5 tests) 5521ms + ✓ 1. Mock standard asynchronous imports and databases using stubs 703ms + ✓ 5. Assert complete cache sync is written on success callbacks 4574ms + ✓ components/dashboard/GithubWrapped.accessibility.test.tsx (5 tests) 1685ms + ✓ renders main heading correctly for screen readers 1358ms + ✓ components/dashboard/Heatmap.responsive-breakpoints.test.tsx (5 tests) 1214ms + ✓ renders heatmap grid at mobile viewport width 537ms + ✓ app/customize/components/ExportPanel.mouse-interactivity.test.tsx (5 tests) 2213ms + ✓ triggers format change when HTML button is clicked 1195ms + ✓ applies disabled cursor styling when username is missing 307ms +Not implemented: navigation to another Document + ✓ app/components/navbar.test.tsx (8 tests) 3668ms + ✓ renders semantic navigation and mobile menu controls at small widths 1979ms + ✓ dismisses the open mobile menu when a dropdown link is tapped 427ms + ✓ app/generator/components/PreviewPanel.accessibility.test.tsx (5 tests) 1650ms + ✓ 1. verifies correct ARIA roles and dynamic aria-selected states for tabs and tab panels 1143ms + ✓ app/components/HeroSection.empty-fallback.test.tsx (5 tests) 1514ms + ✓ Case 1: mounts successfully and renders initial empty states/headings 1390ms + ✓ app/generator/components/SectionCard.empty-fallback.test.tsx (10 tests) 1922ms + ✓ toggles content visibility when header button is clicked 1465ms + ✓ app/generator/components/EditorPanel.theme-contrast.test.tsx (5 tests) 2678ms + ✓ renders GitHub import button 1754ms + ✓ applies light theme contrast classes 477ms + ✓ components/dashboard/PopularPinnnedRepos.theme-contrast.test.tsx (5 tests) 3048ms + ✓ emulates light and dark color-scheme presets while rendering real repository cards 2238ms + ✓ keeps layered backgrounds from clipping foreground repository content 303ms + ✓ app/generator/components/sections/NameSection.mouse-interactivity.test.tsx (5 tests) 1511ms + ✓ triggers simulated mouseenter/hover gestures on active segments or interactive nodes 1092ms + ✓ app/generator/GeneratorClient.empty-fallback.test.tsx (5 tests) 2040ms + ✓ Case 1: mounts successfully and renders initial empty states in Editor and Preview panels 1184ms + ✓ Case 2: handles empty, undefined, and null input updates defensively without crashing 301ms + ✓ app/achievements/UnlockCelebration.test.tsx (4 tests) 2244ms + ✓ renders as a labelled modal dialog 1844ms + ✓ app/components/navbar.timezone-boundaries.test.tsx (5 tests) 1745ms + ✓ 1. Renders consistently when the system clock is normalized to UTC midnight 809ms + ✓ 2. Aligns navigation link rendering across EST, IST, and JST timezone offsets 743ms + ✓ app/generator/components/sections/CommitPulseSection.accessibility.test.tsx (5 tests) 2831ms + ✓ Case 1: exposes the CommitPulse toggle as an accessible switch 1322ms + ✓ Case 3: clear username button exposes an accessible name 926ms + ✓ components/dashboard/DeveloperJourneyTimeline.test.tsx (5 tests) 2473ms + ✓ renders correct fallback message when activity is empty 632ms + ✓ renders title, subtitle, and filters correctly 1273ms +stderr | components/reviewform.mouse-interactivity.test.tsx > reviewform mouse interactivity > triggers simulated mouseenter and hover interactions +React does not recognize the `whileHover` prop on a DOM element. If you intentionally want it to appear in the DOM as a custom attribute, spell it as lowercase `whilehover` instead. If you accidentally passed it from a parent component, remove it from the DOM element. +React does not recognize the `whileTap` prop on a DOM element. If you intentionally want it to appear in the DOM as a custom attribute, spell it as lowercase `whiletap` instead. If you accidentally passed it from a parent component, remove it from the DOM element. + + ✓ components/InteractiveViewer.mock-integrations.test.tsx (5 tests) 2201ms + ✓ resolves the tooltip through the mocked async presentation layer, not the real module 1468ms + ✓ app/customize/components/ThemeSelector.accessibility.test.tsx (10 tests) 2054ms + ✓ renders shuffle button with accessible name 885ms + ✓ renders all theme options for screen reader access 468ms + ✓ app/components/HeroSection.massive_scaling.test.tsx (5 tests) 2384ms + ✓ Case 1: renders successfully with maximum content constraints 1087ms + ✓ Case 5: remains stable under rapid re-renders with extreme props 885ms + ✓ components/reviewform.mouse-interactivity.test.tsx (5 tests) 2154ms + ✓ triggers simulated mouseenter and hover interactions 1396ms + ✓ app/not-found.accessibility.test.tsx (5 tests) 2710ms + ✓ exposes accessible names on all interactive elements 2244ms + ✓ app/generator/data/socials.accessibility.test.tsx (5 tests) 2603ms + ✓ Case 1: search field remains keyboard accessible 410ms + ✓ Case 2: exposes navigation tabs as accessible tab controls 840ms + ✓ Case 3: exposes category filters as keyboard reachable controls 734ms + ✓ Case 5: selected platforms provide keyboard accessible URL fields 326ms +stderr | components/dashboard/DeploymentTracker.error-resilience.test.tsx > DeploymentTracker — error resilience > does not throw when a required string field is missing from the object +Each child in a list should have a unique "key" prop. + +Check the render method of `DeploymentTracker`. See https://react.dev/link/warning-keys for more information. + +stderr | components/dashboard/ComparisonStatsCard.test.tsx > ComparisonStatsCard > renders correctly with title, labels and values +React does not recognize the `whileInView` prop on a DOM element. If you intentionally want it to appear in the DOM as a custom attribute, spell it as lowercase `whileinview` instead. If you accidentally passed it from a parent component, remove it from the DOM element. +React does not recognize the `whileHover` prop on a DOM element. If you intentionally want it to appear in the DOM as a custom attribute, spell it as lowercase `whilehover` instead. If you accidentally passed it from a parent component, remove it from the DOM element. + + ✓ app/contributors/ContributorsSearch.test.tsx (7 tests) 2860ms + ✓ renders without crashing 1253ms + ✓ filters contributors based on search input 589ms + ✓ ignores leading and trailing whitespace when filtering 437ms + ✓ components/dashboard/DeploymentTracker.error-resilience.test.tsx (12 tests) 2951ms + ✓ does not throw when a required string field is missing from the object 507ms + ✓ does not throw when repoUrl is not actually a valid URL 1688ms + ✓ components/dashboard/ComparisonStatsCard.test.tsx (50 tests) 1445ms + ✓ renders correctly with title, labels and values 340ms + ✓ app/generator/components/ReadmeHealthBreakdown.test.tsx (5 tests) 1309ms + ✓ renders the health breakdown header 454ms + ✓ renders quick fix buttons only for incomplete sections 592ms + ✓ components/ExportButton.test.tsx (13 tests) 2581ms + ✓ renders the default "Export" trigger button, closed and not loading 1050ms + ✓ app/components/navbar.mouse-interactivity.test.tsx (6 tests) 3290ms + ✓ activates the interactive glow overlay on mouseenter and cursor movement 809ms + ✓ propagates click and touch gestures through the mobile menu button 1918ms + ✓ app/(root)/dashboard/[username]/page.test.tsx (6 tests) 1739ms + ✓ renders the dashboard components with the fetched data 934ms + ✓ passes the correct activity data to the historical trend view 415ms + ✓ app/customize/page.accessibility.test.tsx (5 tests) 1327ms + ✓ 1. verifies that the layout structure contains semantic ARIA role landmarks 739ms + ✓ app/documentation/code-block.empty-fallback.test.tsx (11 tests) 1180ms + ✓ renders successfully with an empty string code 506ms + ✓ components/KonamiEasterEgg.error-resilience.test.tsx (5 tests) 2847ms + ✓ auto-resets to the idle state after the display duration elapses 2550ms + ✓ app/generator/components/sections/SocialsSection.responsive-breakpoints.test.tsx (5 tests) 1920ms + ✓ Case 1: verifies grid and flex reflow structure under 375px mobile viewport 1304ms + ✓ components/dashboard/ResumeProfileSection.responsive-breakpoints.test.tsx (5 tests) 2017ms + ✓ renders mobile-first form grid classes for narrow viewports 366ms + ✓ keeps navigation controls visible and usable on mobile breakpoints 963ms + ✓ renders quickly under mobile viewport conditions 352ms + ✓ components/dashboard/GithubWrapped.error-resilience.test.tsx (6 tests) 1261ms + ✓ shows recovery UI when wrappedData is missing 710ms + ✓ app/components/SuccessGuide.responsive-breakpoints.test.tsx (5 tests) 1807ms + ✓ Case 1: Mock a narrow 375px mobile viewport layout configuration and verify that structural grid/column blocks reflow cleanly into single-column or vertical flex setups 316ms + ✓ Case 2: Inspect rendering boundaries to ensure that visual component containers avoid fixed absolute widths that cause horizontal overflow scrolling on compact display windows 827ms + ✓ Case 5: Verify that resizing the viewport across responsive boundaries triggers updates correctly without causing structural state drops or component mount unmount hydration failure hooks 302ms +stderr | app/generator/components/sections/TechnologyGraph.responsive-breakpoints.test.tsx > TechnologyGraph Responsive Breakpoints > 5. asserts mobile-specific toggle states respond cleanly +An update to TechnologyGraph inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act + +stderr | app/generator/components/sections/TechnologyGraph.responsive-breakpoints.test.tsx > TechnologyGraph Responsive Breakpoints > 5. asserts mobile-specific toggle states respond cleanly +The current testing environment is not configured to support act(...) + + ✓ app/generator/components/sections/TechnologyGraph.responsive-breakpoints.test.tsx (5 tests) 1928ms + ✓ 5. asserts mobile-specific toggle states respond cleanly 944ms + ✓ components/dashboard/ShareSheet.responsive-breakpoints.test.tsx (5 tests) 2104ms + ✓ all export option buttons have w-full class ensuring vertical stacking on mobile 1239ms + ✓ renders cleanly when matchMedia reports a 375px mobile viewport 311ms + ✓ components/dashboard/CommitClock.test.tsx (10 tests) 977ms + ✓ renders 'Commit Clock' heading 627ms + ✓ components/ScrollToBottom.mouse-interactivity.test.tsx (7 tests) 1006ms + ✓ is visible when not scrolled to the bottom 712ms + ✓ components/dashboard/HistoricalTrendView.test.tsx (6 tests) 1374ms + ✓ renders navigation controls 651ms + ✓ app/components/HeroSection.test.tsx (15 tests) 1930ms + ✓ renders the hero heading and content 1405ms + ✓ app/documentation/code-block.theme-contrast.test.tsx (5 tests) 927ms + ✓ adapts visual elements for light mode color scheme 647ms + ✓ app/support/page.test.tsx (3 tests) 2484ms + ✓ links to the canonical Discord invite (matches DiscordButton/Footer) 1760ms + ✓ does not link to the stale invite code 544ms +stderr | app/customize/page.test.tsx > CustomizePage timezone query params > falls back when numeric URL params are malformed +An update to CustomizePageInner inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act +An update to CustomizePageInner inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act +An update to CustomizePageInner inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act +An update to CustomizePageInner inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act +An update to CustomizePageInner inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act +An update to CustomizePageInner inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act + + ✓ app/customize/page.test.tsx (3 tests) 1124ms + ✓ omits the default UTC timezone from export snippets 610ms + ✓ components/dashboard/ActivityHeatmapPro.test.tsx (3 tests) 1802ms + ✓ renders heatmap container and title 402ms + ✓ toggles view modes when tab buttons are clicked 1326ms + ✓ components/ScrollToBottom.accessibility.test.tsx (6 tests) 855ms + ✓ button has aria-label="Scroll to bottom" 603ms + ✓ components/CherryBlossom.error-resilience.test.tsx (5 tests) 843ms + ✓ renders a clean recovery panel when the nested animation runtime throws 402ms + ✓ app/generator/components/sections/TechnologyGraph.empty-fallback.test.tsx (5 tests) 953ms + ✓ components/dashboard/ShareSheet.theme-contrast.test.tsx (5 tests) 1418ms + ✓ sets up a dual theme environment mock (emulate both dark and light presets) 390ms + ✓ asserts that the visual elements adapt color styling properly for both settings 513ms +stderr | app/layout.responsive-breakpoints.test.tsx > RootLayout Responsive Multi-device Columns & Mobile Viewport Layouts > 1. mocks standard mobile-width media coordinates (e.g. 375px wide viewports) +In HTML, <html> cannot be a child of <div>. +This will cause a hydration error. + + ✓ app/burnout-analyzer/page.test.tsx (3 tests) 1344ms + ✓ rejects a path that is not exactly owner/repo and does not call the API 1001ms + ✓ app/layout.responsive-breakpoints.test.tsx (5 tests) 2306ms + ✓ 1. mocks standard mobile-width media coordinates (e.g. 375px wide viewports) 902ms + ✓ 4. checks that navigation components scale down gracefully 312ms + ✓ 5. asserts mobile-specific toggle states respond cleanly 531ms + ✓ app/generator/data/technologies.accessibility.test.tsx (5 tests) 1846ms + ✓ Case 2: exposes category filters as accessible buttons 589ms + ✓ Case 3: technology selectors expose readable accessible names 615ms + ✓ app/customize/components/ExportPanel.theme-contrast.test.tsx (5 tests) 1348ms + ✓ verifies visual cohesion classes on export format selector buttons 1073ms + ✓ app/components/Footer.theme-contrast.test.tsx (5 tests) 2019ms + ✓ renders footer with light theme contrast classes 834ms + ✓ keeps footer links readable and interactive across themes 823ms + ✓ app/components/SuccessGuide.test.tsx (5 tests) 1404ms + ✓ renders all 4 step numbers 528ms + ✓ renders the dismiss guide button with correct aria-label 579ms + ✓ components/dashboard/PRInsights/Highlights.accessibility.test.tsx (5 tests) 2188ms + ✓ inspects markup for accessible link roles and descriptive text labels 1069ms + ✓ asserts focusable PR highlight links can receive keyboard focus 434ms + ✓ components/ReturnToTop.empty-fallback.test.tsx (5 tests) 1357ms + ✓ becomes visible when scroll position exceeds the visibility threshold 1004ms + ✓ components/AnimatedCursor.accessibility.test.tsx (5 tests) 1660ms + ✓ keeps the rendered cursor layers decorative and unlabeled 668ms + ✓ does not disturb keyboard tab order or logical heading hierarchy 489ms + ✓ components/dashboard/RepositoryImpactAnalyzer.test.tsx (6 tests) 2104ms + ✓ correctly ranks repositories and limits to top 5 based on weighted impact score 477ms + ✓ complies with accessibility (a11y) standards 1225ms +stderr | components/dashboard/ResumeUpload.theme-contrast.test.tsx > ResumeUpload Theme Contrast > preserves theme‑safe text legibility during the uploading state +An update to ResumeUpload inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act + + ✓ components/dashboard/ResumeUpload.theme-contrast.test.tsx (5 tests) 3980ms + ✓ renders theme‑aware classes in dark mode 2304ms + ✓ renders theme‑aware classes in light mode 481ms + ✓ applies theme‑specific border and hover styling to the dropzone 460ms + ✓ keeps the drag‑active overlay translucent so foreground content remains visible 390ms + ✓ app/customize/components/ExportPanel.test.tsx (11 tests) 8873ms + ✓ renders 'Markdown' button active by default 3584ms + ✓ renders 'HTML' button 642ms + ✓ renders 'React TSX' button 1008ms + ✓ calls onFormatChange with 'html' when HTML button is clicked 884ms + ✓ calls onFormatChange with 'tsx' when React TSX button is clicked 407ms + ✓ calls onCopy when the copy button is clicked 347ms + ✓ displays 'Copied!' on the button when copied prop is true 446ms + ✓ announces copy success through a polite live region 629ms + ✓ app/generator/components/SectionCard.accessibility.test.tsx (5 tests) 1165ms + ✓ 1. ARIA & Accessible Markup Validation: verifies interactive elements expose correct accessibility attributes 470ms + ✓ app/generator/components/PreviewPanel.empty-fallback.test.tsx (5 tests) 788ms + ✓ Case 4: Assert that no unexpected runtime errors or execution breaks occur during initial render mounting with empty parameters 470ms + ✓ components/dashboard/HistoricalTrendView.responsive-breakpoints.test.tsx (5 tests) 953ms + ✓ should apply relative widths and prevent absolute sizing from causing horizontal scrollbars 329ms + ✓ components/dashboard/DeploymentTracker.mouse-interactivity.test.tsx (8 tests) 1059ms + ✓ repo link carries a hover color-transition class 414ms + ✓ app/generator/components/sections/SocialsSection.empty-fallback.test.tsx (5 tests) 2026ms + ✓ renders safely with empty selected array and empty social links 905ms + ✓ shows fallback message when links tab is opened with no selected platforms 956ms + ✓ components/dashboard/ShareSheet.accessibility.test.tsx (5 tests) 2845ms + ✓ Close button has descriptive aria-label for screen reader announcement 1436ms + ✓ All interactive buttons are focusable and have accessible names 517ms + ✓ Social share buttons have visible descriptive text labels for screen readers 355ms + ✓ components/dashboard/RepositoryGraph.accessibility.test.tsx (8 tests) 997ms + ✓ should maintain visible outline behaviors on interactive nodes when focused 412ms +stderr | components/dashboard/ProfileCard.mouse-interactivity.test.tsx > ProfileCard Mouse Interactivity & Event Propagation > Case 1: mouseenter gesture on stat target makes the interactive tooltip visible +React does not recognize the `whileHover` prop on a DOM element. If you intentionally want it to appear in the DOM as a custom attribute, spell it as lowercase `whilehover` instead. If you accidentally passed it from a parent component, remove it from the DOM element. +React does not recognize the `whileTap` prop on a DOM element. If you intentionally want it to appear in the DOM as a custom attribute, spell it as lowercase `whiletap` instead. If you accidentally passed it from a parent component, remove it from the DOM element. + +stderr | src/utils/__tests__/graphqlSync.test.ts > GraphQL Syncing Utility Integration Tests > should successfully intercept network calls and return mocked contribution data +[CommitPulse API] Empty profile or null repository nodes discovered for user "attardekhushi78-cpu". Falling back to baseline collection. + + ✓ src/utils/__tests__/graphqlSync.test.ts (2 tests) 683ms + ✓ should gracefully handle unexpected GitHub API rate limits or network issues 529ms + ✓ components/dashboard/ProfileCard.mouse-interactivity.test.tsx (7 tests) 2592ms + ✓ Case 1: mouseenter gesture on stat target makes the interactive tooltip visible 649ms + ✓ Case 3: touch and click events propagate correctly without encountered runtime prevents 1220ms + ✓ Case 4: asserts interactive target elements contain the cursor-pointer class 325ms + ✓ components/dashboard/DeploymentTracker.accessibility.test.tsx (10 tests) 3904ms + ✓ renders a heading that names the section 1829ms + ✓ exposes the repo link with accessible, non-empty text 480ms + ✓ keeps each deployment card's content groupable for screen readers via accessible name on its link 568ms + ✓ app/components/theme-switch.mock-integrations.test.tsx (5 tests) 1399ms + ✓ renders the toggle button and resolves hydration state asynchronously 954ms +stderr | components/dashboard/PRInsights/PRTrendChart.responsive-breakpoints.test.tsx > PRTrendChart responsive breakpoints > renders the chart inside a ResponsiveContainer +The tag <stop> is unrecognized in this browser. If you meant to render a React component, start its name with an uppercase letter. +<linearGradient /> is using incorrect casing. Use PascalCase for React components, or lowercase for HTML elements. +The tag <linearGradient> is unrecognized in this browser. If you meant to render a React component, start its name with an uppercase letter. +The tag <defs> is unrecognized in this browser. If you meant to render a React component, start its name with an uppercase letter. + +stderr | components/dashboard/PRInsights/PRTrendChart.responsive-breakpoints.test.tsx > PRTrendChart responsive breakpoints > configures ResponsiveContainer to fill its parent +<linearGradient /> is using incorrect casing. Use PascalCase for React components, or lowercase for HTML elements. + +stderr | components/dashboard/PRInsights/PRTrendChart.responsive-breakpoints.test.tsx > PRTrendChart responsive breakpoints > preserves the responsive chart wrapper layout +<linearGradient /> is using incorrect casing. Use PascalCase for React components, or lowercase for HTML elements. + +stderr | components/dashboard/PRInsights/PRInsightsClient.error-resilience.test.tsx > PRInsightsClient - Error Resilience > 5. recovers via the reset/retry path once the underlying error is resolved +The width(-1) and height(-1) of chart should be greater than 0, + please check the style of container, or the props width(100%) and height(100%), + or add a minWidth(0) or minHeight(undefined) or use aspect(undefined) to control the + height and width. + + ✓ components/dashboard/PRInsights/PRInsightsClient.error-resilience.test.tsx (5 tests) 1090ms + ✓ 1. catches a nested child component runtime exception without crashing the tree 302ms + ✓ 3. renders a clean recovery UI instead of a crashed screen when a child throws 483ms + ✓ components/dashboard/Achievements.mouse-interactivity.test.tsx (5 tests) 1854ms + ✓ renders unlocked achievements with hover visual feedback and default cursor 497ms + ✓ applies pointer-events-none to locked achievements so they cannot receive clicks 486ms + ✓ toggles between See All Achievements and Show Less when the button is clicked 654ms +stderr | components/dashboard/PRInsights/PRTrendChart.responsive-breakpoints.test.tsx > PRTrendChart responsive breakpoints > keeps the responsive container mounted while switching chart views +<linearGradient /> is using incorrect casing. Use PascalCase for React components, or lowercase for HTML elements. + +stderr | components/dashboard/PRInsights/PRTrendChart.responsive-breakpoints.test.tsx > PRTrendChart responsive breakpoints > preserves the responsive layout after rerendering with updated data +<linearGradient /> is using incorrect casing. Use PascalCase for React components, or lowercase for HTML elements. + +stderr | components/dashboard/PRInsights/PRTrendChart.responsive-breakpoints.test.tsx > PRTrendChart responsive breakpoints > retains its responsive wrapper classes after rerender +<linearGradient /> is using incorrect casing. Use PascalCase for React components, or lowercase for HTML elements. + + ✓ components/dashboard/PRInsights/PRTrendChart.responsive-breakpoints.test.tsx (6 tests) 1111ms + ✓ keeps the responsive container mounted while switching chart views 686ms +stderr | components/dashboard/DashboardClient.empty-fallback.test.tsx > DashboardClient empty fallback states > renders with an empty languages array without crashing +Received `true` for a non-boolean attribute `layout`. + +If you want to write it to the DOM, pass a string instead: layout="true" or layout={value.toString()}. + +stderr | app/(root)/dashboard/error.test.tsx > Dashboard Error Page > renders the API limit emoji for API limit reached errors +Error: API limit reached + at /home/atulupadhyay/Contribution/commitpulse/app/(root)/dashboard/error.test.tsx:17:30 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:302:11 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:1903:26 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2326:20 + at new Promise (<anonymous>) + at runWithCancel (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2323:10) + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2305:20 + at new Promise (<anonymous>) + at runWithTimeout (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2272:10) + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2955:64 +[ERROR] Dashboard error {"error":{}} + +stderr | app/(root)/dashboard/error.test.tsx > Dashboard Error Page > renders the not found emoji for User not found errors +Error: User not found + at /home/atulupadhyay/Contribution/commitpulse/app/(root)/dashboard/error.test.tsx:24:30 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:302:11 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:1903:26 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2326:20 + at new Promise (<anonymous>) + at runWithCancel (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2323:10) + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2305:20 + at new Promise (<anonymous>) + at runWithTimeout (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2272:10) + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2955:64 +[ERROR] Dashboard error {"error":{}} + +stderr | app/(root)/dashboard/error.test.tsx > Dashboard Error Page > renders the generic error emoji for other errors +Error: Something went wrong + at /home/atulupadhyay/Contribution/commitpulse/app/(root)/dashboard/error.test.tsx:31:30 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:302:11 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:1903:26 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2326:20 + at new Promise (<anonymous>) + at runWithCancel (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2323:10) + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2305:20 + at new Promise (<anonymous>) + at runWithTimeout (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2272:10) + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2955:64 +[ERROR] Dashboard error {"error":{}} + +stderr | app/(root)/dashboard/error.test.tsx > Dashboard Error Page > shows Try again button +Error: error + at /home/atulupadhyay/Contribution/commitpulse/app/(root)/dashboard/error.test.tsx:37:30 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:302:11 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:1903:26 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2326:20 + at new Promise (<anonymous>) + at runWithCancel (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2323:10) + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2305:20 + at new Promise (<anonymous>) + at runWithTimeout (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2272:10) + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2955:64 +[ERROR] Dashboard error {"error":{}} + +stderr | app/(root)/dashboard/error.test.tsx > Dashboard Error Page > calls reset when Try again is clicked +Error: error + at /home/atulupadhyay/Contribution/commitpulse/app/(root)/dashboard/error.test.tsx:45:30 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:302:11 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:1903:26 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2326:20 + at new Promise (<anonymous>) + at runWithCancel (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2323:10) + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2305:20 + at new Promise (<anonymous>) + at runWithTimeout (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2272:10) + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2955:64 +[ERROR] Dashboard error {"error":{}} + +stderr | app/(root)/dashboard/error.test.tsx > Dashboard Error Page > shows Go back home link +Error: error + at /home/atulupadhyay/Contribution/commitpulse/app/(root)/dashboard/error.test.tsx:53:30 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:302:11 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:1903:26 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2326:20 + at new Promise (<anonymous>) + at runWithCancel (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2323:10) + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2305:20 + at new Promise (<anonymous>) + at runWithTimeout (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2272:10) + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2955:64 +[ERROR] Dashboard error {"error":{}} + + ✓ app/(root)/dashboard/error.test.tsx (6 tests) 985ms + ✓ renders the API limit emoji for API limit reached errors 732ms + ✓ components/dashboard/DashboardClient.empty-fallback.test.tsx (5 tests) 2153ms + ✓ renders with an empty languages array without crashing 501ms + ✓ renders with an empty insights array without runtime errors 400ms + ✓ renders with an empty achievements array and preserves layout 542ms + ✓ renders all core dashboard sections when multiple collections are empty 568ms + ✓ components/dashboard/RefreshButton.theme-contrast.test.tsx (5 tests) 537ms + ✓ applies dark mode border contrast styling 401ms + ✓ components/FeatureCards.error-resilience.test.tsx (5 tests) 1067ms + ✓ renders without crashing when all valid props are supplied 615ms + ✓ components/dashboard/ShareSheet.mouse-interactivity.test.tsx (5 tests) 1345ms + ✓ clicking the backdrop overlay propagates the click event to onClose 326ms + ✓ touch events on the Share on X button do not block the click handler from firing 734ms + ✓ components/dashboard/HistoricalTrendView.mouse-interactivity.test.tsx (5 tests) 2761ms + ✓ navigates to previous period when Previous button is clicked 1224ms + ✓ navigates to next period when Next button is clicked 390ms + ✓ submits month selector form successfully 583ms + ✓ submits year selector form successfully 435ms + ✓ app/components/SuccessGuide.timezone-boundaries.test.tsx (5 tests) 1503ms + ✓ Case 1: Mock standard global timezone configurations (e.g., America/New_York, Asia/Kolkata, Asia/Tokyo) and verify calculations accurately bind localized metadata onto intended layout timelines 549ms + ✓ Case 3: Test hour shifts around daylight savings time (DST) transition parameters to guarantee calculations handle temporal gaps smoothly without runtime execution crashes 558ms + ✓ components/FeatureCards.responsive-breakpoints.test.tsx (5 tests) 847ms + ✓ Mobile Column Reflow (Mobile Viewports Equivalent): defaults to single column and reflows at md breakpoint 641ms +stderr | components/reviewform.responsive-breakpoints.test.tsx > SubmitReviewPage responsive breakpoints > renders the form correctly at a standard mobile viewport +React does not recognize the `whileHover` prop on a DOM element. If you intentionally want it to appear in the DOM as a custom attribute, spell it as lowercase `whilehover` instead. If you accidentally passed it from a parent component, remove it from the DOM element. +React does not recognize the `whileTap` prop on a DOM element. If you intentionally want it to appear in the DOM as a custom attribute, spell it as lowercase `whiletap` instead. If you accidentally passed it from a parent component, remove it from the DOM element. + + ✓ components/reviewform.responsive-breakpoints.test.tsx (5 tests) 1255ms + ✓ renders the form correctly at a standard mobile viewport 843ms +stderr | app/error.empty-fallback.test.tsx > Root Error Boundary - Empty & Missing Input Fallbacks > renders successfully when error is an empty object +{} + +stderr | app/error.empty-fallback.test.tsx > Root Error Boundary - Empty & Missing Input Fallbacks > renders successfully when error has no message property +{ name: 'CustomError' } + +stderr | app/error.empty-fallback.test.tsx > Root Error Boundary - Empty & Missing Input Fallbacks > renders successfully when error message is an empty string +Error: + at /home/atulupadhyay/Contribution/commitpulse/app/error.empty-fallback.test.tsx:91:47 + at Proxy.assertThrows (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/chai/index.js:2798:5) + at Proxy.methodWrapper (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/chai/index.js:1700:25) + at Proxy.<anonymous> (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/expect/dist/index.js:1216:12) + at Proxy.overwritingMethodWrapper (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/chai/index.js:1750:33) + at Proxy.<anonymous> (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/expect/dist/index.js:1552:16) + at Proxy.<anonymous> (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/expect/dist/index.js:1156:15) + at Proxy.methodWrapper (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/chai/index.js:1700:25) + at /home/atulupadhyay/Contribution/commitpulse/app/error.empty-fallback.test.tsx:91:87 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:302:11 + +stderr | app/error.empty-fallback.test.tsx > Root Error Boundary - Empty & Missing Input Fallbacks > renders interactive elements and triggers actions correctly in fallback state +{} + + ✓ app/error.empty-fallback.test.tsx (6 tests) 3870ms + ✓ renders successfully when error is null 2429ms + ✓ renders successfully when error is an empty object 327ms + ✓ renders interactive elements and triggers actions correctly in fallback state 450ms + ✓ app/generator/components/sections/SocialsSection.error-resilience.test.tsx (5 tests) 1795ms + ✓ renders clear warning elements when entering the link panel without selecting platforms 926ms + ✓ registers reset triggers safely and fires selection flush functions upon invocation 507ms + ✓ app/generator/components/sections/TechnologiesSection.error-resilience.test.tsx (5 tests) 4137ms + ✓ Case 1: Verify Hydration Stability by rendering normally without exceptions 2193ms + ✓ Case 4: Catches unexpected runtime exceptions inside nested child component (Search Icon) safely 395ms + ✓ Case 5: Ensure user reset/reload paths are available on the recovery panels and function correctly 1443ms + ✓ components/dashboard/ShareSheet.mock-integrations.test.tsx (5 tests) 1235ms + ✓ renders share sheet with mocked service layer data 409ms + ✓ calls mocked markdown copy handler 317ms + ✓ components/dashboard/PRInsights/PRStatusDistribution.error-resilience.test.tsx (5 tests) 1210ms + ✓ 3. provides retry action on recovery panel 647ms + ✓ components/reviewform.error-resilience.test.tsx (5 tests) 2707ms + ✓ 1. should render a clean error recovery UI instead of crashing when a nested runtime exception occurs 1176ms + ✓ 3. should ensure user reset and reload interaction paths are available on recovery panels 718ms + ✓ 4. should recover successfully and try re-rendering when user triggers the reset/retry path 423ms + ✓ 5. should maintain localized hydration stability under isolated background service interruptions without unmounting layout shells 320ms +stderr | app/(root)/dashboard/error.mouse-interactivity.test.tsx > DashboardError Mouse Interactivity > triggers reset when Try again button is clicked +Error: Something went wrong + at renderComponent (/home/atulupadhyay/Contribution/commitpulse/app/(root)/dashboard/error.mouse-interactivity.test.tsx:17:42) + at /home/atulupadhyay/Contribution/commitpulse/app/(root)/dashboard/error.mouse-interactivity.test.tsx:21:5 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:302:11 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:1903:26 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2326:20 + at new Promise (<anonymous>) + at runWithCancel (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2323:10) + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2305:20 + at new Promise (<anonymous>) + at runWithTimeout (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2272:10) +[ERROR] Dashboard error {"error":{}} + +stderr | app/(root)/dashboard/error.mouse-interactivity.test.tsx > DashboardError Mouse Interactivity > handles mouse enter and mouse leave on Try again button +Error: Something went wrong + at renderComponent (/home/atulupadhyay/Contribution/commitpulse/app/(root)/dashboard/error.mouse-interactivity.test.tsx:17:42) + at /home/atulupadhyay/Contribution/commitpulse/app/(root)/dashboard/error.mouse-interactivity.test.tsx:33:5 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:302:11 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:1903:26 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2326:20 + at new Promise (<anonymous>) + at runWithCancel (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2323:10) + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2305:20 + at new Promise (<anonymous>) + at runWithTimeout (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2272:10) +[ERROR] Dashboard error {"error":{}} + +stderr | app/(root)/dashboard/error.mouse-interactivity.test.tsx > DashboardError Mouse Interactivity > handles mouse enter and mouse leave on Go back home button +Error: Something went wrong + at renderComponent (/home/atulupadhyay/Contribution/commitpulse/app/(root)/dashboard/error.mouse-interactivity.test.tsx:17:42) + at /home/atulupadhyay/Contribution/commitpulse/app/(root)/dashboard/error.mouse-interactivity.test.tsx:46:5 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:302:11 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:1903:26 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2326:20 + at new Promise (<anonymous>) + at runWithCancel (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2323:10) + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2305:20 + at new Promise (<anonymous>) + at runWithTimeout (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2272:10) +[ERROR] Dashboard error {"error":{}} + +stderr | app/(root)/dashboard/error.mouse-interactivity.test.tsx > DashboardError Mouse Interactivity > renders navigation link correctly +Error: Something went wrong + at renderComponent (/home/atulupadhyay/Contribution/commitpulse/app/(root)/dashboard/error.mouse-interactivity.test.tsx:17:42) + at /home/atulupadhyay/Contribution/commitpulse/app/(root)/dashboard/error.mouse-interactivity.test.tsx:59:5 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:302:11 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:1903:26 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2326:20 + at new Promise (<anonymous>) + at runWithCancel (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2323:10) + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2305:20 + at new Promise (<anonymous>) + at runWithTimeout (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2272:10) +[ERROR] Dashboard error {"error":{}} + +stderr | app/(root)/dashboard/error.mouse-interactivity.test.tsx > DashboardError Mouse Interactivity > keeps interactive controls visible after mouse interactions +Error: Something went wrong + at renderComponent (/home/atulupadhyay/Contribution/commitpulse/app/(root)/dashboard/error.mouse-interactivity.test.tsx:17:42) + at /home/atulupadhyay/Contribution/commitpulse/app/(root)/dashboard/error.mouse-interactivity.test.tsx:67:5 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:302:11 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:1903:26 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2326:20 + at new Promise (<anonymous>) + at runWithCancel (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2323:10) + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2305:20 + at new Promise (<anonymous>) + at runWithTimeout (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2272:10) +[ERROR] Dashboard error {"error":{}} + + ✓ app/(root)/dashboard/error.mouse-interactivity.test.tsx (5 tests) 723ms + ✓ triggers reset when Try again button is clicked 493ms + ✓ app/(root)/dashboard/layout.mouse-interactivity.test.tsx (5 tests) 2069ms + ✓ displays a tooltip when hovering an active dashboard node 1438ms + ✓ hides temporary tooltip overlays on mouse leave 327ms + ✓ components/InteractiveViewer.responsive-breakpoints.test.tsx (5 tests) 1721ms + ✓ 1. renders correctly on mobile viewport 315ms + ✓ 3. uses flex layout without clipping content 876ms + ✓ 4. preserves navigation/content after resize 306ms + ✓ app/components/CopyRepoButton.mock-integrations.test.tsx (5 tests) 2335ms + ✓ calls the clipboard service when the button is clicked 1325ms + ✓ handles delayed async clipboard resolution 361ms + ✓ app/generator/components/EditorPanel.responsive-breakpoints.test.tsx (5 tests) 2979ms + ✓ 1. Mock standard mobile-width media coordinates (e.g. 375px wide viewports) 1624ms + ✓ 3. Verify styling values are not absolute widths that cause horizontal scrollbars on smaller viewports 368ms + ✓ 4. Check that navigation components scale down gracefully 417ms + ✓ 5. Assert mobile-specific toggle states respond cleanly 350ms + ✓ app/components/theme-switch.accessibility.test.tsx (5 tests) 1539ms + ✓ 1. correctly uses accessible label coordinates (aria-label/role) 715ms + ✓ 2. maintains visible outline and key focus behaviors 356ms + ✓ app/customize/components/ThemeSelector.theme-contrast.test.tsx (5 tests) 996ms + ✓ renders theme selector controls 710ms +Not implemented: navigation to another Document + ✓ app/components/CustomizeCTA.test.tsx (26 tests) 2393ms + ✓ renders the CTA button label 481ms + ✓ renders the section heading as exactly one <h2> 628ms +stderr | components/dashboard/ResumeProfileSection.error-resilience.test.tsx > ResumeProfileSection Error Resilience > renders a clean recovery panel when ResumeUpload throws during render +Error: ResumeUpload render failure + at StubResumeUpload (/home/atulupadhyay/Contribution/commitpulse/components/dashboard/ResumeProfileSection.error-resilience.test.tsx:39:13) + at Object.react_stack_bottom_frame (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:25904:20) + at renderWithHooks (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:7662:22) + at updateFunctionComponent (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:10166:19) + at beginWork (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:11778:18) + at runWithFiberInDEV (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:874:13) + at performUnitOfWork (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:17641:22) + at workLoopSync (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:17469:41) + at renderRootSync (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:17450:11) + at performWorkOnRoot (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:16583:35) { + [stack]: [Getter/Setter], + [message]: 'ResumeUpload render failure' +} + +The above error occurred in the <StubResumeUpload> component. + +React will try to recreate this component tree from scratch using the error boundary you provided, TestErrorBoundary. + + +stderr | app/generator/components/PreviewPanel.mouse-interactivity.test.tsx > PreviewPanel Component Interactivity Tests > Case 3: click events propagate cleanly to parental DOM wrappers +An update to PreviewPanel inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act + + ✓ app/generator/components/PreviewPanel.mouse-interactivity.test.tsx (5 tests) 1177ms + ✓ Case 1: applies transition and hover styles structurally on all interactive controls 821ms +stderr | components/dashboard/ResumeProfileSection.error-resilience.test.tsx > ResumeProfileSection Error Resilience > renders a clean recovery panel when ResumeUpload throws during render +Error: ResumeUpload render failure + at StubResumeUpload (/home/atulupadhyay/Contribution/commitpulse/components/dashboard/ResumeProfileSection.error-resilience.test.tsx:39:13) + at Object.react_stack_bottom_frame (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:25904:20) + at renderWithHooks (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:7662:22) + at updateFunctionComponent (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:10166:19) + at beginWork (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:11778:18) + at runWithFiberInDEV (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:874:13) + at performUnitOfWork (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:17641:22) + at workLoopSync (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:17469:41) + at renderRootSync (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:17450:11) + at performWorkOnRoot (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:16583:35) { + [stack]: [Getter/Setter], + [message]: 'ResumeUpload render failure' +} + +The above error occurred in the <StubResumeUpload> component. + +React will try to recreate this component tree from scratch using the error boundary you provided, TestErrorBoundary. + + +stderr | components/dashboard/ResumeProfileSection.error-resilience.test.tsx > ResumeProfileSection Error Resilience > captures preview rendering failures and surfaces telemetry +Error: ResumePreviewForm render failure + at StubResumePreviewForm (/home/atulupadhyay/Contribution/commitpulse/components/dashboard/ResumeProfileSection.error-resilience.test.tsx:88:13) + at Object.react_stack_bottom_frame (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:25904:20) + at renderWithHooks (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:7662:22) + at updateFunctionComponent (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:10166:19) + at beginWork (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:11778:18) + at runWithFiberInDEV (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:874:13) + at performUnitOfWork (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:17641:22) + at workLoopSync (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:17469:41) + at renderRootSync (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:17450:11) + at performWorkOnRoot (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:16583:35) { + [stack]: [Getter/Setter], + [message]: 'ResumePreviewForm render failure' +} + +The above error occurred in the <StubResumePreviewForm> component. + +React will try to recreate this component tree from scratch using the error boundary you provided, TestErrorBoundary. + + +stderr | components/dashboard/ResumeProfileSection.error-resilience.test.tsx > ResumeProfileSection Error Resilience > logs database connectivity style errors and still recovers to a stable UI +Error: Database connectivity error + at /home/atulupadhyay/Contribution/commitpulse/components/dashboard/ResumeProfileSection.error-resilience.test.tsx:45:15 + at Object.react_stack_bottom_frame (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:25989:20) + at runWithFiberInDEV (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:874:13) + at commitHookEffectListMount (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:13249:29) + at commitHookPassiveMountEffects (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:13336:11) + at commitPassiveMountOnFiber (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:15484:13) + at recursivelyTraversePassiveMountEffects (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:15439:11) + at commitPassiveMountOnFiber (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:15718:11) + at recursivelyTraversePassiveMountEffects (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:15439:11) + at commitPassiveMountOnFiber (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:15476:11) { + [stack]: [Getter/Setter], + [message]: 'Database connectivity error' +} + +The above error occurred in the <StubResumeUpload> component. + +React will try to recreate this component tree from scratch using the error boundary you provided, TestErrorBoundary. + + +stderr | components/dashboard/ResumeProfileSection.error-resilience.test.tsx > ResumeProfileSection Error Resilience > provides a visible reload path on the recovery panel +Error: ResumeUpload render failure + at StubResumeUpload (/home/atulupadhyay/Contribution/commitpulse/components/dashboard/ResumeProfileSection.error-resilience.test.tsx:39:13) + at Object.react_stack_bottom_frame (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:25904:20) + at renderWithHooks (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:7662:22) + at updateFunctionComponent (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:10166:19) + at beginWork (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:11778:18) + at runWithFiberInDEV (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:874:13) + at performUnitOfWork (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:17641:22) + at workLoopSync (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:17469:41) + at renderRootSync (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:17450:11) + at performWorkOnRoot (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:16583:35) { + [stack]: [Getter/Setter], + [message]: 'ResumeUpload render failure' +} + +The above error occurred in the <StubResumeUpload> component. + +React will try to recreate this component tree from scratch using the error boundary you provided, TestErrorBoundary. + + +stderr | components/dashboard/ResumeProfileSection.error-resilience.test.tsx > ResumeProfileSection Error Resilience > provides a visible reload path on the recovery panel +Error: ResumeUpload render failure + at StubResumeUpload (/home/atulupadhyay/Contribution/commitpulse/components/dashboard/ResumeProfileSection.error-resilience.test.tsx:39:13) + at Object.react_stack_bottom_frame (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:25904:20) + at renderWithHooks (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:7662:22) + at updateFunctionComponent (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:10166:19) + at beginWork (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:11778:18) + at runWithFiberInDEV (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:874:13) + at performUnitOfWork (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:17641:22) + at workLoopSync (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:17469:41) + at renderRootSync (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:17450:11) + at performWorkOnRoot (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:16583:35) { + [stack]: [Getter/Setter], + [message]: 'ResumeUpload render failure' +} + +The above error occurred in the <StubResumeUpload> component. + +React will try to recreate this component tree from scratch using the error boundary you provided, TestErrorBoundary. + + +stderr | components/dashboard/ResumeProfileSection.error-resilience.test.tsx > ResumeProfileSection Error Resilience > recovers on retry after a nested preview error and renders normal content again +Error: ResumePreviewForm render failure + at StubResumePreviewForm (/home/atulupadhyay/Contribution/commitpulse/components/dashboard/ResumeProfileSection.error-resilience.test.tsx:88:13) + at Object.react_stack_bottom_frame (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:25904:20) + at renderWithHooks (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:7662:22) + at updateFunctionComponent (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:10166:19) + at beginWork (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:11778:18) + at runWithFiberInDEV (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:874:13) + at performUnitOfWork (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:17641:22) + at workLoopSync (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:17469:41) + at renderRootSync (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:17450:11) + at performWorkOnRoot (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:16583:35) { + [stack]: [Getter/Setter], + [message]: 'ResumePreviewForm render failure' +} + +The above error occurred in the <StubResumePreviewForm> component. + +React will try to recreate this component tree from scratch using the error boundary you provided, TestErrorBoundary. + + + ✓ components/dashboard/ResumeProfileSection.error-resilience.test.tsx (5 tests) 2485ms + ✓ renders a clean recovery panel when ResumeUpload throws during render 1875ms + ✓ captures preview rendering failures and surfaces telemetry 444ms +stderr | app/components/theme-switch.error-resilience.test.tsx > ThemeSwitch error resilience > recovers gracefully when localStorage throws during initial theme resolution +Error: LocalStorage unavailable + at Object.<anonymous> (/home/atulupadhyay/Contribution/commitpulse/app/components/theme-switch.error-resilience.test.tsx:105:15) + at Object.Mock [as getItem] (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/spy/dist/index.js:332:34) + at getInitialIsDark (/home/atulupadhyay/Contribution/commitpulse/app/components/theme-switch.tsx:60:43) + at mountStateImpl (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:8268:24) + at mountState (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:8289:22) + at Object.useState (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:26243:18) + at process.env.NODE_ENV.exports.useState (/home/atulupadhyay/Contribution/commitpulse/node_modules/react/cjs/react.development.js:1263:34) + at useThemeToggle (/home/atulupadhyay/Contribution/commitpulse/app/components/theme-switch.tsx:471:31) + at ThemeToggleButton (/home/atulupadhyay/Contribution/commitpulse/app/components/theme-switch.tsx:556:44) + at Object.react_stack_bottom_frame (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:25904:20) { + [stack]: [Getter/Setter], + [message]: 'LocalStorage unavailable' +} + +The above error occurred in the <ThemeToggleButton> component. + +React will try to recreate this component tree from scratch using the error boundary you provided, TestErrorBoundary. + + +stderr | app/components/theme-switch.error-resilience.test.tsx > ThemeSwitch error resilience > allows the error recovery panel reset button to restore the UI +Error: LocalStorage unavailable + at Object.<anonymous> (/home/atulupadhyay/Contribution/commitpulse/app/components/theme-switch.error-resilience.test.tsx:135:15) + at Object.Mock [as getItem] (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/spy/dist/index.js:332:34) + at getInitialIsDark (/home/atulupadhyay/Contribution/commitpulse/app/components/theme-switch.tsx:60:43) + at mountStateImpl (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:8268:24) + at mountState (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:8289:22) + at Object.useState (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:26243:18) + at process.env.NODE_ENV.exports.useState (/home/atulupadhyay/Contribution/commitpulse/node_modules/react/cjs/react.development.js:1263:34) + at useThemeToggle (/home/atulupadhyay/Contribution/commitpulse/app/components/theme-switch.tsx:471:31) + at ThemeToggleButton (/home/atulupadhyay/Contribution/commitpulse/app/components/theme-switch.tsx:556:44) + at Object.react_stack_bottom_frame (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:25904:20) { + [stack]: [Getter/Setter], + [message]: 'LocalStorage unavailable' +} + +The above error occurred in the <ThemeToggleButton> component. + +React will try to recreate this component tree from scratch using the error boundary you provided, TestErrorBoundary. + +Error: LocalStorage unavailable + at Object.<anonymous> (/home/atulupadhyay/Contribution/commitpulse/app/components/theme-switch.error-resilience.test.tsx:135:15) + at Object.Mock [as getItem] (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/spy/dist/index.js:332:34) + at getInitialIsDark (/home/atulupadhyay/Contribution/commitpulse/app/components/theme-switch.tsx:60:43) + at mountStateImpl (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:8268:24) + at mountState (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:8289:22) + at Object.useState (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:26243:18) + at process.env.NODE_ENV.exports.useState (/home/atulupadhyay/Contribution/commitpulse/node_modules/react/cjs/react.development.js:1263:34) + at useThemeToggle (/home/atulupadhyay/Contribution/commitpulse/app/components/theme-switch.tsx:471:31) + at ThemeToggleButton (/home/atulupadhyay/Contribution/commitpulse/app/components/theme-switch.tsx:556:44) + at Object.react_stack_bottom_frame (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:25904:20) { + [stack]: [Getter/Setter], + [message]: 'LocalStorage unavailable' +} + +The above error occurred in the <ThemeToggleButton> component. + +React will try to recreate this component tree from scratch using the error boundary you provided, TestErrorBoundary. + + + ✓ app/components/theme-switch.error-resilience.test.tsx (4 tests) 728ms + ✓ renders ThemeToggleButton without crashing and shows placeholder before hydration 548ms + ✓ components/dashboard/DashboardSkeleton.theme-contrast.test.tsx (5 tests) 784ms + ✓ 5. should ensure that background overlays do not clip foreground content colors 518ms + ✓ components/dashboard/PopularPinnnedRepos.accessibility.test.tsx (5 tests) 1776ms + ✓ renders repository section heading for screen readers 1138ms + ✓ components/dashboard/ProfileOptimizerModal.theme-contrast.test.tsx (5 tests) 768ms + ✓ keeps action buttons contrast-aware while disabled 504ms +stderr | components/dashboard/Heatmap.mock-integrations.test.tsx > Heatmap Mock Integrations > renders empty state when no activity exists +React does not recognize the `whileInView` prop on a DOM element. If you intentionally want it to appear in the DOM as a custom attribute, spell it as lowercase `whileinview` instead. If you accidentally passed it from a parent component, remove it from the DOM element. + + ✓ app/generator/components/sections/TechnologyGraph.theme-contrast.test.tsx (5 tests) 2105ms + ✓ renders correctly in light theme with visible graph content 1440ms +stderr | components/dashboard/ContributionForecast.test.tsx > ContributionForecast > renders forecast headers and elements +React does not recognize the `whileInView` prop on a DOM element. If you intentionally want it to appear in the DOM as a custom attribute, spell it as lowercase `whileinview` instead. If you accidentally passed it from a parent component, remove it from the DOM element. + + ✓ components/dashboard/ContributionForecast.test.tsx (6 tests) 707ms + ✓ renders forecast headers and elements 532ms + ✓ components/dashboard/Heatmap.mock-integrations.test.tsx (5 tests) 1742ms + ✓ renders grid cells when activity data exists 874ms + ✓ app/contributors/page.responsive-breakpoints.test.tsx (4 tests) 3015ms + ✓ verifies typography classes scaling across responsive viewports 1746ms + ✓ verifies responsive column grids for layout containers 543ms + ✓ verifies flex layout wrapping rules adapt to screen size in CTA block 349ms + ✓ verifies mobile-only responsive display classes for decorative elements 340ms + ✓ components/dashboard/RepositoryContributionExplorer.test.tsx (4 tests) 1166ms + ✓ handles selecting a different repository 669ms + ✓ components/dashboard/Heatmap.accessibility.test.tsx (6 tests) 990ms + ✓ renders a semantic heading H3 for the heatmap title 549ms + ✓ app/achievements/AchievementsClient.a11y.test.tsx (2 tests) 1254ms + ✓ gives both username search inputs an accessible name (not just a placeholder) 690ms + ✓ gives the achievement filter input an accessible name in the loaded view 555ms + ✓ app/customize/components/ControlsPanel.theme-contrast.test.tsx (6 tests) 900ms + ✓ calls onScaleChange when logarithmic scale button is clicked 451ms +stderr | app/generator/components/sections/CommitPulseSection.timezone-boundaries.test.tsx > CommitPulseSection - Timezone Normalization & Calendar Data Boundary Alignment > identifies malformed color parameters and applies appropriate hex invalid warning styles +An update to CommitPulseSection inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act +An update to CommitPulseSection inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act + + ✓ components/ReturnToTop.theme-contrast.test.tsx (5 tests) 734ms + ✓ 2. asserts that visual styling for ReturnToTop adapts properly to current theme settings 632ms + ✓ components/BrandParticles.mouse-interactivity.test.tsx (5 tests) 930ms + ✓ renders particle layer successfully 355ms +stderr | app/generator/components/sections/CommitPulseSection.timezone-boundaries.test.tsx > CommitPulseSection - Timezone Normalization & Calendar Data Boundary Alignment > triggers accent clearing pathways predictably upon interaction commands +An update to CommitPulseSection inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act +An update to CommitPulseSection inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act + + ✓ app/documentation/code-block.accessibility.test.tsx (5 tests) 1386ms + ✓ renders copy button with accessible aria-label 990ms + ✓ app/generator/components/sections/CommitPulseSection.timezone-boundaries.test.tsx (5 tests) 1357ms + ✓ enforces string length layout thresholds on input components to prevent display overflow bugs 656ms + ✓ triggers accent clearing pathways predictably upon interaction commands 517ms + ✓ components/dashboard/PRInsights/PRStatusDistribution.mouse-interactivity.test.tsx (5 tests) 1284ms + ✓ renders interactive filter buttons for available PR states 953ms + ✓ components/dashboard/RadarChart.accessibility.test.tsx (5 tests) 1260ms + ✓ inspects markup for accessible heading and descriptive chart labels 851ms + ✓ hooks/useRecentSearches.mouse-interactivity.test.ts (5 tests) 2232ms + ✓ triggers mouseenter and mouseleave gestures on search tags and validates hover behavior 1645ms +stderr | app/api/student/resume/tests/upload.test.ts > POST /api/student/resume/upload > accepts a file whose bytes match the declared PDF type +Failed to parse PDF using pdf-parse, falling back to UTF-8 decoding: InvalidPDFException: Invalid PDF structure. + at getException (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/pdf-parse/dist/pdf-parse/esm/Exception.js:197:24) + at PDFParse.load (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/pdf-parse/dist/pdf-parse/esm/PDFParse.js:159:19) + at processTicksAndRejections (node:internal/process/task_queues:103:5) + at PDFParse.getText (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/pdf-parse/dist/pdf-parse/esm/PDFParse.js:122:21) + at extractTextFromBuffer (/home/atulupadhyay/Contribution/commitpulse/lib/resume-parser.ts:144:24) + at parseResume (/home/atulupadhyay/Contribution/commitpulse/lib/resume-parser.ts:205:19) + at Module.POST (/home/atulupadhyay/Contribution/commitpulse/app/api/student/resume/upload/route.ts:76:20) + at /home/atulupadhyay/Contribution/commitpulse/app/api/student/resume/tests/upload.test.ts:79:22 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:1903:20 { + [cause]: Error: + at BaseExceptionClosure (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/pdfjs-dist/legacy/build/pdf.mjs:6418:29) + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/pdfjs-dist/legacy/build/pdf.mjs:6421:2 + at ModuleJob.run (node:internal/modules/esm/module_job:343:25) + at processTicksAndRejections (node:internal/process/task_queues:103:5) + at onImport.tracePromise.__proto__ (node:internal/modules/esm/loader:665:26) + at VitestModuleEvaluator.runExternalModule (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/vitest/dist/module-evaluator.js:80:21) + at VitestModuleRunner.directRequest (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/vite/dist/node/module-runner.js:1222:18) + at VitestModuleRunner.cachedRequest (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/vite/dist/node/module-runner.js:1166:73) + at extractTextFromBuffer (/home/atulupadhyay/Contribution/commitpulse/lib/resume-parser.ts:141:30) + at parseResume (/home/atulupadhyay/Contribution/commitpulse/lib/resume-parser.ts:205:19) { + message: 'Invalid PDF structure.', + name: 'InvalidPDFException' + } +} + + ✓ app/api/student/resume/tests/upload.test.ts (5 tests) 1299ms + ✓ accepts a file whose bytes match the declared PDF type 1210ms + ✓ app/template.accessibility.test.tsx (5 tests) 1014ms + ✓ Case 1: exposes structural labeling on the landmark container 833ms + ✓ app/contributors/loading.timezone-boundaries.test.tsx (5 tests) 1633ms + ✓ renders loading elements timezone-agnostically across UTC, EST, IST, and JST 1545ms + ✓ components/dashboard/PRInsights/Highlights.empty-fallback.test.tsx (6 tests) 918ms + ✓ 6. applies correct link href and opens in new tab when data is available 614ms + ✓ app/components/HeroSection.timezone-boundaries.test.tsx (5 tests) 2072ms + ✓ 1. Renders the hero heading consistently when the system clock is normalized to UTC midnight 766ms + ✓ 2. Renders identical contribution stat badges across EST, IST, and JST timezone offsets 411ms + ✓ 5. Remains stable when the system clock crosses a daylight-savings transition boundary 426ms + ✓ app/contributors/ContributorsClient.timezone-boundaries.test.tsx (5 tests) 7583ms + ✓ mocks standard timezone settings (UTC, EST, IST, and JST) correctly 7413ms + ✓ components/dashboard/RadarChart.test.tsx (11 tests) 1234ms + ✓ renders title, labels, and language axis names 528ms + ✓ components/dashboard/LanguageChart.type-compiler.test.tsx (5 tests) 588ms +stderr | app/generator/components/sections/CommitPulseSection.mock-integrations.test.tsx > CommitPulseSection - Asynchronous Service Layer Mocking & Local Cache Stubs > manages value truncation boundaries on hex accent inputs and triggers clear routines safely +An update to CommitPulseSection inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act +An update to CommitPulseSection inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act + + ✓ app/generator/components/sections/CommitPulseSection.mock-integrations.test.tsx (5 tests) 1761ms + ✓ handles successful profile verification queries from the api route cleanly 701ms + ✓ triggers error routing message blocks when endpoint searches return non-existent profile errors 504ms + ✓ dispatches status synchronization callbacks on click interaction triggers 301ms + ✓ app/contributors/ContributorsSearch.accessibility.test.tsx (5 tests) 3553ms + ✓ uses correct accessible label coordinates on search input (aria-label) 1666ms + ✓ ensures interactive elements maintain visible focus outline behaviors 857ms + ✓ renders contributor profile links with correct heading hierarchy 759ms + ✓ app/contributors/ContributorsClient.accessibility.test.tsx (5 tests) 3280ms + ✓ renders accessible heading content for screen readers 2816ms + ✓ components/BrandParticles.timezone-boundaries.test.tsx (5 tests) 2893ms + ✓ renders successfully across multiple timezone offsets (UTC, EST, IST, JST) 2278ms + ✓ components/dashboard/RepositoryGraph.mouse-interactivity.test.tsx (5 tests) 745ms + ✓ clicking an active filter button toggles it to inactive and removes its background colour 484ms + ✓ components/dashboard/DashboardClient.mock-integrations.test.tsx (5 tests) 2234ms + ✓ renders ProfileCard 875ms + ✓ renders Achievements 535ms + ✓ components/dashboard/ProfileOptimizerModal.test.tsx (5 tests) 725ms + ✓ calls onClose when close button is clicked 433ms + ✓ components/dashboard/ResumePreviewForm.type-compiler.test.tsx (5 tests) 1119ms + ✓ renders all parsed fields correctly with valid prop schema 479ms + ✓ components/dashboard/HistoricalTrendView.empty-fallback.test.tsx (5 tests) 1770ms + ✓ renders the period label and navigation controls even with no activity data 1097ms + ✓ app/not-found.theme-contrast.test.tsx (5 tests) 1282ms + ✓ renders correctly in both light and dark theme environments 1011ms +stderr | components/dashboard/DashboardClient.responsive-breakpoints.test.tsx > DashboardClient Responsive Multi-device Columns & Mobile Viewport Layouts > root container has p-4 md:p-6 lg:p-8 classes for fluid responsive scaling padding +Received `true` for a non-boolean attribute `layout`. + +If you want to write it to the DOM, pass a string instead: layout="true" or layout={value.toString()}. + +stderr | app/components/FeatureCard.responsive-breakpoint.test.tsx > FeatureCard Responsive Breakpoints & Mobile Viewport Layouts > 1. renders the feature card with article semantics and accessible labels +React does not recognize the `whileHover` prop on a DOM element. If you intentionally want it to appear in the DOM as a custom attribute, spell it as lowercase `whilehover` instead. If you accidentally passed it from a parent component, remove it from the DOM element. + + ✓ app/components/FeatureCard.responsive-breakpoint.test.tsx (5 tests) 2091ms + ✓ 1. renders the feature card with article semantics and accessible labels 1619ms +stderr | app/customize/components/ThemeSelector.error-resilience.test.tsx > ThemeSelector Resilience > should catch crashes in children via Error Boundary +Error: Crash + at CrashingChild (/home/atulupadhyay/Contribution/commitpulse/app/customize/components/ThemeSelector.error-resilience.test.tsx:81:13) + at Object.react_stack_bottom_frame (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:25904:20) + at renderWithHooks (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:7662:22) + at updateFunctionComponent (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:10166:19) + at beginWork (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:11778:18) + at runWithFiberInDEV (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:874:13) + at performUnitOfWork (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:17641:22) + at workLoopSync (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:17469:41) + at renderRootSync (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:17450:11) + at performWorkOnRoot (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:16583:35) { + [stack]: [Getter/Setter], + [message]: 'Crash' +} + +The above error occurred in the <CrashingChild> component. + +React will try to recreate this component tree from scratch using the error boundary you provided, TestErrorBoundary. + + + ✓ app/customize/components/ThemeSelector.error-resilience.test.tsx (4 tests) 1926ms + ✓ should render successfully with a valid theme 1814ms + ✓ components/KeyboardShortcutsModal.accessibility.test.tsx (10 tests) 940ms + ✓ renders with role="dialog" and aria-modal="true" when open 468ms + ✓ components/dashboard/DashboardClient.responsive-breakpoints.test.tsx (5 tests) 1111ms + ✓ root container has p-4 md:p-6 lg:p-8 classes for fluid responsive scaling padding 449ms + ✓ app/components/HeroSection.mouse-interactivity.test.tsx (5 tests) 1561ms + ✓ applies hover styling to the Copy Link button 980ms + ✓ app/documentation/code-block.test.tsx (5 tests) 1467ms + ✓ renders the code prop inside a code element 406ms + ✓ renders the copy button with the correct label 484ms +stderr | components/dashboard/GrowthTrendChart.error-resilience.test.tsx > GrowthTrendChart Error Resilience > renders fallback UI on runtime exceptions +Error: Simulated runtime failure + at CrashComponent (/home/atulupadhyay/Contribution/commitpulse/components/dashboard/GrowthTrendChart.error-resilience.test.tsx:125:13) + at Object.react_stack_bottom_frame (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:25904:20) + at renderWithHooks (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:7662:22) + at updateFunctionComponent (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:10166:19) + at beginWork (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:11778:18) + at runWithFiberInDEV (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:874:13) + at performUnitOfWork (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:17641:22) + at workLoopSync (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:17469:41) + at renderRootSync (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:17450:11) + at performWorkOnRoot (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:16583:35) { + [stack]: [Getter/Setter], + [message]: 'Simulated runtime failure' +} + +The above error occurred in the <CrashComponent> component. + +React will try to recreate this component tree from scratch using the error boundary you provided, TestErrorBoundary. + +Error: Simulated runtime failure + at CrashComponent (/home/atulupadhyay/Contribution/commitpulse/components/dashboard/GrowthTrendChart.error-resilience.test.tsx:125:13) + at Object.react_stack_bottom_frame (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:25904:20) + at renderWithHooks (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:7662:22) + at updateFunctionComponent (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:10166:19) + at beginWork (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:11778:18) + at runWithFiberInDEV (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:874:13) + at performUnitOfWork (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:17641:22) + at workLoopSync (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:17469:41) + at renderRootSync (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:17450:11) + at performWorkOnRoot (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:16583:35) + +stderr | app/generator/components/sections/CommitPulseSection.mouse-interactivity.test.tsx > CommitPulseSection - Interactive Tooltips, Cursor Hovers & Touch Event Propagation > handles user context clear button clicks to wipe data entry inputs cleanly +An update to CommitPulseSection inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act +An update to CommitPulseSection inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act + + ✓ app/generator/components/sections/CommitPulseSection.mouse-interactivity.test.tsx (5 tests) 1719ms + ✓ applies appropriate clickable cursor class modifiers on the main visibility toggle switch 970ms +stderr | components/dashboard/GrowthTrendChart.error-resilience.test.tsx > GrowthTrendChart Error Resilience > provides retry/recovery controls in fallback UI +Error: Unexpected chart rendering failure + at BrokenComponent (/home/atulupadhyay/Contribution/commitpulse/components/dashboard/GrowthTrendChart.error-resilience.test.tsx:157:13) + at Object.react_stack_bottom_frame (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:25904:20) + at renderWithHooks (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:7662:22) + at updateFunctionComponent (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:10166:19) + at beginWork (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:11778:18) + at runWithFiberInDEV (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:874:13) + at performUnitOfWork (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:17641:22) + at workLoopSync (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:17469:41) + at renderRootSync (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:17450:11) + at performWorkOnRoot (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:16583:35) { + [stack]: [Getter/Setter], + [message]: 'Unexpected chart rendering failure' +} + +The above error occurred in the <BrokenComponent> component. + +React will try to recreate this component tree from scratch using the error boundary you provided, TestErrorBoundary. + +Error: Unexpected chart rendering failure + at BrokenComponent (/home/atulupadhyay/Contribution/commitpulse/components/dashboard/GrowthTrendChart.error-resilience.test.tsx:157:13) + at Object.react_stack_bottom_frame (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:25904:20) + at renderWithHooks (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:7662:22) + at updateFunctionComponent (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:10166:19) + at beginWork (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:11778:18) + at runWithFiberInDEV (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:874:13) + at performUnitOfWork (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:17641:22) + at workLoopSync (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:17469:41) + at renderRootSync (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:17450:11) + at performWorkOnRoot (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:16583:35) + + ✓ components/dashboard/GrowthTrendChart.error-resilience.test.tsx (5 tests) 730ms + ✓ provides retry/recovery controls in fallback UI 357ms + ✓ components/dashboard/DashboardSkeleton.mouse-interactivity.test.tsx (5 tests) 436ms + ✓ app/documentation/code-block.mouse-interactivity.test.tsx (5 tests) 944ms + ✓ renders copy button with pointer hover styling 722ms +stderr | components/reviewform.test.tsx > SubmitReviewPage > renders the form correctly +React does not recognize the `whileHover` prop on a DOM element. If you intentionally want it to appear in the DOM as a custom attribute, spell it as lowercase `whilehover` instead. If you accidentally passed it from a parent component, remove it from the DOM element. +React does not recognize the `whileTap` prop on a DOM element. If you intentionally want it to appear in the DOM as a custom attribute, spell it as lowercase `whiletap` instead. If you accidentally passed it from a parent component, remove it from the DOM element. + + ✓ app/customize/components/ThemeSelector.responsive-breakpoints.test.tsx (5 tests) 1173ms + ✓ renders correctly on a mobile viewport (375px) 794ms + ✓ components/reviewform.test.tsx (6 tests) 2272ms + ✓ renders the form correctly 988ms + ✓ shows validation error for empty name 414ms + ✓ shows validation error for invalid handle 316ms + ✓ app/components/theme-switch.timezone-boundaries.test.tsx (5 tests) 2088ms + ✓ renders theme toggle button successfully in UTC timezone 1408ms + ✓ app/generator/components/sections/NameSection.accessibility.test.tsx (5 tests) 2098ms + ✓ renders the section toggle button with accessible name 1556ms + ✓ supports keyboard tab navigation to interactive elements 340ms +stderr | components/dashboard/PRInsights/PRTrendChart.theme-contrast.test.tsx > PRTrendChart Theme Contrast and Visual Cohesion > 1. should emulate both dark and light presets +The tag <stop> is unrecognized in this browser. If you meant to render a React component, start its name with an uppercase letter. +<linearGradient /> is using incorrect casing. Use PascalCase for React components, or lowercase for HTML elements. +The tag <linearGradient> is unrecognized in this browser. If you meant to render a React component, start its name with an uppercase letter. +The tag <defs> is unrecognized in this browser. If you meant to render a React component, start its name with an uppercase letter. +<linearGradient /> is using incorrect casing. Use PascalCase for React components, or lowercase for HTML elements. + +stderr | components/dashboard/PRInsights/PRTrendChart.theme-contrast.test.tsx > PRTrendChart Theme Contrast and Visual Cohesion > 2. should assert that the visual elements adapt color styling properly for both settings +<linearGradient /> is using incorrect casing. Use PascalCase for React components, or lowercase for HTML elements. + + ✓ app/not-found.empty-fallback.test.tsx (5 tests) 1854ms + ✓ renders successfully with default empty layout state and correct header 1610ms + ✓ components/dashboard/CommitClock.responsive-breakpoints.test.tsx (5 tests) 830ms + ✓ mounts cleanly without side-effects inside a narrow 375px mobile display canvas 506ms +stderr | components/dashboard/PRInsights/PRTrendChart.theme-contrast.test.tsx > PRTrendChart Theme Contrast and Visual Cohesion > 3. should verify contrast ratio standards are satisfied for all textual elements +<linearGradient /> is using incorrect casing. Use PascalCase for React components, or lowercase for HTML elements. + +stderr | components/dashboard/PRInsights/PRTrendChart.theme-contrast.test.tsx > PRTrendChart Theme Contrast and Visual Cohesion > 4. should check that specific custom stylesheet properties or Tailwind classes are active in the markup +<linearGradient /> is using incorrect casing. Use PascalCase for React components, or lowercase for HTML elements. + +stderr | components/dashboard/PRInsights/PRTrendChart.theme-contrast.test.tsx > PRTrendChart Theme Contrast and Visual Cohesion > 5. should ensure that background overlays do not clip foreground content colors +<linearGradient /> is using incorrect casing. Use PascalCase for React components, or lowercase for HTML elements. + + ✓ components/dashboard/PRInsights/PRTrendChart.theme-contrast.test.tsx (5 tests) 1318ms + ✓ 1. should emulate both dark and light presets 472ms + ✓ 3. should verify contrast ratio standards are satisfied for all textual elements 756ms + ✓ components/InteractiveViewer.theme-contrast.test.tsx (5 tests) 1625ms + ✓ renders correctly in dark prefers-color-scheme environments 1125ms + ✓ app/generator/components/SectionCard.mouse-interactivity.test.tsx (5 tests) 2529ms + ✓ 1. toggles content when header is clicked 1282ms + ✓ 4. supports repeated click interactions 418ms + ✓ 5. preserves content after hover and click events 360ms + ✓ components/dashboard/RefreshButton.error-resilience.test.tsx (5 tests) 580ms + ✓ mounts cleanly without hydration errors when all hooks return baseline values 444ms + ✓ app/generator/components/PreviewPanel.theme-contrast.test.tsx (5 tests) 338ms + ✓ components/dashboard/AIInsights.mouse-interactivity.test.tsx (8 tests) 1980ms + ✓ renders all insights with interactive group class for hover state management 775ms + ✓ handles click events on insight cards and propagates without stopping propagation 551ms + ✓ preserves accessibility and DOM structure during mouseenter/mouseleave interactions 358ms + ✓ app/components/navbar.accessibility.test.tsx (6 tests) 1337ms + ✓ renders header and navigation landmarks for screen reader navigation 795ms + ✓ app/not-found.test.tsx (5 tests) 1047ms + ✓ renders without crashing 356ms + ✓ renders go back home link with root href 454ms + ✓ hooks/useRecentSearches.responsive-breakpoints.test.ts (5 tests) 1213ms + ✓ scales navigation and preserves max searches 948ms + ✓ app/template.error-resilience.test.tsx (5 tests) 1333ms + ✓ Test 1: Hydration Stability - renders valid children without crashing 378ms + ✓ Test 5: Reset/Reload Paths - ensures user reset/reload paths are available on recovery panels and functioning 592ms + ✓ app/generator/components/sections/SocialSection.mouse-interactivity.test.tsx (5 tests) 1636ms + ✓ allows hovering interactive platform buttons without errors 708ms + ✓ mouse leave does not remove the interactive element 354ms + ✓ components/dashboard/LanguageChart.theme-contrast.test.tsx (5 tests) 411ms + ✓ components/FeatureCards.empty-fallback.test.tsx (5 tests) 532ms + ✓ renders FeatureCard with default props 451ms + ✓ app/components/navbar.theme-contrast.test.tsx (5 tests) 2674ms + ✓ renders navbar in light mode 1484ms + ✓ keeps theme toggle accessible in both themes 533ms + ✓ app/components/CustomizeCTA.responsive-breakpoints.test.tsx (5 tests) 935ms + ✓ renders successfully 639ms + ✓ app/components/CopyRepoButton.accessibility.test.tsx (5 tests) 1468ms + ✓ renders as an accessible button with visible label 988ms + ✓ app/customize/components/ExportPanel.empty-fallback.test.tsx (5 tests) 1983ms + ✓ renders safely when username is empty and username-dependent features are unavailable 501ms + ✓ keeps copy action disabled when username is missing 1019ms + ✓ app/components/navbar.empty-fallback.test.tsx (5 tests) 1486ms + ✓ Case 1: renders target component with default empty/unconfigured parameters 1139ms + ✓ components/dashboard/PRInsights/RepoPerformanceTable.timezone-boundaries.test.tsx (5 tests) 1551ms + ✓ 1. mocks UTC, EST, IST, and JST timezone buckets in rendered repo rows 506ms + ✓ 3. parses leap-year boundaries without leaving gaps in rendered grid rows 806ms +stderr | components/dashboard/ComparisonStatsCard.accessibility.test.tsx > ComparisonStatsCard — Accessibility & Screen Reader Compliance > renders card as a named region landmark with correct aria-label +React does not recognize the `whileInView` prop on a DOM element. If you intentionally want it to appear in the DOM as a custom attribute, spell it as lowercase `whileinview` instead. If you accidentally passed it from a parent component, remove it from the DOM element. +React does not recognize the `whileHover` prop on a DOM element. If you intentionally want it to appear in the DOM as a custom attribute, spell it as lowercase `whilehover` instead. If you accidentally passed it from a parent component, remove it from the DOM element. + + ✓ components/dashboard/ComparisonStatsCard.accessibility.test.tsx (5 tests) 1695ms + ✓ renders card as a named region landmark with correct aria-label 1366ms + ✓ app/generator/components/PreviewPanel.timezone-boundaries.test.tsx (5 tests) 1235ms + ✓ 1. preserves UTC timestamps in preview mode 555ms + ✓ components/dashboard/GoalTracker.test.tsx (4 tests) 1308ms + ✓ switches to editing state and saves new goals to localStorage 810ms + ✓ components/dashboard/DeploymentTracker.empty-fallback.test.tsx (11 tests) 814ms + ✓ handles an empty repoName gracefully (renders an empty but present link) 589ms +stderr | components/dashboard/PRInsights/TopMetricsRow.responsive-breakpoints.test.tsx > TopMetricsRow responsive multi-device columns & mobile viewport layouts (Variation 7) > reflows into a single-column vertical layout on mobile-width viewports +React does not recognize the `whileHover` prop on a DOM element. If you intentionally want it to appear in the DOM as a custom attribute, spell it as lowercase `whilehover` instead. If you accidentally passed it from a parent component, remove it from the DOM element. +Unknown event handler property `onHoverStart`. It will be ignored. +Unknown event handler property `onHoverEnd`. It will be ignored. + + ✓ components/dashboard/PRInsights/TopMetricsRow.responsive-breakpoints.test.tsx (5 tests) 641ms + ✓ components/dashboard/DashboardClient.theme-contrast.test.tsx (5 tests) 1142ms + ✓ root element exists and is visible 550ms +stderr | app/customize/components/AdvancedSettingsPanel.error-resilience.test.tsx > AdvancedSettingsPanel Error Resilience > should isolate crashes when a child component throws an unexpected runtime exception +Error: Unexpected runtime exception or database connectivity error + at /home/atulupadhyay/Contribution/commitpulse/app/customize/components/AdvancedSettingsPanel.error-resilience.test.tsx:104:13 + at StyledSelect (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/spy/dist/index.js:332:34) + at Object.react_stack_bottom_frame (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:25904:20) + at renderWithHooks (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:7662:22) + at updateFunctionComponent (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:10166:19) + at beginWork (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:11778:18) + at runWithFiberInDEV (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:874:13) + at performUnitOfWork (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:17641:22) + at workLoopSync (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:17469:41) + at renderRootSync (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:17450:11) { + [stack]: [Getter/Setter], + [message]: 'Unexpected runtime exception or database connectivity error' +} + +The above error occurred in the <StyledSelect> component. + +React will try to recreate this component tree from scratch using the error boundary you provided, TestingErrorBoundary. + + +stderr | app/customize/components/AdvancedSettingsPanel.error-resilience.test.tsx > AdvancedSettingsPanel Error Resilience > should render a clean error recovery UI instead of hard-crashing the application +Error: Database connection failed + at /home/atulupadhyay/Contribution/commitpulse/app/customize/components/AdvancedSettingsPanel.error-resilience.test.tsx:119:13 + at StyledSelect (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/spy/dist/index.js:332:34) + at Object.react_stack_bottom_frame (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:25904:20) + at renderWithHooks (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:7662:22) + at updateFunctionComponent (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:10166:19) + at beginWork (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:11778:18) + at runWithFiberInDEV (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:874:13) + at performUnitOfWork (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:17641:22) + at workLoopSync (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:17469:41) + at renderRootSync (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:17450:11) { + [stack]: [Getter/Setter], + [message]: 'Database connection failed' +} + +The above error occurred in the <StyledSelect> component. + +React will try to recreate this component tree from scratch using the error boundary you provided, TestingErrorBoundary. + + +stderr | app/customize/components/AdvancedSettingsPanel.error-resilience.test.tsx > AdvancedSettingsPanel Error Resilience > should log the caught runtime exception to the dev-telemetry trackers +Error: Telemetry tracked crash condition + at /home/atulupadhyay/Contribution/commitpulse/app/customize/components/AdvancedSettingsPanel.error-resilience.test.tsx:148:20 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:302:11 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:1903:26 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2326:20 + at new Promise (<anonymous>) + at runWithCancel (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2323:10) + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2305:20 + at new Promise (<anonymous>) + at runWithTimeout (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2272:10) + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2955:64 { + [stack]: [Getter/Setter], + [message]: 'Telemetry tracked crash condition' +} + +The above error occurred in the <StyledSelect> component. + +React will try to recreate this component tree from scratch using the error boundary you provided, TestingErrorBoundary. + + +stderr | app/customize/components/AdvancedSettingsPanel.error-resilience.test.tsx > AdvancedSettingsPanel Error Resilience > should provide an interactive recovery path or reload button to reset the UI state +Error: Crash for recovery path check + at /home/atulupadhyay/Contribution/commitpulse/app/customize/components/AdvancedSettingsPanel.error-resilience.test.tsx:153:13 + at StyledSelect (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/spy/dist/index.js:332:34) + at Object.react_stack_bottom_frame (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:25904:20) + at renderWithHooks (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:7662:22) + at updateFunctionComponent (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:10166:19) + at beginWork (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:11778:18) + at runWithFiberInDEV (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:874:13) + at performUnitOfWork (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:17641:22) + at workLoopSync (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:17469:41) + at renderRootSync (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:17450:11) { + [stack]: [Getter/Setter], + [message]: 'Crash for recovery path check' +} + +The above error occurred in the <StyledSelect> component. + +React will try to recreate this component tree from scratch using the error boundary you provided, TestingErrorBoundary. + + + ✓ app/customize/components/AdvancedSettingsPanel.error-resilience.test.tsx (5 tests) 1317ms + ✓ should maintain stability and render safely during initial server/client mismatch states 844ms + ✓ should provide an interactive recovery path or reload button to reset the UI state 304ms + ✓ app/components/CustomizeCTA.theme-contrast.test.tsx (5 tests) 1623ms + ✓ applies light and dark text classes to the heading 1317ms + ✓ app/generator/components/CompletionScorePanel.test.tsx (7 tests) 2450ms + ✓ renders with 0% score and Beginner level when state is completely empty 941ms + ✓ renders with correct score when name is added (+15%) 388ms + ✓ renders with correct score and Growing level when description is also added (+15 + 20 = 35%) 388ms + ✓ app/components/HeroSection.accessibility.test.tsx (5 tests) 2197ms + ✓ renders primary h1 heading with correct text for screen reader hierarchy 907ms + ✓ renders username input with aria-label for screen reader announcement 420ms + ✓ renders both buttons with meaningful visible text for screen readers 519ms + ✓ app/components/SuccessGuide.accessibility.test.tsx (5 tests) 2655ms + ✓ renders as a named region landmark linked to h2 via aria-labelledby 2143ms + ✓ app/api/wrapped/route.mouse-interactivity.test.tsx (5 tests) 3381ms + ✓ 1. triggers simulated mouseenter/hover gestures on active segments 1753ms + ✓ 2. verifies that responsive tooltip layouts display at computed coordinates 439ms + ✓ 4. asserts appropriate cursor style classes (like pointer) are applied on hover 344ms + ✓ 5. checks that mouseleave events successfully hide temporary overlay visuals 527ms +stderr | app/(root)/dashboard/error.theme-contrast.test.tsx > DashboardError Theme Contrast > renders correctly in light mode +Error: test error + at /home/atulupadhyay/Contribution/commitpulse/app/(root)/dashboard/error.theme-contrast.test.tsx:26:35 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:302:11 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:1903:26 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2326:20 + at new Promise (<anonymous>) + at runWithCancel (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2323:10) + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2305:20 + at new Promise (<anonymous>) + at runWithTimeout (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2272:10) + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2955:64 +[ERROR] Dashboard error {"error":{}} + +stderr | app/(root)/dashboard/error.theme-contrast.test.tsx > DashboardError Theme Contrast > renders correctly in dark mode +Error: test error + at /home/atulupadhyay/Contribution/commitpulse/app/(root)/dashboard/error.theme-contrast.test.tsx:34:35 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:302:11 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:1903:26 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2326:20 + at new Promise (<anonymous>) + at runWithCancel (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2323:10) + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2305:20 + at new Promise (<anonymous>) + at runWithTimeout (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2272:10) + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2955:64 +[ERROR] Dashboard error {"error":{}} + +stderr | app/(root)/dashboard/error.theme-contrast.test.tsx > DashboardError Theme Contrast > contains light and dark theme container classes +Error: test error + at /home/atulupadhyay/Contribution/commitpulse/app/(root)/dashboard/error.theme-contrast.test.tsx:41:30 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:302:11 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:1903:26 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2326:20 + at new Promise (<anonymous>) + at runWithCancel (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2323:10) + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2305:20 + at new Promise (<anonymous>) + at runWithTimeout (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2272:10) + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2955:64 +[ERROR] Dashboard error {"error":{}} + +stderr | app/(root)/dashboard/error.theme-contrast.test.tsx > DashboardError Theme Contrast > contains contrast-aware heading and description text classes +Error: test error + at /home/atulupadhyay/Contribution/commitpulse/app/(root)/dashboard/error.theme-contrast.test.tsx:54:30 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:302:11 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:1903:26 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2326:20 + at new Promise (<anonymous>) + at runWithCancel (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2323:10) + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2305:20 + at new Promise (<anonymous>) + at runWithTimeout (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2272:10) + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2955:64 +[ERROR] Dashboard error {"error":{}} + +stderr | components/dashboard/CommitClock.timezone-boundaries.test.tsx > CommitClock - Timezone Normalization & Calendar Data Boundary Alignment > aligns commit data to correct calendar dates in UTC timezone +React does not recognize the `whileInView` prop on a DOM element. If you intentionally want it to appear in the DOM as a custom attribute, spell it as lowercase `whileinview` instead. If you accidentally passed it from a parent component, remove it from the DOM element. + +stderr | app/(root)/dashboard/error.theme-contrast.test.tsx > DashboardError Theme Contrast > preserves button contrast classes across themes +Error: test error + at /home/atulupadhyay/Contribution/commitpulse/app/(root)/dashboard/error.theme-contrast.test.tsx:70:35 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:302:11 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:1903:26 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2326:20 + at new Promise (<anonymous>) + at runWithCancel (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2323:10) + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2305:20 + at new Promise (<anonymous>) + at runWithTimeout (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2272:10) + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2955:64 +[ERROR] Dashboard error {"error":{}} + + ✓ app/(root)/dashboard/error.theme-contrast.test.tsx (5 tests) 1538ms + ✓ renders correctly in light mode 763ms + ✓ preserves button contrast classes across themes 446ms + ✓ components/dashboard/CommitClock.timezone-boundaries.test.tsx (10 tests) 1080ms + ✓ components/dashboard/RepositoryGraph.timezone-boundaries.test.tsx (5 tests) 959ms + ✓ renders consistently under UTC timezone assumptions 819ms + ✓ components/dashboard/ResumePreviewForm.responsive-breakpoints.test.tsx (5 tests) 2352ms + ✓ renders correctly on mobile viewport 851ms + ✓ allows adding skills on mobile viewport 1338ms + ✓ components/dashboard/DashboardSkeleton.error-resilience.test.tsx (5 tests) 639ms + ✓ error boundary catches a thrown exception from AIInsightsSkeleton and exposes the reload path 432ms + ✓ app/customize/components/ExportPanel.error-resilience.test.tsx (5 tests) 1350ms + ✓ handleDownloadBadge: recovers cleanly and surfaces a toast when fetch is rejected (network failure) 713ms +stderr | components/dashboard/Heatmap.timezone-boundaries.test.tsx > renders leap day contribution correctly +React does not recognize the `whileInView` prop on a DOM element. If you intentionally want it to appear in the DOM as a custom attribute, spell it as lowercase `whileinview` instead. If you accidentally passed it from a parent component, remove it from the DOM element. + + ✓ components/dashboard/PRInsights/ReviewAnalytics.error-resilience.test.tsx (5 tests) 1161ms + ✓ Test 3: renders clean error recovery UI with role="alert" when analytics throws 466ms + ✓ Test 5: reload button restores widget content after a simulated runtime failure 407ms + ✓ components/dashboard/Heatmap.timezone-boundaries.test.tsx (6 tests) 1596ms + ✓ shows active streak across calendar boundaries 1225ms + ✓ app/components/Footer.error-resilience.test.tsx (5 tests) 1166ms + ✓ maintains hydration stability and renders without crashing under normal conditions 362ms + ✓ does not crash when the translation service returns undefined for all keys — t() is called for every label in Footer.tsx 552ms + ✓ components/BrandParticles.error-resilience.test.tsx (5 tests) 742ms + ✓ renders without crashing after hydration 383ms + ✓ app/components/theme-switch.responsive-breakpoints.test.tsx (5 tests) 620ms + ✓ renders correctly on a standard 375px mobile viewport 383ms + ✓ components/KonamiEasterEgg.empty-fallback.test.tsx (5 tests) 827ms + ✓ 1. renders safely with empty arrays when matrix and confetti counts are set to 0 662ms +stderr | app/(root)/dashboard/error.empty-fallback.test.tsx > Dashboard Error Page - Empty & Missing Input Fallbacks > renders successfully when error is null +[ERROR] Dashboard error {"error":null} + +stderr | app/(root)/dashboard/error.empty-fallback.test.tsx > Dashboard Error Page - Empty & Missing Input Fallbacks > renders successfully when error is undefined +[ERROR] Dashboard error {} + +stderr | app/(root)/dashboard/error.empty-fallback.test.tsx > Dashboard Error Page - Empty & Missing Input Fallbacks > renders successfully when error is an empty object +{} +[ERROR] Dashboard error {"error":{}} + +stderr | app/(root)/dashboard/error.empty-fallback.test.tsx > Dashboard Error Page - Empty & Missing Input Fallbacks > renders successfully when error has no message property +{ name: 'CustomError' } +[ERROR] Dashboard error {"error":{"name":"CustomError"}} + +stderr | app/(root)/dashboard/error.empty-fallback.test.tsx > Dashboard Error Page - Empty & Missing Input Fallbacks > renders successfully when error message is an empty string +Error: + at /home/atulupadhyay/Contribution/commitpulse/app/(root)/dashboard/error.empty-fallback.test.tsx:64:48 + at Proxy.assertThrows (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/chai/index.js:2798:5) + at Proxy.methodWrapper (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/chai/index.js:1700:25) + at Proxy.<anonymous> (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/expect/dist/index.js:1216:12) + at Proxy.overwritingMethodWrapper (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/chai/index.js:1750:33) + at Proxy.<anonymous> (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/expect/dist/index.js:1552:16) + at Proxy.<anonymous> (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/expect/dist/index.js:1156:15) + at Proxy.methodWrapper (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/chai/index.js:1700:25) + at /home/atulupadhyay/Contribution/commitpulse/app/(root)/dashboard/error.empty-fallback.test.tsx:64:88 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:302:11 +[ERROR] Dashboard error {"error":{}} + +stderr | app/(root)/dashboard/error.empty-fallback.test.tsx > Dashboard Error Page - Empty & Missing Input Fallbacks > renders without errors when the optional digest field is absent +Error: Unexpected failure + at /home/atulupadhyay/Contribution/commitpulse/app/(root)/dashboard/error.empty-fallback.test.tsx:73:19 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:302:11 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:1903:26 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2326:20 + at new Promise (<anonymous>) + at runWithCancel (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2323:10) + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2305:20 + at new Promise (<anonymous>) + at runWithTimeout (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2272:10) + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2955:64 +[ERROR] Dashboard error {"error":{}} + +stderr | app/(root)/dashboard/error.empty-fallback.test.tsx > Dashboard Error Page - Empty & Missing Input Fallbacks > renders interactive elements correctly in fallback state +{} +[ERROR] Dashboard error {"error":{}} + + ✓ app/(root)/dashboard/error.empty-fallback.test.tsx (7 tests) 743ms + ✓ renders successfully when error is null 465ms +stderr | components/dashboard/ProfileCard.responsive-breakpoints.test.tsx > ProfileCard — content presence under a mocked 375 px matchMedia environment > renders name, username and bio when matchMedia reports a 375 px viewport +React does not recognize the `whileHover` prop on a DOM element. If you intentionally want it to appear in the DOM as a custom attribute, spell it as lowercase `whilehover` instead. If you accidentally passed it from a parent component, remove it from the DOM element. +React does not recognize the `whileTap` prop on a DOM element. If you intentionally want it to appear in the DOM as a custom attribute, spell it as lowercase `whiletap` instead. If you accidentally passed it from a parent component, remove it from the DOM element. + + ✓ components/dashboard/ShareSheet.empty-fallback.test.tsx (5 tests) 2369ms + ✓ renders without crashing when exportData contains empty arrays 536ms + ✓ checks key DOM structures to make sure core markers exist even without populated data 1172ms + ✓ components/dashboard/ProfileCard.responsive-breakpoints.test.tsx (5 tests) 1611ms + ✓ renders name, username and bio when matchMedia reports a 375 px viewport 456ms + ✓ share button opens the ShareSheet when clicked 742ms + ✓ app/contributors/loading.mouse-interactivity.test.tsx (15 tests) 1194ms + ✓ renders exactly one status landmark 586ms + ✓ app/reviewform/page.test.tsx (2 tests) 1218ms + ✓ renders the testimonial submission form 1049ms + ✓ components/dashboard/VisualizationTooltip.accessibility.test.tsx (5 tests) 933ms + ✓ 1. checks for correct use of accessible role and semantic coordinates 729ms + ✓ app/generator/components/sections/SocialsSection.theme-contrast.test.tsx (5 tests) 1609ms + ✓ renders correctly in light theme with proper structure 305ms + ✓ ensures text remains visible in light mode (contrast proxy check) 974ms + ✓ components/InteractiveViewer.mouse-interactivity.test.tsx (5 tests) 1653ms + ✓ 1. shows tooltip while hovering interactive tower 1005ms + ✓ components/dashboard/PRInsights/ReviewAnalytics.mock-integrations.test.tsx (5 tests) 750ms + ✓ 2. tests service loading paths to ensure pending state overlays render 701ms + ✓ components/dashboard/PRInsights/Highlights.timezone-boundaries.test.tsx (5 tests) 861ms + ✓ renders PR links with correct href across different timezone contexts 501ms + ✓ components/dashboard/DeploymentTracker.response-breakpoints.test.tsx (8 tests) 2039ms + ✓ repo name has truncate + min-w-0 on its wrapper so long names clip instead of breaking layout 1519ms + ✓ components/dashboard/GrowthTrendChart.test.tsx (14 tests) 909ms + ✓ app/contributors/ContributorsClient.theme-contrast.test.tsx (5 tests) 1069ms + ✓ renders CTA buttons with readable foreground and background contrast 611ms + ✓ app/components/navbar.error-resilience.test.tsx (4 tests) 1874ms + ✓ renders a static, non-interactive language placeholder before mount, to avoid a hydration mismatch 1057ms + ✓ renders the real interactive language selector after the mount timer resolves 365ms +stderr | app/layout.accessibility.test.tsx > Layout Accessibility Standards & Screen Reader Compliance > Case 1: renders children content inside the layout structure +In HTML, <html> cannot be a child of <div>. +This will cause a hydration error. + + ✓ app/layout.accessibility.test.tsx (5 tests) 966ms + ✓ Case 1: renders children content inside the layout structure 417ms + ✓ Case 2: exposes a semantic navigation landmark 375ms + ✓ components/KeyboardShortcutsModal.mouse-interactivity.test.tsx (7 tests) 1560ms + ✓ calls onClose when the ✕ close button is clicked 980ms + ✓ components/dashboard/ContributionReplay.test.tsx (7 tests) 1660ms + ✓ renders the header title and description 669ms + ✓ toggles play/pause state and correctly accumulates commits on tick 400ms + ✓ components/dashboard/RefreshButton.mouse-interactivity.test.tsx (5 tests) 2397ms + ✓ renders tooltip title attribute for hover tooltip display 2001ms +stderr | components/dashboard/PRInsights/PRStatusDistribution.accessibility.test.tsx > PRStatusDistribution Accessibility Standards & Screen Reader Aria Compliance > inspects markup for correct use of accessible label coordinates and roles +React does not recognize the `innerRadius` prop on a DOM element. If you intentionally want it to appear in the DOM as a custom attribute, spell it as lowercase `innerradius` instead. If you accidentally passed it from a parent component, remove it from the DOM element. +React does not recognize the `outerRadius` prop on a DOM element. If you intentionally want it to appear in the DOM as a custom attribute, spell it as lowercase `outerradius` instead. If you accidentally passed it from a parent component, remove it from the DOM element. +React does not recognize the `paddingAngle` prop on a DOM element. If you intentionally want it to appear in the DOM as a custom attribute, spell it as lowercase `paddingangle` instead. If you accidentally passed it from a parent component, remove it from the DOM element. +React does not recognize the `dataKey` prop on a DOM element. If you intentionally want it to appear in the DOM as a custom attribute, spell it as lowercase `datakey` instead. If you accidentally passed it from a parent component, remove it from the DOM element. +React does not recognize the `contentStyle` prop on a DOM element. If you intentionally want it to appear in the DOM as a custom attribute, spell it as lowercase `contentstyle` instead. If you accidentally passed it from a parent component, remove it from the DOM element. +React does not recognize the `itemStyle` prop on a DOM element. If you intentionally want it to appear in the DOM as a custom attribute, spell it as lowercase `itemstyle` instead. If you accidentally passed it from a parent component, remove it from the DOM element. + + ✓ components/dashboard/PRInsights/PRStatusDistribution.accessibility.test.tsx (5 tests) 1229ms + ✓ inspects markup for correct use of accessible label coordinates and roles 744ms + ✓ app/contributors/ContributorsSearch.mock-integrations.test.tsx (5 tests) 1929ms + ✓ mocks standard asynchronous imports and databases using stubs 1200ms + ✓ tests service loading paths to ensure pending state overlays render 346ms + ✓ components/dashboard/ResumeUpload.mock-integrations.test.tsx (5 tests) 1747ms + ✓ verifies that successful async upload transitions states correctly 894ms + ✓ components/dashboard/ActivityLandscape.theme-contrast.test.tsx (5 tests) 1239ms + ✓ renders successfully in light theme 955ms + ✓ components/dashboard/VisualizationTooltip.theme-contrast.test.tsx (5 tests) 1294ms + ✓ applies paired light/dark background and border contrast classes on the tooltip root 1036ms + ✓ app/not-found.responsive-breakpoints.test.tsx (5 tests) 953ms + ✓ Check that navigation components scale down gracefully 535ms + ✓ components/Leaderboard.timezone-boundaries.test.tsx (5 tests) 1047ms + ✓ 1. mocks standard timezone settings (e.g., UTC, EST, IST, and JST) 706ms + ✓ components/dashboard/PopularPinnedRepos.empty-fallback.test.tsx (10 tests) 1208ms + ✓ shows pinned empty-state after switching to pinned when pinnedRepos is empty 801ms + ✓ app/components/CopyRepoButton.error-resilience.test.tsx (5 tests) 1054ms + ✓ renders successfully during initial mount 711ms + ✓ app/(root)/dashboard/error.responsive-breakpoints.test.tsx (5 tests) 1089ms + ✓ Case 1: mocks standard mobile-width media coordinates correctly 778ms + ✓ components/dashboard/DeploymentTracker.theme-contrast.test.tsx (16 tests) 1112ms + ✓ heading text is dark-on-light and light-on-dark 663ms + ✓ components/dashboard/ShareSheet.timezone-boundaries.test.tsx (5 tests) 682ms + ✓ app/components/CustomizeCTA.mock-integrations.test.tsx (5 tests) 1411ms + ✓ renders successfully with mocked services 1275ms +stderr | components/ReturnToTop.accessibility.test.tsx > ReturnToTop Accessibility Standards & Screen Reader Aria Compliance > inspects markup for correct use of accessible label coordinates (role, aria-label, aria-labelledby) +React does not recognize the `whileHover` prop on a DOM element. If you intentionally want it to appear in the DOM as a custom attribute, spell it as lowercase `whilehover` instead. If you accidentally passed it from a parent component, remove it from the DOM element. +React does not recognize the `whileTap` prop on a DOM element. If you intentionally want it to appear in the DOM as a custom attribute, spell it as lowercase `whiletap` instead. If you accidentally passed it from a parent component, remove it from the DOM element. + + ✓ components/dashboard/ResumePreviewForm.test.tsx (5 tests) 1622ms + ✓ renders initial parsed values 312ms + ✓ adds a new skill 955ms + ✓ app/customize/components/ThemeQuickPresets.mock-integration.test.tsx (5 tests) 940ms + ✓ renders only selectable themes 423ms + ✓ renders one button for every selectable theme 392ms + ✓ components/ReturnToTop.accessibility.test.tsx (5 tests) 1898ms + ✓ inspects markup for correct use of accessible label coordinates (role, aria-label, aria-labelledby) 1210ms + ✓ app/components/SuccessGuide.theme-contrast.test.tsx (5 tests) 1584ms + ✓ renders the same fixed dark-themed markup regardless of the active color-scheme preference 319ms + ✓ confirms the decorative background glow overlay is non-interactive and does not clip foreground text 917ms + ✓ app/generator/components/ReadmeInsightsPanel.test.tsx (10 tests) 790ms + ✓ shows up to 4 tips when state is empty 362ms + ✓ components/ScrollToBottom.error-resilience.test.tsx (6 tests) 1255ms + ✓ renders without crashing 476ms + ✓ calls window.scrollTo safely when the button is clicked 674ms + ✓ app/generator/components/sections/DescriptionSection.responsive-breakpoints.test.tsx (5 tests) 1307ms + ✓ asserts that columns reflow into standard vertical flex lists 921ms + ✓ app/api/student/resume/upload/route.mouse-interactivity.test.tsx (5 tests) 879ms + ✓ 1. triggers simulated mouseenter/hover gestures on active segments 528ms +stderr | components/dashboard/CommitClock.accessibility.test.tsx > CommitClock - Accessibility & Screen Reader Aria Compliance > exposes each weekday group as an img role with a descriptive aria-label +React does not recognize the `whileInView` prop on a DOM element. If you intentionally want it to appear in the DOM as a custom attribute, spell it as lowercase `whileinview` instead. If you accidentally passed it from a parent component, remove it from the DOM element. + + ✓ components/InteractiveViewer.timezone-boundaries.test.tsx (5 tests) 1029ms + ✓ renders tooltip dates correctly for leap-year activity blocks 950ms + ✓ components/dashboard/CommitClock.accessibility.test.tsx (5 tests) 1251ms + ✓ exposes each weekday group as an img role with a descriptive aria-label 333ms + ✓ announces the tooltip with role="tooltip" and the day title on focus 539ms + ✓ components/dashboard/HistoricalTrendView.theme-contrast.test.tsx (5 tests) 1703ms + ✓ renders light mode background classes 879ms + ✓ renders text content with contrast-aware classes 353ms + ✓ app/components/FeatureCard.test.tsx (15 tests) 1337ms + ✓ renders the title inside an <h3> 627ms + ✓ components/dashboard/PRInsights/RepoPerformanceTable.responsive-breakpoints.test.tsx (5 tests) 1518ms + ✓ renders inside an overflow-hidden responsive container 439ms + ✓ uses an overflow-auto table wrapper for smaller viewports 794ms + ✓ app/customize/components/AdvancedSettingsPanel.accessibility.test.tsx (5 tests) 2001ms + ✓ 1. verifies that the root container has a region role with a descriptive accessibility label 1384ms +stderr | components/dashboard/PRInsights/TopMetricsRow.accessibility.test.tsx > TopMetricsRow Accessibility Standards & Screen Reader Aria Compliance > renders all metric headings in logical order +React does not recognize the `whileHover` prop on a DOM element. If you intentionally want it to appear in the DOM as a custom attribute, spell it as lowercase `whilehover` instead. If you accidentally passed it from a parent component, remove it from the DOM element. +Unknown event handler property `onHoverStart`. It will be ignored. +Unknown event handler property `onHoverEnd`. It will be ignored. + + ✓ components/dashboard/PRInsights/TopMetricsRow.accessibility.test.tsx (5 tests) 1754ms + ✓ renders all metric headings in logical order 531ms + ✓ renders all metric cards without accessibility violations 637ms + ✓ components/InteractiveViewer.empty-fallback.test.tsx (5 tests) 1577ms + ✓ renders successfully with null children 997ms + ✓ app/customize/components/ExportPanel.accessibility.test.tsx (5 tests) 1179ms + ✓ uses correct accessible label coordinates (aria-label and aria-describedby) 739ms + ✓ lib/githubtoken.test.ts (3 tests) 509ms + ✓ decrypts the GitHub token from the JWT cookie 354ms + ✓ lib/aggregate.large-org.test.ts (5 tests) 1128ms + ✓ performs aggregation efficiently on large datasets 783ms + ✓ app/customize/components/AdvancedSettingsPanel.empty-fallback.test.tsx (5 tests) 1106ms + ✓ handles zero grace days correctly 740ms + ✓ components/dashboard/StatsCard.error-resilience.test.tsx (5 tests) 1519ms + ✓ should handle very large chartData arrays without crashing and render chart bars correctly 1079ms +stderr | app/(root)/dashboard/error.mock-integrations.test.tsx > DashboardError - mock integrations > renders pending state overlays/fallback when service layer fails +Error: Service timeout + at /home/atulupadhyay/Contribution/commitpulse/app/(root)/dashboard/error.mock-integrations.test.tsx:29:35 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:302:11 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:1903:26 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2326:20 + at new Promise (<anonymous>) + at runWithCancel (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2323:10) + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2305:20 + at new Promise (<anonymous>) + at runWithTimeout (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2272:10) + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2955:64 + +stderr | app/(root)/dashboard/error.mock-integrations.test.tsx > DashboardError - mock integrations > triggers specific rate limit fallback when database hits API limit +Error: API limit exceeded + at /home/atulupadhyay/Contribution/commitpulse/app/(root)/dashboard/error.mock-integrations.test.tsx:37:35 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:302:11 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:1903:26 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2326:20 + at new Promise (<anonymous>) + at runWithCancel (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2323:10) + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2305:20 + at new Promise (<anonymous>) + at runWithTimeout (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2272:10) + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2955:64 + +stderr | app/(root)/dashboard/error.mock-integrations.test.tsx > DashboardError - mock integrations > triggers specific not found fallback when cache returns no user +Error: User not found in cache + at /home/atulupadhyay/Contribution/commitpulse/app/(root)/dashboard/error.mock-integrations.test.tsx:45:35 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:302:11 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:1903:26 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2326:20 + at new Promise (<anonymous>) + at runWithCancel (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2323:10) + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2305:20 + at new Promise (<anonymous>) + at runWithTimeout (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2272:10) + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2955:64 + +stderr | app/(root)/dashboard/error.mock-integrations.test.tsx > DashboardError - mock integrations > calls reset mechanism for complete cache sync on retry +Error: Service timeout + at /home/atulupadhyay/Contribution/commitpulse/app/(root)/dashboard/error.mock-integrations.test.tsx:53:35 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:302:11 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:1903:26 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2326:20 + at new Promise (<anonymous>) + at runWithCancel (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2323:10) + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2305:20 + at new Promise (<anonymous>) + at runWithTimeout (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2272:10) + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2955:64 + +stderr | app/(root)/dashboard/error.mock-integrations.test.tsx > DashboardError - mock integrations > writes complete telemetry sync to the mocked logger service +Error: Database retrieval timeout + at /home/atulupadhyay/Contribution/commitpulse/app/(root)/dashboard/error.mock-integrations.test.tsx:63:22 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:302:11 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:1903:26 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2326:20 + at new Promise (<anonymous>) + at runWithCancel (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2323:10) + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2305:20 + at new Promise (<anonymous>) + at runWithTimeout (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2272:10) + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2955:64 + + ✓ app/(root)/dashboard/error.mock-integrations.test.tsx (5 tests) 1844ms + ✓ renders pending state overlays/fallback when service layer fails 1354ms + ✓ components/ShareButtons.empty-fallback.test.tsx (5 tests) 3601ms + ✓ renders without crashing when url is an empty string 1959ms + ✓ handles omitted optional title via default parameter without errors 427ms + ✓ retains standard layout classes when rendered with empty string url 315ms + ✓ survives rerender transitions between valid and empty url values 566ms + ✓ components/dashboard/PRInsights/RepoPerformanceTable.accessibility.test.tsx (5 tests) 5061ms + ✓ inspects markup for correct table roles and accessible column labels 4760ms +stderr | components/DiscordButton.accessibility.test.tsx > DiscordButton accessibility behavior > renders as an accessible link with visible text +React does not recognize the `whileTap` prop on a DOM element. If you intentionally want it to appear in the DOM as a custom attribute, spell it as lowercase `whiletap` instead. If you accidentally passed it from a parent component, remove it from the DOM element. + + ✓ components/DiscordButton.accessibility.test.tsx (5 tests) 4478ms + ✓ renders as an accessible link with visible text 4005ms + ✓ app/generator/components/sections/CommitPulseSection.empty-fallback.test.tsx (5 tests) 5210ms + ✓ renders successfully with empty parameters and handles missing properties defensively 2170ms + ✓ handles invalid github username structures and displays format warnings without calling fetch 483ms + ✓ displays fallback user error notice when fetch resolves with a 404 not found status 657ms + ✓ handles network API exception rejections gracefully and sets fetchError message without crashing 332ms + ✓ falls back to transparent preview background when accent color hex is invalid or empty 1517ms + ✓ components/dashboard/VisualizationTooltip.error-resilience.test.tsx (5 tests) 2427ms + ✓ maintains hydration stability and renders without crashing under default properties 2180ms + ✓ app/components/CopyRepoButton.theme-contrast.test.tsx (5 tests) 3472ms + ✓ includes light mode background and border contrast classes 3275ms + ✓ app/generator/components/sections/CommitPulseSection.theme-contrast.test.tsx (5 tests) 3462ms + ✓ renders correctly in light theme with visible primary content 2784ms + ✓ app/documentation/code-block.mock-integrations.test.tsx (5 tests) 4898ms + ✓ calls the clipboard service with the provided code 4006ms + ✓ shows Copied after a successful clipboard write 363ms + ✓ components/FeatureCards.theme-contrast.test.tsx (5 tests) 681ms + ✓ maintains heading visibility across themes 473ms +stderr | components/ReturnToTop.mouse-interactivity.test.tsx > ReturnToTop - Interactive Tooltips, Cursor Hovers & Touch Event Propagation > triggers simulated mouseenter/hover gestures on active segments or interactive nodes +React does not recognize the `whileHover` prop on a DOM element. If you intentionally want it to appear in the DOM as a custom attribute, spell it as lowercase `whilehover` instead. If you accidentally passed it from a parent component, remove it from the DOM element. +React does not recognize the `whileTap` prop on a DOM element. If you intentionally want it to appear in the DOM as a custom attribute, spell it as lowercase `whiletap` instead. If you accidentally passed it from a parent component, remove it from the DOM element. + + ✓ components/ReturnToTop.mouse-interactivity.test.tsx (5 tests) 1043ms + ✓ triggers simulated mouseenter/hover gestures on active segments or interactive nodes 916ms + ✓ components/dashboard/AIInsights.mock-integrations.test.tsx (5 tests) 795ms + ✓ renders pending overlay while async service loads insights 762ms + ✓ app/components/theme-switch.mouse-interactivity.test.tsx (5 tests) 947ms + ✓ should respond to mouseenter events on the active button layout structure 690ms +stderr | components/dashboard/LanguageChart.mock-integrations.test.tsx > LanguageChart — mock integrations > renders all language names when given typical API-shaped data +React does not recognize the `whileInView` prop on a DOM element. If you intentionally want it to appear in the DOM as a custom attribute, spell it as lowercase `whileinview` instead. If you accidentally passed it from a parent component, remove it from the DOM element. + + ✓ components/dashboard/LanguageChart.mock-integrations.test.tsx (5 tests) 448ms + ✓ app/components/CustomizeCTA.accessibility.test.tsx (5 tests) 1605ms + ✓ renders the primary heading for screen readers 1086ms + ✓ components/dashboard/Achievements.accessibility.test.tsx (5 tests) 1182ms + ✓ inspects markup for correct use of accessible label coordinates and roles 953ms + ✓ app/generator/GeneratorClient.responsive-breakpoints.test.tsx (5 tests) 2058ms + ✓ renders correctly for a standard 375px mobile viewport 512ms + ✓ stacks editor and preview into vertical columns on mobile 301ms + ✓ keeps editor and preview panels accessible on smaller viewports 911ms + ✓ app/contributors/loading.theme-contrast.test.tsx (5 tests) 641ms + ✓ renders an accessible loading status 539ms + ✓ app/components/ScrollRestoration.accessibility.test.tsx (5 tests) 805ms + ✓ renders no DOM nodes that would disrupt screen reader document flow 481ms + ✓ app/generator/components/EditorPanel.timezone-boundaries.test.tsx (5 tests) 1126ms + ✓ renders the core form wrapper layout cleanly with structural accessibility markers 847ms + ✓ components/InteractiveViewer.error-resilience.test.tsx (5 tests) 1459ms + ✓ renders successfully with minimal content without crashing 1029ms + ✓ components/dashboard/AIInsightsSkeleton.timezon-boundaries.test.tsx (5 tests) 544ms +stderr | components/dashboard/PRInsights/TopMetricsRow.timezone-boundaries.test.tsx > TopMetricsRow Timezone Normalization & Calendar Data Boundary Alignment > 1. mocks standard timezone settings (e.g., UTC, EST, IST, and JST) +React does not recognize the `whileHover` prop on a DOM element. If you intentionally want it to appear in the DOM as a custom attribute, spell it as lowercase `whilehover` instead. If you accidentally passed it from a parent component, remove it from the DOM element. +Unknown event handler property `onHoverStart`. It will be ignored. +Unknown event handler property `onHoverEnd`. It will be ignored. + + ✓ components/dashboard/PRInsights/TopMetricsRow.timezone-boundaries.test.tsx (5 tests) 904ms + ✓ 1. mocks standard timezone settings (e.g., UTC, EST, IST, and JST) 592ms +stderr | app/(root)/dashboard/error.accessibility.test.tsx > Dashboard Error Component - Accessibility Standards > should utilize correct accessible elements or roles +Error: Test dashboard error + at /home/atulupadhyay/Contribution/commitpulse/app/(root)/dashboard/error.accessibility.test.tsx:8:21 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:1889:40 + at runWithSuite (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2258:8) + at Object.collect (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:1889:10) + at Object.collect (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:1893:54) + at processTicksAndRejections (node:internal/process/task_queues:103:5) + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2462:26 + at collectTests (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2433:3) + at startTests (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:3278:17) + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/vitest/dist/chunks/base.B6Opl8PE.js:90:5 +[ERROR] Dashboard error {"error":{}} + +stderr | app/(root)/dashboard/error.accessibility.test.tsx > Dashboard Error Component - Accessibility Standards > interactive elements like buttons should accept programmatic key focus +Error: Test dashboard error + at /home/atulupadhyay/Contribution/commitpulse/app/(root)/dashboard/error.accessibility.test.tsx:8:21 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:1889:40 + at runWithSuite (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2258:8) + at Object.collect (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:1889:10) + at Object.collect (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:1893:54) + at processTicksAndRejections (node:internal/process/task_queues:103:5) + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2462:26 + at collectTests (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2433:3) + at startTests (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:3278:17) + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/vitest/dist/chunks/base.B6Opl8PE.js:90:5 +[ERROR] Dashboard error {"error":{}} + +stderr | app/(root)/dashboard/error.accessibility.test.tsx > Dashboard Error Component - Accessibility Standards > tooltip elements should announce correct accessibility descriptions +Error: Test dashboard error + at /home/atulupadhyay/Contribution/commitpulse/app/(root)/dashboard/error.accessibility.test.tsx:8:21 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:1889:40 + at runWithSuite (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2258:8) + at Object.collect (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:1889:10) + at Object.collect (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:1893:54) + at processTicksAndRejections (node:internal/process/task_queues:103:5) + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2462:26 + at collectTests (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2433:3) + at startTests (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:3278:17) + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/vitest/dist/chunks/base.B6Opl8PE.js:90:5 +[ERROR] Dashboard error {"error":{}} + +stderr | app/(root)/dashboard/error.accessibility.test.tsx > Dashboard Error Component - Accessibility Standards > keyboard navigation follows a logical tab ordering path +Error: Test dashboard error + at /home/atulupadhyay/Contribution/commitpulse/app/(root)/dashboard/error.accessibility.test.tsx:8:21 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:1889:40 + at runWithSuite (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2258:8) + at Object.collect (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:1889:10) + at Object.collect (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:1893:54) + at processTicksAndRejections (node:internal/process/task_queues:103:5) + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2462:26 + at collectTests (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2433:3) + at startTests (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:3278:17) + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/vitest/dist/chunks/base.B6Opl8PE.js:90:5 +[ERROR] Dashboard error {"error":{}} + +stderr | app/(root)/dashboard/error.accessibility.test.tsx > Dashboard Error Component - Accessibility Standards > headings are structured in a logical hierarchical sequence +Error: Test dashboard error + at /home/atulupadhyay/Contribution/commitpulse/app/(root)/dashboard/error.accessibility.test.tsx:8:21 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:1889:40 + at runWithSuite (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2258:8) + at Object.collect (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:1889:10) + at Object.collect (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:1893:54) + at processTicksAndRejections (node:internal/process/task_queues:103:5) + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2462:26 + at collectTests (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2433:3) + at startTests (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:3278:17) + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/vitest/dist/chunks/base.B6Opl8PE.js:90:5 +[ERROR] Dashboard error {"error":{}} + + ✓ app/(root)/dashboard/error.accessibility.test.tsx (5 tests) 1081ms + ✓ should utilize correct accessible elements or roles 497ms +stderr | components/DiscordButton.test.tsx > DiscordButton > renders discord invite link with correct href +React does not recognize the `whileTap` prop on a DOM element. If you intentionally want it to appear in the DOM as a custom attribute, spell it as lowercase `whiletap` instead. If you accidentally passed it from a parent component, remove it from the DOM element. + + ✓ components/DiscordButton.test.tsx (8 tests) 1422ms + ✓ renders discord invite link with correct href 712ms + ✓ app/not-found.mouse-interactivity.test.tsx (5 tests) 1028ms + ✓ triggers simulated mouseenter/hover gestures on active segments 603ms + ✓ app/components/theme-switch.test.tsx (12 tests) 1815ms + ✓ renders correctly 1044ms + ✓ components/dashboard/StatsCardSkeleton.accessibility.test.tsx (5 tests) 1368ms + ✓ has no invalid or broken aria-labelledby references 1021ms + ✓ app/generator/components/sections/DescriptionSection.error-resilience.test.tsx (5 tests) 1195ms + ✓ renders safely when value is undefined and falls back to an empty string 648ms + ✓ components/dashboard/Heatmap.theme-contrast.test.tsx (5 tests) 1446ms + ✓ renders the themed heatmap card container 1162ms + ✓ components/dashboard/ResumePreviewForm.mouse-interactivity.test.tsx (5 tests) 1375ms + ✓ adds skill input via add button click 1052ms + ✓ app/generator/components/PreviewPanel.error-resilience.test.tsx (5 tests) 1430ms + ✓ Test 1: should maintain Hydration Stability and render without crashing on initial load 730ms + ✓ Test 5: should ensure user reset/reload paths are available on the recovery panels 516ms +stderr | components/DiscordButton.mouse-interactivity.test.tsx > DiscordButton - Interactive Tooltips, Cursor Hovers & Touch Event Propagation > fires mouseleave on the anchor without throwing and confirms GSAP reset is attempted +An update to DiscordButton inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act + + ✓ components/DiscordButton.mouse-interactivity.test.tsx (5 tests) 1897ms + ✓ renders the anchor element with the correct Discord href and external link attributes 1380ms + ✓ app/api/streak/png/route.mouse-interactivity.test.tsx (5 tests) 1112ms + ✓ 1. triggers simulated mouseenter/hover gestures on active segments 793ms + ✓ app/components/CustomizeCTA.error-resilience.test.tsx (5 tests) 1559ms + ✓ renders successfully during initial mount 1075ms + ✓ app/customize/components/AdvancedSettingsPanel.responsive-breakpoints.test.tsx (5 tests) 1175ms + ✓ renders correctly on a mobile viewport (375px) 863ms + ✓ app/api/og/route.accessibility.test.tsx (5 tests) 1664ms + ✓ should have correct ARIA roles and accessible labels assigned 1111ms + ✓ components/dashboard/LanguageChart.accessibility.test.tsx (5 tests) 889ms + ✓ Inspect markup to check for correct use of accessible label coordinates (role, aria-labelledby, or aria-describedby): region role and labelledby 652ms + ✓ app/components/FeatureCard.timezone-boundaries.test.tsx (5 tests) 676ms + ✓ Case 2: verifies layout data binds correctly around leap year transitions 451ms + ✓ app/generator/components/sections/CommitPulseSection.error-resilience.test.tsx (5 tests) 1116ms + ✓ 1. Hydration Stability: renders component via SSR+hydration gracefully 305ms + ✓ 5. Recovery UI: attempts recovery properly upon user interaction 412ms + ✓ app/not-found.error-resilience.test.tsx (5 tests) 2349ms + ✓ Renders normally with hydration stability when no exceptions occur 1652ms + ✓ components/FeatureCards.mouse-interactivity.test.tsx (5 tests) 863ms + ✓ renders content for hover interaction scenarios 682ms +stderr | components/dashboard/PRInsights/PRInsightsClient.mouse-interactivity.test.tsx > PRInsightsClient Mouse Interactivity > renders interactive dashboard sections after successful data load +The width(-1) and height(-1) of chart should be greater than 0, + please check the style of container, or the props width(100%) and height(100%), + or add a minWidth(0) or minHeight(undefined) or use aspect(undefined) to control the + height and width. + +stderr | components/dashboard/PRInsights/PRInsightsClient.mouse-interactivity.test.tsx > PRInsightsClient Mouse Interactivity > propagates click interactions on dashboard widgets +The width(-1) and height(-1) of chart should be greater than 0, + please check the style of container, or the props width(100%) and height(100%), + or add a minWidth(0) or minHeight(undefined) or use aspect(undefined) to control the + height and width. + +stderr | components/dashboard/PRInsights/PRInsightsClient.mouse-interactivity.test.tsx > PRInsightsClient Mouse Interactivity > handles mouse enter and mouse leave interactions without crashing +The width(-1) and height(-1) of chart should be greater than 0, + please check the style of container, or the props width(100%) and height(100%), + or add a minWidth(0) or minHeight(undefined) or use aspect(undefined) to control the + height and width. + +stderr | components/dashboard/PRInsights/PRInsightsClient.mouse-interactivity.test.tsx > PRInsightsClient Mouse Interactivity > supports touch interaction propagation on mobile devices +The width(-1) and height(-1) of chart should be greater than 0, + please check the style of container, or the props width(100%) and height(100%), + or add a minWidth(0) or minHeight(undefined) or use aspect(undefined) to control the + height and width. + +stderr | components/dashboard/PRInsights/PRInsightsClient.mouse-interactivity.test.tsx > PRInsightsClient Mouse Interactivity > renders pointer-enabled interactive widgets for hoverable dashboard actions +The width(-1) and height(-1) of chart should be greater than 0, + please check the style of container, or the props width(100%) and height(100%), + or add a minWidth(0) or minHeight(undefined) or use aspect(undefined) to control the + height and width. + + ✓ components/dashboard/PRInsights/PRInsightsClient.mouse-interactivity.test.tsx (5 tests) 1121ms + ✓ renders interactive dashboard sections after successful data load 682ms +stderr | components/dashboard/ProfileCard.error-resilience.test.tsx > ProfileCard: Hydration Stability, Exception Safety & Error Fallbacks > Test 3: should assert that target modules render a clean error recovery UI instead of crashing the site +TypeError: Cannot read properties of null (reading 'repositories') + at ProfileCard (/home/atulupadhyay/Contribution/commitpulse/components/dashboard/ProfileCard.tsx:181:35) + at Object.react_stack_bottom_frame (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:25904:20) + at renderWithHooks (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:7662:22) + at updateFunctionComponent (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:10166:19) + at beginWork (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:11778:18) + at runWithFiberInDEV (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:874:13) + at performUnitOfWork (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:17641:22) + at workLoopSync (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:17469:41) + at renderRootSync (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:17450:11) + at performWorkOnRoot (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:16583:35) { + [stack]: [Getter/Setter], + [message]: "Cannot read properties of null (reading 'repositories')" +} + +The above error occurred in the <ProfileCard> component. + +React will try to recreate this component tree from scratch using the error boundary you provided, MockErrorBoundary. + +Telemetry Error Logged: Cannot read properties of null (reading 'repositories') + +stderr | components/dashboard/ProfileCard.error-resilience.test.tsx > ProfileCard: Hydration Stability, Exception Safety & Error Fallbacks > Test 5: should ensure user reset/reload paths are available on the recovery panels +TypeError: Cannot read properties of undefined (reading 'username') + at ProfileCard (/home/atulupadhyay/Contribution/commitpulse/components/dashboard/ProfileCard.tsx:67:12) + at Object.react_stack_bottom_frame (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:25904:20) + at renderWithHooks (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:7662:22) + at updateFunctionComponent (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:10166:19) + at beginWork (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:11778:18) + at runWithFiberInDEV (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:874:13) + at performUnitOfWork (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:17641:22) + at workLoopSync (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:17469:41) + at renderRootSync (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:17450:11) + at performWorkOnRoot (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:16583:35) { + [stack]: [Getter/Setter], + [message]: "Cannot read properties of undefined (reading 'username')" +} + +The above error occurred in the <ProfileCard> component. + +React will try to recreate this component tree from scratch using the error boundary you provided, MockErrorBoundary. + +Telemetry Error Logged: Cannot read properties of undefined (reading 'username') + + ✓ components/dashboard/ProfileCard.error-resilience.test.tsx (5 tests) 575ms + ✓ Test 5: should ensure user reset/reload paths are available on the recovery panels 314ms + ✓ app/components/SuccessGuide.error-resilience.test.tsx (5 tests) 713ms + ✓ calls onDismiss handler when close button is clicked without crashing 487ms + ✓ components/BrandParticles.mock-integrations.test.tsx (5 tests) 1144ms + ✓ renders successfully with mocked motion services 605ms + ✓ components/dashboard/AIInsightsSkeleton.accessibility.test.tsx (6 tests) 1084ms + ✓ allows sequential keyboard tab navigation to bypass the skeleton entirely 693ms + ✓ components/dashboard/tooltipUtils.accessibility.test.tsx (5 tests) 2379ms + ✓ renders with role="tooltip" so assistive technologies correctly identify the element 1828ms + ✓ components/dashboard/PopularPinnnedRepos.mock-integrations.test.tsx (5 tests) 395ms + ✓ components/dashboard/ResumePreviewForm.empty-fallback.test.tsx (5 tests) 2466ms + ✓ renders safely with empty parsed resume values 765ms + ✓ shows empty fallback input fields for missing profile values 1333ms + ✓ components/dashboard/ResumePreviewForm.accessibility.test.tsx (5 tests) 1388ms + ✓ checks that the save button is disabled when saving to prevent multiple submissions 941ms + ✓ components/dashboard/ComparisonStatsCard.responsive-breakpoints.test.tsx (5 tests) 625ms + ✓ verifies styling values use relative widths preventing horizontal scrollbars on mobile 319ms + ✓ lib/calculate.responsive-breakpoints.test.ts (5 tests) 902ms + ✓ mocks standard mobile-width media coordinates (e.g. 375px wide viewports) 385ms +stderr | app/global-error.empty-fallback.test.tsx > Global Error Page - Empty & Missing Input Fallbacks > renders successfully when error is null +In HTML, <html> cannot be a child of <div>. +This will cause a hydration error. + + ✓ app/contributors/loading.empty-fallback.test.tsx (5 tests) 1071ms + ✓ shows a clear fallback loading state without persistent copy 865ms + ✓ app/global-error.empty-fallback.test.tsx (6 tests) 1109ms + ✓ renders successfully when error is null 330ms + ✓ renders interactive elements and triggers reset correctly in fallback state 566ms + ✓ components/dashboard/PRInsights/RepoPerformanceTable.theme-contrast.test.tsx (5 tests) 1167ms + ✓ renders light theme styling classes 438ms + ✓ keeps table content visible and accessible 637ms + ✓ components/dashboard/ProfileOptimizerModal.accessibility.test.tsx (5 tests) 1355ms + ✓ renders the modal heading in a logical hierarchy 887ms + ✓ components/ScrollToBottom.empty-fallback.test.tsx (6 tests) 1742ms + ✓ renders nothing on initial mount when scroll position is 0 (page not yet scrolled) 1594ms + ✓ components/AnimatedCursor.mouse-interactivity.test.tsx (6 tests) 1922ms + ✓ renders dot and ring cursor elements 442ms + ✓ applies hover styling on ring when hovering over interactive element 927ms + ✓ components/dashboard/PRInsights/TopMetricsRow.error-resilience.test.tsx (5 tests) 2144ms + ✓ renders stably with valid data and never engages the error fallback 590ms + ✓ catches an unexpected runtime exception thrown by a nested child component 1231ms + ✓ app/components/CopyRepoButton.mouse-interactivity.test.tsx (5 tests) 1200ms + ✓ renders copy button 962ms + ✓ app/components/CustomizeCTA.responsive-v2.test.tsx (5 tests) 1297ms + ✓ applies the correct responsive spacing and layout bounds to the main container 301ms + ✓ renders the section header using responsive font sizes from mobile text-2xl to desktop md:text-3xl 883ms + ✓ components/dashboard/GithubWrapped.test.tsx (8 tests) 970ms + ✓ renders user name 476ms + ✓ components/KeyboardShortcutsModal.error-resilience.test.tsx (8 tests) 986ms + ✓ does not throw when onClose is a no-op function 480ms + ✓ app/generator/components/SectionCard.responsive-breakpoints.test.tsx (5 tests) 2026ms + ✓ mocks standard mobile-width media coordinates and renders without crashing 323ms + ✓ asserts mobile-specific toggle states respond cleanly 1454ms + ✓ app/components/CopyRepoButton.timezone-boundaries.test.tsx (5 tests) 3107ms + ✓ renders with the default "Copy URL" label on mount 1402ms + ✓ resets to "Copy URL" exactly after the 2000 ms timeout boundary 357ms + ✓ shows "Copy failed" and resets after 2000 ms when the clipboard API rejects 699ms + ✓ writes the exact repo URL exported from the component to the clipboard 384ms +stderr | components/dashboard/PRInsights/TopMetricsRow.mock-integrations.test.tsx > TopMetricsRow & PRInsights Service Mock Integrations > loads and renders metric values correctly using mocked service layer data +React does not recognize the `whileHover` prop on a DOM element. If you intentionally want it to appear in the DOM as a custom attribute, spell it as lowercase `whilehover` instead. If you accidentally passed it from a parent component, remove it from the DOM element. +Unknown event handler property `onHoverStart`. It will be ignored. +Unknown event handler property `onHoverEnd`. It will be ignored. + + ✓ components/dashboard/PRInsights/TopMetricsRow.mock-integrations.test.tsx (5 tests) 1102ms + ✓ loads and renders metric values correctly using mocked service layer data 897ms + ✓ app/(root)/dashboard/error.timezone-boundaries.test.tsx (5 tests) 3070ms + ✓ Case 1: Mock varying system timezone settings (e.g., America/New_York, Asia/Kolkata, Asia/Tokyo) and assert that date calculations or logged metadata cleanly map errors onto the correct localized bounds 484ms + ✓ Case 2: Validate grid stability over leap year boundaries (e.g., February 29th) ensuring calendar utilities referenced by the error block parse dates cleanly with zero gaps or structural offset slips 1315ms + ✓ Case 4: Assert that date formatting strings rendered inside the error view correctly reflect expectations across diverse international locales 437ms + ✓ Case 5: Verify that calling the component's interactive reset handler under timezone-shifted date footprints cleanses local error thresholds cleanly with 0 unexpected runtime execution failures 603ms +stderr | components/dashboard/PRInsights/PRTrendChart.timezone-boundaries.test.tsx > PRTrendChart Timezone Normalization & Calendar Boundary Alignment > 2. aligns chart labels after switching weekly/monthly views +The tag <stop> is unrecognized in this browser. If you meant to render a React component, start its name with an uppercase letter. +<linearGradient /> is using incorrect casing. Use PascalCase for React components, or lowercase for HTML elements. +The tag <linearGradient> is unrecognized in this browser. If you meant to render a React component, start its name with an uppercase letter. +The tag <defs> is unrecognized in this browser. If you meant to render a React component, start its name with an uppercase letter. + +stderr | components/dashboard/PRInsights/PRTrendChart.timezone-boundaries.test.tsx > PRTrendChart Timezone Normalization & Calendar Boundary Alignment > 5. handles daylight saving transition without breaking rendering +<linearGradient /> is using incorrect casing. Use PascalCase for React components, or lowercase for HTML elements. + + ✓ components/dashboard/PRInsights/PRTrendChart.timezone-boundaries.test.tsx (5 tests) 5234ms + ✓ 2. aligns chart labels after switching weekly/monthly views 4947ms +stderr | components/ReturnToTop.test.tsx > ReturnToTop > renders button with aria-label when visible +React does not recognize the `whileHover` prop on a DOM element. If you intentionally want it to appear in the DOM as a custom attribute, spell it as lowercase `whilehover` instead. If you accidentally passed it from a parent component, remove it from the DOM element. +React does not recognize the `whileTap` prop on a DOM element. If you intentionally want it to appear in the DOM as a custom attribute, spell it as lowercase `whiletap` instead. If you accidentally passed it from a parent component, remove it from the DOM element. + + ✓ components/ReturnToTop.test.tsx (6 tests) 594ms + ✓ renders button with aria-label when visible 365ms + ✓ components/dashboard/RefreshButton.mock-integrations.test.tsx (5 tests) 2668ms + ✓ renders the button in idle state without triggering any async service call on mount 2089ms + ✓ triggers router push and refresh as async service calls when button is clicked 335ms + ✓ app/not-found.mock-integrations.test.tsx (5 tests) 1509ms + ✓ renders initial pending state overlay before MiniGame activation 1277ms + ✓ components/dashboard/RepositoryGraph.error-resilience.test.tsx (5 tests) 703ms + ✓ app/components/HeroSection.mock-integrations.test.tsx (5 tests) 1569ms + ✓ renders static content without making real network calls 920ms + ✓ components/dashboard/AchievementsSkeleton.mouse-interactivity.test.tsx (5 tests) 1105ms + ✓ simulates mouse enter/hover events on skeleton cells and triggers hover-state activation callbacks 712ms + ✓ app/customize/page.keyboard.test.tsx (5 tests) 993ms + ✓ lib/cache.theme-contrast.test.ts (2 tests) 1191ms + ✓ ensures theme toggle button remains visible in light mode (contrast proxy check) 1114ms + ✓ components/dashboard/heatmapUtils.mouse-interactivity.test.ts (5 tests) 1349ms + ✓ 1. should activate tooltip and compute positioning on cell mouseenter 1030ms +stderr | app/components/FeatureCard.error-resilience.test.tsx > FeatureCard Error Resilience > renders successfully with valid props +React does not recognize the `whileHover` prop on a DOM element. If you intentionally want it to appear in the DOM as a custom attribute, spell it as lowercase `whilehover` instead. If you accidentally passed it from a parent component, remove it from the DOM element. + +stderr | app/components/FeatureCard.error-resilience.test.tsx > FeatureCard Error Resilience > hydrates without mismatches +React does not recognize the `whileHover` prop on a DOM element. If you intentionally want it to appear in the DOM as a custom attribute, spell it as lowercase `whilehover` instead. If you accidentally passed it from a parent component, remove it from the DOM element. + +stderr | app/components/FeatureCard.error-resilience.test.tsx > FeatureCard Error Resilience > renders recovery UI when a child throws inside an Error Boundary +Error: Icon crashed + at BrokenIcon (/home/atulupadhyay/Contribution/commitpulse/app/components/FeatureCard.error-resilience.test.tsx:82:13) + at Object.react_stack_bottom_frame (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:25904:20) + at renderWithHooks (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:7662:22) + at updateFunctionComponent (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:10166:19) + at beginWork (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:11778:18) + at runWithFiberInDEV (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:874:13) + at performUnitOfWork (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:17641:22) + at workLoopSync (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:17469:41) + at renderRootSync (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:17450:11) + at performWorkOnRoot (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:16583:35) { + [stack]: [Getter/Setter], + [message]: 'Icon crashed' +} + +The above error occurred in the <BrokenIcon> component. + +React will try to recreate this component tree from scratch using the error boundary you provided, ErrorBoundary. + + + ✓ app/components/FeatureCard.error-resilience.test.tsx (5 tests) 829ms + ✓ renders successfully with valid props 620ms + ✓ components/dashboard/DashboardSkeleton.empty-fallback.test.tsx (5 tests) 431ms + ✓ components/FeatureCards.mock-integrations.test.tsx (5 tests) 1038ms + ✓ renders section heading correctly with mocked integrations 719ms + ✓ app/api/og/route.mouse-interactivity.test.tsx (5 tests) 1350ms + ✓ 1. triggers simulated mouseenter/hover gestures on active segments 1125ms + ✓ components/dashboard/ComparisonStatsCard.mock-integrations.test.tsx (5 tests) 1385ms + ✓ should successfully render the main component container and accessibilities 929ms + ✓ app/components/CopyRepoButton.test.tsx (5 tests) 712ms + ✓ renders with default copy text 515ms + ✓ app/generator/components/SectionCard.mock-integrations.test.tsx (5 tests) 262ms + ✓ hooks/useShareActions.accessibility.test.ts (5 tests) 750ms + ✓ inspects markup to check for correct use of accessible label coordinates (role, aria-labelledby, aria-describedby) 527ms + ✓ app/contributors/ContributorsSearch.mouse-interactivity.test.tsx (5 tests) 561ms + ✓ app/components/FeatureCard.empty-fallback.test.tsx (5 tests) 1560ms + ✓ renders successfully with empty parameter fields and handles empty/null icon 1156ms + ✓ components/dashboard/AIInsights.responsive-breakpoints.test.tsx (5 tests) 319ms + ✓ components/dashboard/PRInsights/Highlights.theme-contrast.test.tsx (5 tests) 748ms + ✓ 2. should assert that the visual elements adapt color styling properly for both settings 497ms + ✓ app/components/HeroSection.responsive-breakpoints.test.tsx (5 tests) 858ms + ✓ renders the hero heading with responsive text size classes (mobile default, larger at md breakpoint) 374ms + ✓ stacks the search form vertically by default and switches to a horizontal row at the sm breakpoint 344ms + ✓ app/not-found.timezone-boundaries.test.tsx (5 tests) 1066ms + ✓ Mock standard timezone settings (e.g., UTC, EST, IST, and JST) 510ms + ✓ Assert calendar date format utility outputs match expectations in each locale 465ms + ✓ components/dashboard/PopularPinnnedRepos.error-resilience.test.tsx (5 tests) 1304ms + ✓ 1. Hydration stability: produces identical markup across a fresh mount vs. an async data-arrival re-render 648ms + ✓ components/CherryBlossom.theme-contrast.test.tsx (5 tests) 335ms + ✓ components/dashboard/HistoricalTrendView.error-resilience.test.tsx (5 tests) 782ms + ✓ Encase execution calls in localized boundary elements: safely handles completely empty data arrays without dividing by zero or crashing 433ms + ✓ app/components/SuccessGuide.empty-fallback.test.tsx (5 tests) 1180ms + ✓ renders successfully with empty markdown 574ms + ✓ dismiss button works without errors 328ms + ✓ app/generator/components/sections/DescriptionSection.mouse-interactivity.test.tsx (5 tests) 867ms + ✓ allows textarea interaction through mouse click events 569ms + ✓ app/components/CopyRepoButton.empty-fallback.test.tsx (5 tests) 861ms + ✓ renders safely without props 732ms + ✓ components/dashboard/tooltipUtils.mouse-interactivity.test.ts (5 tests) 723ms + ✓ Case 2: verifies that responsive tooltip layouts display at computed coordinates 523ms + ✓ components/ShareButtons.test.tsx (5 tests) 949ms + ✓ renders LinkedIn and Twitter share buttons 743ms +stderr | components/dashboard/CommitClock.error-resilience.test.tsx > CommitClock Error Resilience > renders safely with empty data +React does not recognize the `whileInView` prop on a DOM element. If you intentionally want it to appear in the DOM as a custom attribute, spell it as lowercase `whileinview` instead. If you accidentally passed it from a parent component, remove it from the DOM element. + + ✓ components/dashboard/CommitClock.error-resilience.test.tsx (5 tests) 834ms + ✓ renders all weekday spokes without runtime failures 687ms + ✓ components/dashboard/RefreshButton.responsive-breakpoints.test.tsx (5 tests) 1772ms + ✓ renders refresh button text 469ms + ✓ renders button element correctly 1169ms + ✓ app/components/CustomizeCTA.timezone-boundaries.test.tsx (4 tests) 797ms + ✓ renders identical core UI in UTC timezone 614ms +stderr | app/(root)/dashboard/error.error-resilience.test.tsx > DashboardError - error resilience > renders generic error state +Error: Something went wrong + at /home/atulupadhyay/Contribution/commitpulse/app/(root)/dashboard/error.error-resilience.test.tsx:33:35 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:302:11 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:1903:26 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2326:20 + at new Promise (<anonymous>) + at runWithCancel (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2323:10) + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2305:20 + at new Promise (<anonymous>) + at runWithTimeout (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2272:10) + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2955:64 + +stderr | app/(root)/dashboard/error.error-resilience.test.tsx > DashboardError - error resilience > renders rate limit UI when API limit error occurs +Error: API limit exceeded + at /home/atulupadhyay/Contribution/commitpulse/app/(root)/dashboard/error.error-resilience.test.tsx:44:35 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:302:11 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:1903:26 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2326:20 + at new Promise (<anonymous>) + at runWithCancel (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2323:10) + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2305:20 + at new Promise (<anonymous>) + at runWithTimeout (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2272:10) + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2955:64 + +stderr | app/(root)/dashboard/error.error-resilience.test.tsx > DashboardError - error resilience > renders not found UI when user is missing +Error: User not found + at /home/atulupadhyay/Contribution/commitpulse/app/(root)/dashboard/error.error-resilience.test.tsx:52:35 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:302:11 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:1903:26 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2326:20 + at new Promise (<anonymous>) + at runWithCancel (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2323:10) + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2305:20 + at new Promise (<anonymous>) + at runWithTimeout (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2272:10) + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2955:64 + +stderr | app/(root)/dashboard/error.error-resilience.test.tsx > DashboardError - error resilience > calls reset when Try again is clicked +Error: Something went wrong + at /home/atulupadhyay/Contribution/commitpulse/app/(root)/dashboard/error.error-resilience.test.tsx:60:35 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:302:11 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:1903:26 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2326:20 + at new Promise (<anonymous>) + at runWithCancel (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2323:10) + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2305:20 + at new Promise (<anonymous>) + at runWithTimeout (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2272:10) + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2955:64 + +stderr | app/(root)/dashboard/error.error-resilience.test.tsx > DashboardError - error resilience > logs error to logger on render +Error: Crash test + at /home/atulupadhyay/Contribution/commitpulse/app/(root)/dashboard/error.error-resilience.test.tsx:69:17 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:302:11 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:1903:26 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2326:20 + at new Promise (<anonymous>) + at runWithCancel (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2323:10) + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2305:20 + at new Promise (<anonymous>) + at runWithTimeout (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2272:10) + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2955:64 + + ✓ app/(root)/dashboard/error.error-resilience.test.tsx (5 tests) 1150ms + ✓ renders generic error state 1075ms + ✓ components/BrandParticles.accessibility.test.tsx (5 tests) 772ms + ✓ app/components/Footer.mock-integrations.test.tsx (5 tests) 824ms + ✓ app/layout.error-resilience.test.tsx (5 tests) 1032ms + ✓ Test 1: Hydration Stability - renders valid children without crashing and mounts all shell components 437ms + ✓ Test 5: Reset/Reload Paths - ensures user reset/reload paths are available on recovery panels and functioning 429ms + ✓ components/CherryBlossom.timezone-boundaries.test.tsx (5 tests) 565ms + ✓ hooks/useDebounce.error-resilience.test.ts (5 tests) 1108ms + ✓ ensures user reset/reload paths are available on the recovery panels 616ms + ✓ components/dashboard/RefreshButton.test.tsx (6 tests) 1742ms + ✓ has correct aria-label for accessibility 1617ms + ✓ app/contributors/ContributorsSearch.theme-contrast.test.tsx (5 tests) 1095ms + ✓ renders light mode contrast classes correctly 497ms + ✓ applies dark and light border styling on contributor cards 484ms + ✓ components/TopRivalriesTicker.accessibility.test.tsx (5 tests) 606ms + ✓ app/components/theme-switch.empty-fallback.test.tsx (5 tests) 587ms + ✓ renders ThemeToggleButton without props 445ms + ✓ app/generator/components/sections/DescriptionSection.accessibility.test.tsx (5 tests) 1325ms + ✓ uses correct accessible label coordinates (role, aria-labelledby, or aria-describedby) 744ms + ✓ components/BrandParticles.theme-contrast.test.tsx (5 tests) 965ms + ✓ renders successfully in light mode 338ms + ✓ components/Leaderboard.test.tsx (8 tests) 852ms + ✓ renders rank 1, 2, and 3 podium items when there are 3 or more contributors 462ms + ✓ components/dashboard/PRInsights/PRTrendChart.error-resilience.test.tsx (5 tests) 1129ms + ✓ 3. provides retry action on recovery panel 769ms + ✓ app/faq/page.test.tsx (1 test) 1162ms + ✓ renders readable FAQ copy instead of raw translation keys 1149ms + ✓ components/dashboard/PRInsights/TopMetricsRow.mouse-interactivity.test.tsx (5 tests) 377ms +stderr | components/DiscordButton.error-resilience.test.tsx > DiscordButton error resilience > renders without crashing +React does not recognize the `whileTap` prop on a DOM element. If you intentionally want it to appear in the DOM as a custom attribute, spell it as lowercase `whiletap` instead. If you accidentally passed it from a parent component, remove it from the DOM element. + + ✓ components/DiscordButton.error-resilience.test.tsx (5 tests) 961ms + ✓ renders the discord link even when animations are mocked 631ms + ✓ components/ShareButtons.accessibility.test.tsx (5 tests) 1100ms + ✓ provides an accessible label for the LinkedIn share link 935ms + ✓ components/dashboard/RefreshButton.accessibility.test.tsx (5 tests) 1566ms + ✓ has correct aria-label for screen readers 1384ms + ✓ app/components/HeroSection.theme-contrast.test.tsx (5 tests) 1593ms + ✓ includes dark mode classes on interactive controls 1266ms + ✓ app/template.responsive-breakpoints.test.tsx (5 tests) 1473ms + ✓ Case 4: Asserts mobile-specific toggle states respond cleanly 1232ms + ✓ components/AnimatedCursor.mock-integrations.test.tsx (5 tests) 871ms + ✓ registers browser event services and starts animation loop on mount 614ms + ✓ app/documentation/code-block.responsive-breakpoints.test.tsx (5 tests) 693ms + ✓ should ensure the code block wrapper utilizes responsive styles without hardcoded absolute clipping dimensions 353ms + ✓ app/(root)/dashboard/layout.timezone-boundaries.test.tsx (2 tests) 892ms + ✓ maintains structural integrity across varying timezones 834ms + ✓ app/generator/components/sections/DescriptionSection.empty-fallback.test.tsx (5 tests) 1634ms + ✓ renders without runtime errors when value is an empty string 349ms + ✓ displays placeholder text and empty value in the empty state 743ms +stdout | app/api/streak/tests/dateRange.test.ts > GET /api/streak dateRange parameter > returns 200 OK and SVG headers for a valid standard dateRange (from/to) +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"62ccda76-386e-404c-acbf-46623fdf4a44"} + +stdout | app/api/streak/tests/dateRange.test.ts > GET /api/streak dateRange parameter > returns 200 OK and SVG headers for a valid standard dateRange (from/to) +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":231,"requestId":"62ccda76-386e-404c-acbf-46623fdf4a44"} + +stdout | app/api/streak/tests/dateRange.test.ts > GET /api/streak dateRange parameter > applies custom dateRange and affects rendered month labels (body content changes) +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"95b8157d-12d6-4c06-9100-a90464cbc374"} + +stdout | app/api/streak/tests/dateRange.test.ts > GET /api/streak dateRange parameter > applies custom dateRange and affects rendered month labels (body content changes) +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":6,"requestId":"95b8157d-12d6-4c06-9100-a90464cbc374"} + +stdout | app/api/streak/tests/dateRange.test.ts > GET /api/streak dateRange parameter > omitted dateRange falls back to default parsing and still renders safely +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"ff6bbbbf-0698-4c0c-a858-9ddcc75e0442"} + +stdout | app/api/streak/tests/dateRange.test.ts > GET /api/streak dateRange parameter > omitted dateRange falls back to default parsing and still renders safely +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"ff6bbbbf-0698-4c0c-a858-9ddcc75e0442"} + +stdout | app/api/streak/tests/dateRange.test.ts > GET /api/streak dateRange parameter > invalid dateRange formats return a validation error without crashing +[INFO] Incoming streak request {"source":"streak","requestId":"6034e494-aa14-4c92-97ea-ee3c5ed6e034"} + +stdout | app/api/streak/tests/dateRange.test.ts > GET /api/streak dateRange parameter > sets sensible Cache-Control and Content-Type headers for SVG output +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"44bf0bbe-a5dc-496c-be44-abab8b6a6849"} + +stdout | app/api/streak/tests/dateRange.test.ts > GET /api/streak dateRange parameter > sets sensible Cache-Control and Content-Type headers for SVG output +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":9,"requestId":"44bf0bbe-a5dc-496c-be44-abab8b6a6849"} + + ✓ components/BrandParticles.responsive-breakpoints.test.tsx (5 tests) 1271ms + ✓ handles isolated mounting clean inside a 375px mobile viewport configuration 519ms + ✓ app/api/streak/tests/dateRange.test.ts (5 tests) 1252ms + ✓ returns 200 OK and SVG headers for a valid standard dateRange (from/to) 1028ms + ✓ components/dashboard/RefreshButton.empty-fallback.test.tsx (5 tests) 1172ms + ✓ renders button when username is empty 825ms + ✓ app/api/compare/tests/comparisonStats.test.ts (5 tests) 1937ms + ✓ returns 200 and JSON structure for valid dual-profile comparison 1820ms +stderr | components/dashboard/AIInsights.accessibility.test.tsx > AIInsights Accessibility > renders a semantic heading for screen readers +React does not recognize the `whileInView` prop on a DOM element. If you intentionally want it to appear in the DOM as a custom attribute, spell it as lowercase `whileinview` instead. If you accidentally passed it from a parent component, remove it from the DOM element. + + ✓ components/dashboard/AIInsights.accessibility.test.tsx (5 tests) 1520ms + ✓ renders a semantic heading for screen readers 1213ms + ✓ components/dashboard/DeploymentTracker.mock-integrations.test.tsx (6 tests) 2241ms + ✓ renders correctly when fed a GitHub-Actions-shaped payload via a fetch-based parent 1416ms +stderr | app/components/FeatureCard.accessibility.test.tsx > FeatureCard — Accessibility & Screen Reader Compliance > renders card as an article landmark labeled by its heading +React does not recognize the `whileHover` prop on a DOM element. If you intentionally want it to appear in the DOM as a custom attribute, spell it as lowercase `whilehover` instead. If you accidentally passed it from a parent component, remove it from the DOM element. + + ✓ app/components/FeatureCard.accessibility.test.tsx (5 tests) 2355ms + ✓ renders card as an article landmark labeled by its heading 2013ms + ✓ components/dashboard/VisualizationTooltip.mouse-interactivity.test.tsx (5 tests) 2608ms + ✓ 1. triggers simulated mouseenter/hover gestures and maps to state 1770ms + ✓ 2. verifies that responsive tooltip layouts display at computed coordinates on hover 326ms + ✓ 3. tests custom click/touch gestures and ensures click events propagate correctly 411ms + ✓ components/KeyboardShortcutsModal.empty-fallback.test.tsx (8 tests) 3933ms + ✓ renders nothing (returns null) when isOpen is false 478ms + ✓ does not render the dialog heading when closed 585ms + ✓ transitions from hidden to visible when isOpen changes from false to true 2245ms + ✓ components/dashboard/ResumeUpload.mouse-interactivity.test.tsx (5 tests) 8985ms + ✓ applies cursor-pointer styling to the upload dropzone 3683ms + ✓ opens file picker when upload dropzone is clicked 4291ms + ✓ applies active drag styling on drag enter and drag over 809ms + ✓ components/dashboard/AIInsightsSkeleton.error-resilience.test.tsx (5 tests) 3862ms + ✓ should render clean accessible containers matching standard accessibility trees 2891ms + ✓ should survive map iterations gracefully even if global array prototypes are altered 461ms +stderr | components/dashboard/Achievements.empty-fallback.test.tsx > Achievements - Empty/Missing Inputs > renders successfully with an empty achievements array +React does not recognize the `whileInView` prop on a DOM element. If you intentionally want it to appear in the DOM as a custom attribute, spell it as lowercase `whileinview` instead. If you accidentally passed it from a parent component, remove it from the DOM element. + + ✓ components/dashboard/Achievements.empty-fallback.test.tsx (5 tests) 889ms + ✓ renders toggle button when achievements exceed four items 587ms + ✓ components/dashboard/CommitClock.mouse-interactivity.test.tsx (5 tests) 1004ms + ✓ shows tooltip on mouse enter 345ms + ✓ components/dashboard/ActivityLandscape.empty-fallback.test.tsx (5 tests) 694ms + ✓ renders successfully with an empty data array 573ms + ✓ components/DiscordButton.type-compiler.test.tsx (5 tests) 1143ms + ✓ compiles and renders without error 930ms +stderr | components/ReturnToTop.timezone-boundaries.test.tsx > ReturnToTop Timezone Normalization & Calendar Data Boundary Alignment > 1. mocks standard timezone settings (UTC, EST, IST, JST) while the button mounts correctly +React does not recognize the `whileHover` prop on a DOM element. If you intentionally want it to appear in the DOM as a custom attribute, spell it as lowercase `whilehover` instead. If you accidentally passed it from a parent component, remove it from the DOM element. +React does not recognize the `whileTap` prop on a DOM element. If you intentionally want it to appear in the DOM as a custom attribute, spell it as lowercase `whiletap` instead. If you accidentally passed it from a parent component, remove it from the DOM element. + + ✓ components/ReturnToTop.timezone-boundaries.test.tsx (5 tests) 545ms + ✓ 1. mocks standard timezone settings (UTC, EST, IST, JST) while the button mounts correctly 467ms + ✓ components/dashboard/StatsCardSkeleton.mouse-interactivity.test.tsx (5 tests) 1577ms + ✓ triggers mouseenter and mouseleave on the skeleton container without errors 1006ms + ✓ lib/i18n/badgeLabels.empty-fallback.test.ts (5 tests) 711ms + ✓ Case 3: Assert standard CSS/style classes or properties remain intact on the default empty container element layout state 445ms + ✓ components/dashboard/GrowthTrendChart.timezone-boundaries.test.tsx (5 tests) 867ms + ✓ 1. Timezone Normalization Across Regions: ensures system instants resolve to appropriate timezone-specific month ranges 351ms + ✓ app/customize/components/ExportPanel.responsive-breakpoints.test.tsx (4 tests) 305ms + ✓ components/TopRivalriesTicker.responsive-breakpoints.test.tsx (5 tests) 942ms + ✓ components/dashboard/RefreshButton.timezone-boundaries.test.tsx (5 tests) 1220ms + ✓ 1. mocks standard timezone settings (e.g., UTC, EST, IST, and JST) 1049ms + ✓ app/(root)/dashboard/layout.accessibility.test.tsx (5 tests) 666ms + ✓ renders the main landmark element 457ms + ✓ components/dashboard/AIInsightsSkeleton.responsive-breakpoints.test.tsx (5 tests) 403ms + ✓ app/compare/CompareClient.error-resilience.test.tsx (5 tests) 768ms + ✓ Test 5: should ensure user reset/reload paths are available on the recovery panels 463ms + ✓ app/components/theme-switch.theme-contrast.test.tsx (5 tests) 1198ms + ✓ renders toggle button in light theme environment 796ms + ✓ components/dashboard/PRInsights/ReviewAnalytics.accessibility.test.tsx (5 tests) 940ms + ✓ renders the analytics heading 670ms + ✓ app/generator/GeneratorClient.error-resilience.test.tsx (5 tests) 270ms + ✓ app/generator/components/SectionCard.theme-contrast.test.tsx (6 tests) 672ms + ✓ toggles content visibility when the header button is clicked 460ms +stderr | components/dashboard/AIInsights.theme-contrast.test.tsx > AIInsights - Theme Contrast & Visual Cohesion > renders correctly in light theme with proper structure +React does not recognize the `whileInView` prop on a DOM element. If you intentionally want it to appear in the DOM as a custom attribute, spell it as lowercase `whileinview` instead. If you accidentally passed it from a parent component, remove it from the DOM element. + + ✓ components/GithubAuthButton.test.tsx (5 tests) 980ms + ✓ renders "Sign in with GitHub" when there is no session 773ms + ✓ components/dashboard/AIInsights.theme-contrast.test.tsx (5 tests) 1040ms + ✓ ensures text remains visible in light mode (contrast proxy check) 690ms + ✓ components/dashboard/PRInsights/Highlights.mouse-interactivity.test.tsx (5 tests) 570ms + ✓ 1. triggers simulated mouseenter/hover gestures on active segments or interactive nodes 378ms + ✓ components/ReturnToTop.responsive-breakpoints.test.tsx (5 tests) 1545ms + ✓ uses standard mobile media coordinates and edge-safe positioning 1240ms + ✓ hooks/useGitHubUserExists.test.ts (6 tests) 357ms + ✓ app/generator/data/technologies.theme-contrast.test.tsx (5 tests) 1760ms + ✓ 1. should emulate both dark and light presets 641ms + ✓ 3. should verify contrast ratio standards are satisfied for all textual elements 418ms + ✓ components/TopRivalriesTicker.timezone-boundaries.test.tsx (5 tests) 466ms + ✓ app/generator/components/sections/TechnologyGraph.timezone-boundaries.test.tsx (5 tests) 1801ms + ✓ 1. renders successfully with mocked timezone offset configurations 949ms + ✓ components/AnimatedCursor.theme-contrast.test.tsx (5 tests) 455ms + ✓ components/dashboard/ActivityLandscape.test.tsx (7 tests) 1671ms + ✓ renders Activity Landscape heading 421ms + ✓ shows pointer cursor styling on timeframe tabs 359ms + ✓ activates 1W tab when clicked 309ms + ✓ components/dashboard/ContributionCity3D.mock-integration.test.tsx (10 tests) 761ms + ✓ components/dashboard/ResumeUpload.timezone-boundaries.test.tsx (5 tests) 1089ms + ✓ should preserve resume dates consistently when parsed from different timezone contexts 770ms + ✓ app/documentation/code-block.error-resilience.test.tsx (5 tests) 934ms + ✓ Test 1: should catch runtime exceptions in nested child components using an Error Boundary 318ms + ✓ Test 5: should gracefully handle clipboard API rejection errors without crashing 487ms + ✓ components/dashboard/AchievementsSkeleton.error-resilience.test.tsx (5 tests) 867ms + ✓ renders a clean error recovery UI representation instead of crashing the page 354ms + ✓ app/components/CopyRepoButton.responsive-breakpoints.test.tsx (5 tests) 1528ms + ✓ mocks standard mobile-width media coordinates correctly 1237ms + ✓ components/ReturnToTop.mock-integrations.test.tsx (5 tests) 1741ms + ✓ Case 1: Mock standard asynchronous imports and databases using stubs and verify scrolling state loading 1414ms + ✓ app/generator/components/sections/DescriptionSection.theme-contrast.test.tsx (5 tests) 1364ms + ✓ renders correctly in light theme with proper structure 423ms + ✓ ensures text remains visible in light mode (contrast proxy check) 771ms + ✓ components/commitpulse-logo.error-resilience.test.tsx (5 tests) 1125ms + ✓ provides a retry path and invokes reset handling 463ms + ✓ hooks/useDebounce.mouse-interactivity.test.tsx (5 tests) 885ms + ✓ shows tooltip after mouseenter debounce delay 747ms +stderr | components/dashboard/PRInsights/TopMetricsRow.empty-fallback.test.tsx > TopMetricsRow Empty/Missing Inputs Verification > renders successfully with zero-value metrics without crashing +React does not recognize the `whileHover` prop on a DOM element. If you intentionally want it to appear in the DOM as a custom attribute, spell it as lowercase `whilehover` instead. If you accidentally passed it from a parent component, remove it from the DOM element. +Unknown event handler property `onHoverStart`. It will be ignored. +Unknown event handler property `onHoverEnd`. It will be ignored. + + ✓ components/dashboard/PRInsights/TopMetricsRow.empty-fallback.test.tsx (5 tests) 528ms + ✓ app/components/Footer.timezone-boundaries.test.tsx (5 tests) 817ms + ✓ components/DiscordButton.timezone-boundaries.test.tsx (5 tests) 2207ms + ✓ renders correctly 1827ms + ✓ components/FeatureCards.accessibility.test.tsx (5 tests) 1275ms + ✓ renders the primary section heading 992ms + ✓ components/DiscordButton.mock-integrations.test.tsx (5 tests) 777ms + ✓ renders integration link correctly 646ms + ✓ app/components/CustomizeCTA.empty-fallback.test.tsx (5 tests) 544ms + ✓ renders CTA button even when translations are null-like 434ms + ✓ components/ReturnToTop.error-resilience.test.tsx (5 tests) 583ms + ✓ components/AnimatedCursor.responsive-breakpoints.test.tsx (5 tests) 636ms + ✓ 1. renders correctly on mobile viewport 359ms + ✓ app/api/og/route.theme-contrast.test.tsx (5 tests) 343ms + ✓ app/components/SuccessGuide.mock-integrations.test.tsx (5 tests) 544ms + ✓ renders a pending state overlay while the async service is loading 347ms + ✓ lib/svg/themes.empty-fallback.test.ts (5 tests) 629ms + ✓ Case 1: Render with null/undefined theme parameters and verify fallback to default "dark" theme constants 428ms + ✓ components/dashboard/VisualizationTooltip.responsive-breakpoints.test.tsx (5 tests) 1081ms + ✓ renders correctly on a mobile-width viewport 972ms + ✓ components/BrandParticles.empty-fallback.test.tsx (5 tests) 1383ms + ✓ renders stably when parameters or option configs are completely empty 630ms + ✓ displays a fallback structure consisting of standard particle layers even with zero initial inputs 365ms + ✓ components/dashboard/GithubWrapped.timezone-boundaries.test.tsx (5 tests) 701ms + ✓ renders correctly in UTC timezone 335ms + ✓ components/commitpulse-logo.mock-integrations.test.tsx (5 tests) 395ms + ✓ components/CherryBlossom.accessibility.test.tsx (5 tests) 805ms + ✓ components/dashboard/GithubWrapped.responsive-breakpoints.test.tsx (5 tests) 1164ms + ✓ renders safely on mobile viewport width 605ms + ✓ components/GithubAuthButton.accessibility.test.tsx (6 tests) 2668ms + ✓ renders a native <button> element — keyboard and screen reader accessible by default 2336ms + ✓ components/dashboard/VisualizationTooltip.empty-fallback.test.tsx (5 tests) 3871ms + ✓ renders without runtime errors when children is null 2956ms + ✓ app/contributors/loading.accessibility.test.tsx (5 tests) 1703ms + ✓ exposes the loading state through a screen-reader status region 1433ms + ✓ components/dashboard/RepositoryGraph.test.tsx (7 tests) 1696ms + ✓ renders the empty state if data has 1 or fewer nodes 426ms + ✓ displays a tooltip on node hover 441ms + ✓ components/dashboard/ResumeUpload.responsive-breakpoints.test.tsx (5 tests) 1848ms + ✓ renders correctly on mobile viewport 637ms + ✓ supports narrow mobile widths without crashing 882ms + ✓ components/TopRivalriesTicker.test.tsx (2 tests) 696ms + ✓ renders the component and mock rivalries 435ms + ✓ components/dashboard/StatsCard.mouse-interactivity.test.tsx (5 tests) 561ms + ✓ components/CherryBlossom.responsive-breakpoints.test.tsx (5 tests) 2940ms + ✓ verifies overlay viewport coverage and non-blocking layout across screen sizes 425ms + ✓ asserts background branches are absolutely positioned to anchor at viewport corners 600ms + ✓ verifies fluid responsive units (vw/vh) are used for petal coordinates and motion paths 1089ms + ✓ verifies render count stability of petals under simulated mobile, tablet, and desktop viewports 601ms + ✓ components/dashboard/LanguageChart.responsive-breakpoints.test.tsx (5 tests) 449ms + ✓ app/customize/components/ExportPanel.mock-integration.test.tsx (5 tests) 313ms +stdout | app/api/streak/tests/grace.test.ts > Grace Parameter Integration Tests > Test 1: Valid grace parameter parsing and rendering (grace=0) > should return 200 with valid SVG when grace=0 is provided +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"87b9abe1-d4cf-419e-8ab4-60f7d54c5837"} + +stdout | app/api/streak/tests/grace.test.ts > Grace Parameter Integration Tests > Test 1: Valid grace parameter parsing and rendering (grace=0) > should return 200 with valid SVG when grace=0 is provided +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":49,"requestId":"87b9abe1-d4cf-419e-8ab4-60f7d54c5837"} + +stdout | app/api/streak/tests/grace.test.ts > Grace Parameter Integration Tests > Test 1: Valid grace parameter parsing and rendering (grace=0) > should include proper Cache-Control header for grace=0 response +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"1309d253-a7a3-4b24-a6c6-c73d71bf1079"} + +stdout | app/api/streak/tests/grace.test.ts > Grace Parameter Integration Tests > Test 1: Valid grace parameter parsing and rendering (grace=0) > should include proper Cache-Control header for grace=0 response +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":6,"requestId":"1309d253-a7a3-4b24-a6c6-c73d71bf1079"} + +stdout | app/api/streak/tests/grace.test.ts > Grace Parameter Integration Tests > Test 1: Valid grace parameter parsing and rendering (grace=0) > should include Content-Security-Policy header for SVG safety +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"af271486-34e0-4fbf-86be-da1be2217af0"} + +stdout | app/api/streak/tests/grace.test.ts > Grace Parameter Integration Tests > Test 1: Valid grace parameter parsing and rendering (grace=0) > should include Content-Security-Policy header for SVG safety +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"af271486-34e0-4fbf-86be-da1be2217af0"} + +stdout | app/api/streak/tests/grace.test.ts > Grace Parameter Integration Tests > Test 2: Maximum valid grace parameter (grace=7) > should return 200 with valid SVG when grace=7 is provided +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"7ee066cd-88fd-4948-8c7b-23da5b3e5ee5"} + +stdout | app/api/streak/tests/grace.test.ts > Grace Parameter Integration Tests > Test 2: Maximum valid grace parameter (grace=7) > should return 200 with valid SVG when grace=7 is provided +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":5,"requestId":"7ee066cd-88fd-4948-8c7b-23da5b3e5ee5"} + +stdout | app/api/streak/tests/grace.test.ts > Grace Parameter Integration Tests > Test 2: Maximum valid grace parameter (grace=7) > should allow streak to persist through grace period with grace=7 +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"8fc95bfa-0431-4c04-b09c-e81b7bba7870"} + +stdout | app/api/streak/tests/grace.test.ts > Grace Parameter Integration Tests > Test 2: Maximum valid grace parameter (grace=7) > should allow streak to persist through grace period with grace=7 +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":5,"requestId":"8fc95bfa-0431-4c04-b09c-e81b7bba7870"} + +stdout | app/api/streak/tests/grace.test.ts > Grace Parameter Integration Tests > Test 3: Invalid grace parameter values (out of range and non-integer) > should clamp grace=-1 to 0 and return 200 +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"68348f0d-f45f-4fb4-a285-62555de3e6c2"} + +stdout | app/api/streak/tests/grace.test.ts > Grace Parameter Integration Tests > Test 3: Invalid grace parameter values (out of range and non-integer) > should clamp grace=-1 to 0 and return 200 +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":5,"requestId":"68348f0d-f45f-4fb4-a285-62555de3e6c2"} + +stdout | app/api/streak/tests/grace.test.ts > Grace Parameter Integration Tests > Test 3: Invalid grace parameter values (out of range and non-integer) > should clamp grace=8 to 7 and return 200 +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"07272a22-ad5b-4953-893e-4877232c45bd"} + +stdout | app/api/streak/tests/grace.test.ts > Grace Parameter Integration Tests > Test 3: Invalid grace parameter values (out of range and non-integer) > should clamp grace=8 to 7 and return 200 +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":5,"requestId":"07272a22-ad5b-4953-893e-4877232c45bd"} + +stdout | app/api/streak/tests/grace.test.ts > Grace Parameter Integration Tests > Test 3: Invalid grace parameter values (out of range and non-integer) > should call GitHub API even when grace is out of range (clamped) +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"9732fc89-72af-4897-a1b3-620b12f791e1"} + +stdout | app/api/streak/tests/grace.test.ts > Grace Parameter Integration Tests > Test 3: Invalid grace parameter values (out of range and non-integer) > should call GitHub API even when grace is out of range (clamped) +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"9732fc89-72af-4897-a1b3-620b12f791e1"} + +stdout | app/api/streak/tests/grace.test.ts > Grace Parameter Integration Tests > Test 4: Default grace value and fallback behavior > should default to grace=1 when grace parameter is missing +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"183a4768-683c-4e97-8749-e9db3fe141d6"} + +stdout | app/api/streak/tests/grace.test.ts > Grace Parameter Integration Tests > Test 4: Default grace value and fallback behavior > should default to grace=1 when grace parameter is missing +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"183a4768-683c-4e97-8749-e9db3fe141d6"} + +stdout | app/api/streak/tests/grace.test.ts > Grace Parameter Integration Tests > Test 4: Default grace value and fallback behavior > should handle empty grace parameter gracefully (default to 1) +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"f2fd20ad-51ff-47e6-8a83-f05a776daf98"} + +stdout | app/api/streak/tests/grace.test.ts > Grace Parameter Integration Tests > Test 4: Default grace value and fallback behavior > should handle empty grace parameter gracefully (default to 1) +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"f2fd20ad-51ff-47e6-8a83-f05a776daf98"} + +stdout | app/api/streak/tests/grace.test.ts > Grace Parameter Integration Tests > Test 5: SVG rendering variations with different grace values and HTTP headers > should render valid SVG with grace=0 +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"554375b5-a067-47cd-8d9a-d5503199d17c"} + +stdout | app/api/streak/tests/grace.test.ts > Grace Parameter Integration Tests > Test 5: SVG rendering variations with different grace values and HTTP headers > should render valid SVG with grace=0 +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"554375b5-a067-47cd-8d9a-d5503199d17c"} + +stdout | app/api/streak/tests/grace.test.ts > Grace Parameter Integration Tests > Test 5: SVG rendering variations with different grace values and HTTP headers > should render valid SVG with grace=3 (middle value) +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"ff99f4ea-845d-4d9d-bf96-56297fdd79e8"} + +stdout | app/api/streak/tests/grace.test.ts > Grace Parameter Integration Tests > Test 5: SVG rendering variations with different grace values and HTTP headers > should render valid SVG with grace=3 (middle value) +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"ff99f4ea-845d-4d9d-bf96-56297fdd79e8"} + +stdout | app/api/streak/tests/grace.test.ts > Grace Parameter Integration Tests > Test 5: SVG rendering variations with different grace values and HTTP headers > should render valid SVG with grace=7 +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"497f4918-b4e3-4489-97c5-2f17483f21bc"} + +stdout | app/api/streak/tests/grace.test.ts > Grace Parameter Integration Tests > Test 5: SVG rendering variations with different grace values and HTTP headers > should render valid SVG with grace=7 +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":0,"requestId":"497f4918-b4e3-4489-97c5-2f17483f21bc"} + +stdout | app/api/streak/tests/grace.test.ts > Grace Parameter Integration Tests > Test 5: SVG rendering variations with different grace values and HTTP headers > should include X-Cache-Status header in response +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"0f91cd50-f6c6-47d1-8183-66ea4d621a0c"} + +stdout | app/api/streak/tests/grace.test.ts > Grace Parameter Integration Tests > Test 5: SVG rendering variations with different grace values and HTTP headers > should include X-Cache-Status header in response +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"0f91cd50-f6c6-47d1-8183-66ea4d621a0c"} + +stdout | app/api/streak/tests/grace.test.ts > Grace Parameter Integration Tests > Test 5: SVG rendering variations with different grace values and HTTP headers > should maintain HTTP 200 status for all valid grace values (0-7) +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"433c478a-9369-46a4-ad30-4b8d152ad33e"} + +stderr | components/dashboard/PRInsights/PRInsightsClient.mock-integrations.test.tsx > PRInsightsClient - Asynchronous Service Layer Mocking & Local Cache Stubs > 1. mocks standard asynchronous imports and databases using stubs +The width(-1) and height(-1) of chart should be greater than 0, + please check the style of container, or the props width(100%) and height(100%), + or add a minWidth(0) or minHeight(undefined) or use aspect(undefined) to control the + height and width. + +stdout | app/api/streak/tests/grace.test.ts > Grace Parameter Integration Tests > Test 5: SVG rendering variations with different grace values and HTTP headers > should maintain HTTP 200 status for all valid grace values (0-7) +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":0,"requestId":"433c478a-9369-46a4-ad30-4b8d152ad33e"} + +stdout | app/api/streak/tests/grace.test.ts > Grace Parameter Integration Tests > Test 5: SVG rendering variations with different grace values and HTTP headers > should maintain HTTP 200 status for all valid grace values (0-7) +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"faa9d923-b08b-42ce-be7a-cccbabbeeb4e"} + +stdout | app/api/streak/tests/grace.test.ts > Grace Parameter Integration Tests > Test 5: SVG rendering variations with different grace values and HTTP headers > should maintain HTTP 200 status for all valid grace values (0-7) +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":3,"requestId":"faa9d923-b08b-42ce-be7a-cccbabbeeb4e"} + +stdout | app/api/streak/tests/grace.test.ts > Grace Parameter Integration Tests > Test 5: SVG rendering variations with different grace values and HTTP headers > should maintain HTTP 200 status for all valid grace values (0-7) +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"4f7b27bc-b676-4049-b91f-dd2eea561e49"} + +stdout | app/api/streak/tests/grace.test.ts > Grace Parameter Integration Tests > Test 5: SVG rendering variations with different grace values and HTTP headers > should maintain HTTP 200 status for all valid grace values (0-7) +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"4f7b27bc-b676-4049-b91f-dd2eea561e49"} + +stdout | app/api/streak/tests/grace.test.ts > Grace Parameter Integration Tests > Test 5: SVG rendering variations with different grace values and HTTP headers > should maintain HTTP 200 status for all valid grace values (0-7) +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"42be79d5-4bfb-4075-b32a-d6112fd29b23"} + +stdout | app/api/streak/tests/grace.test.ts > Grace Parameter Integration Tests > Test 5: SVG rendering variations with different grace values and HTTP headers > should maintain HTTP 200 status for all valid grace values (0-7) +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"42be79d5-4bfb-4075-b32a-d6112fd29b23"} + +stdout | app/api/streak/tests/grace.test.ts > Grace Parameter Integration Tests > Test 5: SVG rendering variations with different grace values and HTTP headers > should maintain HTTP 200 status for all valid grace values (0-7) +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"abb3b2fa-496c-4dee-9ea0-bac4880c3e51"} + +stdout | app/api/streak/tests/grace.test.ts > Grace Parameter Integration Tests > Test 5: SVG rendering variations with different grace values and HTTP headers > should maintain HTTP 200 status for all valid grace values (0-7) +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"abb3b2fa-496c-4dee-9ea0-bac4880c3e51"} + +stdout | app/api/streak/tests/grace.test.ts > Grace Parameter Integration Tests > Test 5: SVG rendering variations with different grace values and HTTP headers > should maintain HTTP 200 status for all valid grace values (0-7) +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"4e10768d-6262-43bb-99c6-2815dd76031f"} + +stdout | app/api/streak/tests/grace.test.ts > Grace Parameter Integration Tests > Test 5: SVG rendering variations with different grace values and HTTP headers > should maintain HTTP 200 status for all valid grace values (0-7) +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"4e10768d-6262-43bb-99c6-2815dd76031f"} + +stdout | app/api/streak/tests/grace.test.ts > Grace Parameter Integration Tests > Test 5: SVG rendering variations with different grace values and HTTP headers > should maintain HTTP 200 status for all valid grace values (0-7) +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"b7098c97-1bdf-4ffb-874d-1815d817eead"} + +stdout | app/api/streak/tests/grace.test.ts > Grace Parameter Integration Tests > Test 5: SVG rendering variations with different grace values and HTTP headers > should maintain HTTP 200 status for all valid grace values (0-7) +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"b7098c97-1bdf-4ffb-874d-1815d817eead"} + +stderr | components/dashboard/PRInsights/PRInsightsClient.mock-integrations.test.tsx > PRInsightsClient - Asynchronous Service Layer Mocking & Local Cache Stubs > 3. asserts local cache layers are queried before triggering database retrievals +The width(-1) and height(-1) of chart should be greater than 0, + please check the style of container, or the props width(100%) and height(100%), + or add a minWidth(0) or minHeight(undefined) or use aspect(undefined) to control the + height and width. + +stdout | app/api/streak/tests/grace.test.ts > Grace Parameter Integration Tests > Test 5: SVG rendering variations with different grace values and HTTP headers > should maintain HTTP 200 status for all valid grace values (0-7) +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"81737350-1427-42c5-8d44-4f8e5025cd71"} + +stdout | app/api/streak/tests/grace.test.ts > Grace Parameter Integration Tests > Test 5: SVG rendering variations with different grace values and HTTP headers > should maintain HTTP 200 status for all valid grace values (0-7) +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"81737350-1427-42c5-8d44-4f8e5025cd71"} + +stdout | app/api/streak/tests/grace.test.ts > Grace Parameter Integration Tests > Test 5: SVG rendering variations with different grace values and HTTP headers > should preserve Cache-Control header format across grace values +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"ad5d51a4-16b2-49d1-8e87-9c15e1d351e4"} + +stdout | app/api/streak/tests/grace.test.ts > Grace Parameter Integration Tests > Test 5: SVG rendering variations with different grace values and HTTP headers > should preserve Cache-Control header format across grace values +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"ad5d51a4-16b2-49d1-8e87-9c15e1d351e4"} + +stdout | app/api/streak/tests/grace.test.ts > Grace Parameter Integration Tests > Test 5: SVG rendering variations with different grace values and HTTP headers > should preserve Cache-Control header format across grace values +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"de95ee75-3ef4-4661-bd28-86da8efb8de3"} + +stdout | app/api/streak/tests/grace.test.ts > Grace Parameter Integration Tests > Test 5: SVG rendering variations with different grace values and HTTP headers > should preserve Cache-Control header format across grace values +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"de95ee75-3ef4-4661-bd28-86da8efb8de3"} + +stdout | app/api/streak/tests/grace.test.ts > Grace Parameter Integration Tests > Test 5: SVG rendering variations with different grace values and HTTP headers > should preserve Cache-Control header format across grace values +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"60f8f2dd-54eb-495c-a264-666dbf58620e"} + +stdout | app/api/streak/tests/grace.test.ts > Grace Parameter Integration Tests > Test 5: SVG rendering variations with different grace values and HTTP headers > should preserve Cache-Control header format across grace values +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":0,"requestId":"60f8f2dd-54eb-495c-a264-666dbf58620e"} + +stdout | app/api/streak/tests/grace.test.ts > Grace Parameter Integration Tests > Test 5: SVG rendering variations with different grace values and HTTP headers > should preserve Cache-Control header format across grace values +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"1414d061-c1e8-441e-ae91-b44e53ee4bea"} + +stdout | app/api/streak/tests/grace.test.ts > Grace Parameter Integration Tests > Test 5: SVG rendering variations with different grace values and HTTP headers > should preserve Cache-Control header format across grace values +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"1414d061-c1e8-441e-ae91-b44e53ee4bea"} + + ✓ app/api/streak/tests/grace.test.ts (16 tests) 530ms +stderr | components/dashboard/PRInsights/PRInsightsClient.mock-integrations.test.tsx > PRInsightsClient - Asynchronous Service Layer Mocking & Local Cache Stubs > 5. asserts complete cache sync is written on success callbacks +The width(-1) and height(-1) of chart should be greater than 0, + please check the style of container, or the props width(100%) and height(100%), + or add a minWidth(0) or minHeight(undefined) or use aspect(undefined) to control the + height and width. + + ✓ components/dashboard/PRInsights/PRInsightsClient.mock-integrations.test.tsx (5 tests) 582ms + ✓ components/dashboard/StatsCard.theme-contrast.test.tsx (5 tests) 658ms + ✓ 5. ensures that background overlays do not clip foreground content colors 412ms +stderr | components/dashboard/StatsCard.test.tsx > StatsCard > should render the title prop text +React does not recognize the `whileInView` prop on a DOM element. If you intentionally want it to appear in the DOM as a custom attribute, spell it as lowercase `whileinview` instead. If you accidentally passed it from a parent component, remove it from the DOM element. +React does not recognize the `whileHover` prop on a DOM element. If you intentionally want it to appear in the DOM as a custom attribute, spell it as lowercase `whilehover` instead. If you accidentally passed it from a parent component, remove it from the DOM element. + + ✓ components/dashboard/StatsCard.test.tsx (7 tests) 276ms + ✓ components/dashboard/GithubWrapped.mouse-interactivity.test.tsx (5 tests) 726ms + ✓ renders interactive wrapped container safely 385ms + ✓ components/dashboard/HistoricalTrendView.mock-integrations.test.tsx (5 tests) 905ms + ✓ 1. Mock standard asynchronous imports and databases using stubs 576ms + ✓ app/contributors/loading.test.tsx (5 tests) 1695ms + ✓ renders loading fallback component 1205ms + ✓ components/AnimatedCursor.error-resilience.test.tsx (5 tests) 507ms + ✓ app/(root)/dashboard/layout.empty-fallback.test.tsx (5 tests) 519ms + ✓ renders safely with null children 446ms +stderr | components/dashboard/PRInsights/PRInsightsClient.responsive-breakpoints.test.tsx > PRInsightsClient Responsive Multi-device Columns & Mobile Viewport Layouts > 1. mocks standard mobile-width media coordinates (e.g. 375px wide viewports) +An update to PRInsightsClient inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act +An update to PRInsightsClient inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act + +stderr | components/dashboard/PRInsights/PRInsightsClient.responsive-breakpoints.test.tsx > PRInsightsClient Responsive Multi-device Columns & Mobile Viewport Layouts > 2. asserts that columns reflow into standard vertical flex lists +TypeError: Cannot read properties of undefined (reading 'toFixed') + at TopMetricsRow (/home/atulupadhyay/Contribution/commitpulse/components/dashboard/PRInsights/TopMetricsRow.tsx:89:31) + at Object.react_stack_bottom_frame (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:25904:20) + at renderWithHooks (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:7662:22) + at updateFunctionComponent (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:10166:19) + at beginWork (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:11778:18) + at runWithFiberInDEV (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:874:13) + at performUnitOfWork (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:17641:22) + at workLoopSync (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:17469:41) + at renderRootSync (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:17450:11) + at performWorkOnRoot (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:16583:35) { + [stack]: [Getter/Setter], + [message]: "Cannot read properties of undefined (reading 'toFixed')" +} + +The above error occurred in the <TopMetricsRow> component. + +React will try to recreate this component tree from scratch using the error boundary you provided, y. + +[ERROR] PRInsightsClient render exception {"message":"Cannot read properties of undefined (reading 'toFixed')","componentStack":"\n at TopMetricsRow (/home/atulupadhyay/Contribution/commitpulse/components/dashboard/PRInsights/TopMetricsRow.tsx:109:26)\n at div (<anonymous>)\n at y (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-error-boundary/dist/react-error-boundary.cjs:1:213)\n at PRInsightsClient (/home/atulupadhyay/Contribution/commitpulse/components/dashboard/PRInsights/PRInsightsClient.tsx:68:29)"} + +stderr | components/dashboard/PRInsights/PRInsightsClient.responsive-breakpoints.test.tsx > PRInsightsClient Responsive Multi-device Columns & Mobile Viewport Layouts > 3. verifies styling values are not absolute widths that cause horizontal scrollbars on smaller viewports +TypeError: Cannot read properties of undefined (reading 'toFixed') + at TopMetricsRow (/home/atulupadhyay/Contribution/commitpulse/components/dashboard/PRInsights/TopMetricsRow.tsx:89:31) + at Object.react_stack_bottom_frame (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:25904:20) + at renderWithHooks (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:7662:22) + at updateFunctionComponent (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:10166:19) + at beginWork (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:11778:18) + at runWithFiberInDEV (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:874:13) + at performUnitOfWork (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:17641:22) + at workLoopSync (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:17469:41) + at renderRootSync (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:17450:11) + at performWorkOnRoot (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:16583:35) { + [stack]: [Getter/Setter], + [message]: "Cannot read properties of undefined (reading 'toFixed')" +} + +The above error occurred in the <TopMetricsRow> component. + +React will try to recreate this component tree from scratch using the error boundary you provided, y. + +[ERROR] PRInsightsClient render exception {"message":"Cannot read properties of undefined (reading 'toFixed')","componentStack":"\n at TopMetricsRow (/home/atulupadhyay/Contribution/commitpulse/components/dashboard/PRInsights/TopMetricsRow.tsx:109:26)\n at div (<anonymous>)\n at y (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-error-boundary/dist/react-error-boundary.cjs:1:213)\n at PRInsightsClient (/home/atulupadhyay/Contribution/commitpulse/components/dashboard/PRInsights/PRInsightsClient.tsx:68:29)"} + +stderr | components/dashboard/PRInsights/PRInsightsClient.responsive-breakpoints.test.tsx > PRInsightsClient Responsive Multi-device Columns & Mobile Viewport Layouts > 4. checks that navigation components scale down gracefully +TypeError: Cannot read properties of undefined (reading 'toFixed') + at TopMetricsRow (/home/atulupadhyay/Contribution/commitpulse/components/dashboard/PRInsights/TopMetricsRow.tsx:89:31) + at Object.react_stack_bottom_frame (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:25904:20) + at renderWithHooks (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:7662:22) + at updateFunctionComponent (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:10166:19) + at beginWork (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:11778:18) + at runWithFiberInDEV (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:874:13) + at performUnitOfWork (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:17641:22) + at workLoopSync (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:17469:41) + at renderRootSync (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:17450:11) + at performWorkOnRoot (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:16583:35) { + [stack]: [Getter/Setter], + [message]: "Cannot read properties of undefined (reading 'toFixed')" +} + +The above error occurred in the <TopMetricsRow> component. + +React will try to recreate this component tree from scratch using the error boundary you provided, y. + +[ERROR] PRInsightsClient render exception {"message":"Cannot read properties of undefined (reading 'toFixed')","componentStack":"\n at TopMetricsRow (/home/atulupadhyay/Contribution/commitpulse/components/dashboard/PRInsights/TopMetricsRow.tsx:109:26)\n at div (<anonymous>)\n at y (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-error-boundary/dist/react-error-boundary.cjs:1:213)\n at PRInsightsClient (/home/atulupadhyay/Contribution/commitpulse/components/dashboard/PRInsights/PRInsightsClient.tsx:68:29)"} + +stderr | components/dashboard/PRInsights/PRInsightsClient.responsive-breakpoints.test.tsx > PRInsightsClient Responsive Multi-device Columns & Mobile Viewport Layouts > 5. asserts mobile-specific toggle states respond cleanly +TypeError: Cannot read properties of undefined (reading 'toFixed') + at TopMetricsRow (/home/atulupadhyay/Contribution/commitpulse/components/dashboard/PRInsights/TopMetricsRow.tsx:89:31) + at Object.react_stack_bottom_frame (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:25904:20) + at renderWithHooks (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:7662:22) + at updateFunctionComponent (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:10166:19) + at beginWork (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:11778:18) + at runWithFiberInDEV (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:874:13) + at performUnitOfWork (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:17641:22) + at workLoopSync (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:17469:41) + at renderRootSync (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:17450:11) + at performWorkOnRoot (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:16583:35) { + [stack]: [Getter/Setter], + [message]: "Cannot read properties of undefined (reading 'toFixed')" +} + +The above error occurred in the <TopMetricsRow> component. + +React will try to recreate this component tree from scratch using the error boundary you provided, y. + +[ERROR] PRInsightsClient render exception {"message":"Cannot read properties of undefined (reading 'toFixed')","componentStack":"\n at TopMetricsRow (/home/atulupadhyay/Contribution/commitpulse/components/dashboard/PRInsights/TopMetricsRow.tsx:109:26)\n at div (<anonymous>)\n at y (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-error-boundary/dist/react-error-boundary.cjs:1:213)\n at PRInsightsClient (/home/atulupadhyay/Contribution/commitpulse/components/dashboard/PRInsights/PRInsightsClient.tsx:68:29)"} + + ✓ components/dashboard/PRInsights/PRInsightsClient.responsive-breakpoints.test.tsx (5 tests) 456ms + ✓ components/FeatureCards.timezone-boundaries.test.tsx (5 tests) 1143ms + ✓ renders section heading correctly 869ms +stderr | app/layout.timezone-boundaries.test.tsx > RootLayout - Timezone Normalization & Calendar Data Boundary Alignment > 1. mocks standard timezone settings (e.g., UTC, EST, IST, and JST) +In HTML, <html> cannot be a child of <div>. +This will cause a hydration error. + + ✓ app/layout.timezone-boundaries.test.tsx (5 tests) 1015ms + ✓ 1. mocks standard timezone settings (e.g., UTC, EST, IST, and JST) 507ms + ✓ 2. asserts calculations align commits onto the correct visual dates 357ms + ✓ components/AnimatedCursor.empty-fallback.test.tsx (5 tests) 713ms + ✓ renders the fallback null output (nothing mounted) when prefers-reduced-motion is active 356ms + ✓ hooks/useDebounce.responsive-breakpoints.test.tsx (5 tests) 1445ms + ✓ applies mobile layout after 375px viewport debounce delay 305ms + ✓ does not use fixed widths that cause horizontal overflow 767ms + ✓ components/dashboard/ResumePreviewForm.error-resilience.test.tsx (5 tests) 918ms + ✓ handles missing required fields gracefully 409ms + ✓ app/generator/GeneratorClient.theme-contrast.test.tsx (5 tests) 894ms + ✓ models/User.test.ts (20 tests) 423ms + ✓ components/dashboard/PRInsights/TopMetricsRow.theme-contrast.test.tsx (5 tests) 678ms + ✓ renders correctly in light mode 318ms + ✓ app/customize/components/AdvancedSettingsPanel.massive_scaling.test.tsx (5 tests) 1050ms + ✓ renders successfully with maximum supported dimension values 497ms + ✓ components/dashboard/HistoricalTrendView.timezone-boundaries.test.tsx (5 tests) 441ms +stderr | app/components/FeatureCard.mock-integrations.test.tsx > FeatureCard - mock integrations > renders data from mocked service layer without making real network calls +React does not recognize the `whileHover` prop on a DOM element. If you intentionally want it to appear in the DOM as a custom attribute, spell it as lowercase `whilehover` instead. If you accidentally passed it from a parent component, remove it from the DOM element. + + ✓ components/dashboard/VisualizationTooltip.mock-integrations.test.tsx (5 tests) 668ms + ✓ asserts the tooltip uses the correct accessible roles for screen readers 333ms + ✓ app/contributors/ContributorsSearch.error-resilience.test.tsx (5 tests) 400ms + ✓ components/ShareButtons.error-resilience.test.tsx (5 tests) 342ms + ✓ app/components/FeatureCard.mock-integrations.test.tsx (5 tests) 1479ms + ✓ renders empty fallback gracefully when mocked service returns empty cache stub 966ms + ✓ components/dashboard/RadarChart.empty-fallback.test.tsx (5 tests) 308ms + ✓ hooks/useShareActions.test.ts (8 tests) 625ms + ✓ components/dashboard/GithubWrapped.theme-contrast.test.tsx (5 tests) 704ms + ✓ preserves bg-black and text-white container colors to maintain high native contrast under all modes 481ms +Not implemented: navigation to another Document +Not implemented: navigation to another Document +Not implemented: navigation to another Document + ✓ hooks/useShareActions.mock-integrations.test.ts (5 tests) 506ms + ✓ components/dashboard/ActivityLandscape.responsive-breakpoints.test.tsx (5 tests) 963ms + ✓ reflows the header layout from row to column on mobile viewports 587ms + ✓ components/dashboard/ResumeProfileSection.mouse-interactivity.test.tsx (5 tests) 496ms + ✓ triggers simulated mouseenter/hover gestures on active segments or interactive nodes 318ms + ✓ components/dashboard/VisualizationTooltip.test.tsx (5 tests) 975ms + ✓ renders tooltip role 657ms + ✓ components/Leaderboard.responsive-breakpoints.test.tsx (5 tests) 248ms + ✓ app/contributors/ContributorsSearch.timezone-boundaries.test.tsx (5 tests) 540ms + ✓ mocks standard timezone settings (UTC, EST, IST, and JST) correctly 408ms +stdout | app/api/streak/route.error-resilience.test.ts > GET /api/streak — error resilience & exception safety > quota / refresh guard rails fail closed without crashing > returns a 429 fallback instead of throwing when GitHub quota is low on a refresh request +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"c765a6e7-9c69-4651-b82a-78f1a6e2e9c4"} + +stdout | app/api/streak/route.error-resilience.test.ts > GET /api/streak — error resilience & exception safety > quota / refresh guard rails fail closed without crashing > returns a 429 fallback instead of throwing when the refresh rate limiter rejects the request +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"592e1789-e7fd-446b-861e-14d9304257fb"} + +stdout | app/api/streak/route.error-resilience.test.ts > GET /api/streak — error resilience & exception safety > quota / refresh guard rails fail closed without crashing > degrades gracefully to cached data (200 OK) instead of erroring when a refresh cooldown is active +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"ab101ad3-674d-4ad5-8b5f-008e311964b4"} + +stdout | app/api/streak/route.error-resilience.test.ts > GET /api/streak — error resilience & exception safety > quota / refresh guard rails fail closed without crashing > degrades gracefully to cached data (200 OK) instead of erroring when a refresh cooldown is active +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":13,"requestId":"ab101ad3-674d-4ad5-8b5f-008e311964b4"} + +stdout | app/api/streak/route.error-resilience.test.ts > GET /api/streak — error resilience & exception safety > JSON output mode error fallbacks (format=json) > returns a structured 500 JSON error, not a crash, for an unrecognised upstream failure +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"f1103987-9ecd-4efd-8475-e14edb2b21a0"} + +stdout | app/api/streak/route.error-resilience.test.ts > GET /api/streak — error resilience & exception safety > JSON output mode error fallbacks (format=json) > returns a structured 500 JSON error, not a crash, for an unrecognised upstream failure +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"json","status":200,"durationMs":5,"requestId":"f1103987-9ecd-4efd-8475-e14edb2b21a0"} + +stdout | app/api/streak/route.error-resilience.test.ts > GET /api/streak — error resilience & exception safety > JSON output mode error fallbacks (format=json) > returns a structured 404 JSON error for an unknown user +[INFO] Incoming streak request {"source":"streak","user":"ghost","view":"default","requestId":"466d5dcb-80d5-4283-95a7-28e573081858"} + +stdout | app/api/streak/route.error-resilience.test.ts > GET /api/streak — error resilience & exception safety > JSON output mode error fallbacks (format=json) > returns a structured 404 JSON error for an unknown user +[INFO] Streak request completed {"source":"streak","user":"ghost","view":"default","format":"json","status":200,"durationMs":5,"requestId":"466d5dcb-80d5-4283-95a7-28e573081858"} + +stdout | app/api/streak/route.error-resilience.test.ts > GET /api/streak — error resilience & exception safety > JSON output mode error fallbacks (format=json) > returns a structured 429 JSON error with Retry-After for a rate limit failure +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"37b29aaa-5a18-4481-9d7a-1b55a3b961ca"} + +stdout | app/api/streak/route.error-resilience.test.ts > GET /api/streak — error resilience & exception safety > JSON output mode error fallbacks (format=json) > returns a structured 429 JSON error with Retry-After for a rate limit failure +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"json","status":200,"durationMs":2,"requestId":"37b29aaa-5a18-4481-9d7a-1b55a3b961ca"} + +stdout | app/api/streak/route.error-resilience.test.ts > GET /api/streak — error resilience & exception safety > JSON output mode error fallbacks (format=json) > returns a structured 400 JSON error with sanitized text for a validation failure +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"6ade98ec-6e25-4eaf-ad02-999acb29472c"} + +stdout | app/api/streak/route.error-resilience.test.ts > GET /api/streak — error resilience & exception safety > JSON output mode error fallbacks (format=json) > returns a structured 400 JSON error with sanitized text for a validation failure +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"json","status":200,"durationMs":12,"requestId":"6ade98ec-6e25-4eaf-ad02-999acb29472c"} + +stdout | app/api/streak/route.error-resilience.test.ts > GET /api/streak — error resilience & exception safety > JSON output mode error fallbacks (format=json) > produces a clean JSON 500 fallback when a non-Error value (plain object) is thrown +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"3aec05b7-5510-4ab5-8297-00b5ac70227e"} + +stdout | app/api/streak/route.error-resilience.test.ts > GET /api/streak — error resilience & exception safety > JSON output mode error fallbacks (format=json) > produces a clean JSON 500 fallback when a non-Error value (plain object) is thrown +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"json","status":200,"durationMs":1,"requestId":"3aec05b7-5510-4ab5-8297-00b5ac70227e"} + +stdout | app/api/streak/route.error-resilience.test.ts > GET /api/streak — error resilience & exception safety > SVG output mode: internal error details are never leaked > replaces a Zod/schema-flavoured validation message with a generic one in the fallback SVG +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"f6dfa236-dd88-47b9-985a-977883ebd660"} + +stdout | app/api/streak/route.error-resilience.test.ts > GET /api/streak — error resilience & exception safety > SVG output mode: internal error details are never leaked > replaces a Zod/schema-flavoured validation message with a generic one in the fallback SVG +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":21,"requestId":"f6dfa236-dd88-47b9-985a-977883ebd660"} + +stdout | app/api/streak/route.error-resilience.test.ts > GET /api/streak — error resilience & exception safety > SVG output mode: internal error details are never leaked > does not crash when a not-found error message has no quoted username to extract +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"7f9b5829-234a-4b42-a549-08a104a37207"} + +stdout | app/api/streak/route.error-resilience.test.ts > GET /api/streak — error resilience & exception safety > SVG output mode: internal error details are never leaked > does not crash when a not-found error message has no quoted username to extract +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":9,"requestId":"7f9b5829-234a-4b42-a549-08a104a37207"} + +stdout | app/api/streak/route.error-resilience.test.ts > GET /api/streak — error resilience & exception safety > SVG output mode: internal error details are never leaked > falls back to a 500 error SVG instead of crashing when the org dashboard throws an unexpected error +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"5e0bf21f-9901-4d77-9da2-d3328c6144d3"} + +stderr | app/api/streak/route.error-resilience.test.ts > GET /api/streak — error resilience & exception safety > SVG output mode: internal error details are never leaked > falls back to a 500 error SVG instead of crashing when the org dashboard throws an unexpected error +[ERROR] Unhandled error {"source":"streak","message":"Something went wrong. Please try again later.","requestId":"5e0bf21f-9901-4d77-9da2-d3328c6144d3"} + +stdout | app/api/streak/route.error-resilience.test.ts > GET /api/streak — error resilience & exception safety > SVG output mode: internal error details are never leaked > falls back to a 500 error SVG instead of crashing when the org dashboard throws an unexpected error +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":6,"requestId":"5e0bf21f-9901-4d77-9da2-d3328c6144d3"} + +stdout | app/api/streak/route.error-resilience.test.ts > GET /api/streak — error resilience & exception safety > timeout / abort handling (isAbortError) > returns a 504 timeout SVG when the rejection has name "AbortError" +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"45418296-dfc1-40ef-8f15-68da87ae95f8"} + +stdout | app/api/streak/route.error-resilience.test.ts > GET /api/streak — error resilience & exception safety > timeout / abort handling (isAbortError) > returns a 504 timeout SVG when the rejection has name "AbortError" +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"45418296-dfc1-40ef-8f15-68da87ae95f8"} + +stdout | app/api/streak/route.error-resilience.test.ts > GET /api/streak — error resilience & exception safety > timeout / abort handling (isAbortError) > returns a 504 timeout SVG when the rejection has name "TimeoutError" +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"51605164-6832-40c8-8834-60246db5a6a8"} + +stdout | app/api/streak/route.error-resilience.test.ts > GET /api/streak — error resilience & exception safety > timeout / abort handling (isAbortError) > returns a 504 timeout SVG when the rejection has name "TimeoutError" +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":0,"requestId":"51605164-6832-40c8-8834-60246db5a6a8"} + +stdout | app/api/streak/route.error-resilience.test.ts > GET /api/streak — error resilience & exception safety > timeout / abort handling (isAbortError) > returns a 504 timeout SVG when a plain Error message mentions "timed out" with no name field +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"1a7fd720-1527-4b2e-b0f3-e3dec81b34d8"} + +stdout | app/api/streak/route.error-resilience.test.ts > GET /api/streak — error resilience & exception safety > timeout / abort handling (isAbortError) > returns a 504 timeout SVG when a plain Error message mentions "timed out" with no name field +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"1a7fd720-1527-4b2e-b0f3-e3dec81b34d8"} + +stdout | app/api/streak/route.error-resilience.test.ts > GET /api/streak — error resilience & exception safety > timeout / abort handling (isAbortError) > returns a structured 504 JSON error when the rejection has name "AbortError" +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"3100301f-1f41-4f30-8df4-4f4f59f0f70c"} + +stdout | app/api/streak/route.error-resilience.test.ts > GET /api/streak — error resilience & exception safety > timeout / abort handling (isAbortError) > returns a structured 504 JSON error when the rejection has name "AbortError" +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"json","status":200,"durationMs":1,"requestId":"3100301f-1f41-4f30-8df4-4f4f59f0f70c"} + +stdout | app/api/streak/route.error-resilience.test.ts > GET /api/streak — error resilience & exception safety > asymmetric multi-target resilience > fails the whole request cleanly (not a partial/corrupt SVG) when the ?versus= comparison user fails to load +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"b5a31722-833b-4d86-9c82-e943d2c4077a"} + +stderr | app/api/streak/route.error-resilience.test.ts > GET /api/streak — error resilience & exception safety > asymmetric multi-target resilience > fails the whole request cleanly (not a partial/corrupt SVG) when the ?versus= comparison user fails to load +[ERROR] Unhandled error {"source":"streak","message":"Something went wrong. Please try again later.","requestId":"b5a31722-833b-4d86-9c82-e943d2c4077a"} + +stdout | app/api/streak/route.error-resilience.test.ts > GET /api/streak — error resilience & exception safety > asymmetric multi-target resilience > fails the whole request cleanly (not a partial/corrupt SVG) when the ?versus= comparison user fails to load +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"b5a31722-833b-4d86-9c82-e943d2c4077a"} + +stdout | app/api/streak/route.error-resilience.test.ts > GET /api/streak — error resilience & exception safety > dev-telemetry logging on unhandled errors > logs unexpected errors with a sanitized message and the "streak" source tag +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"fec29320-925f-4496-b82f-f9eab4787c57"} + +stdout | app/api/streak/route.error-resilience.test.ts > GET /api/streak — error resilience & exception safety > dev-telemetry logging on unhandled errors > logs unexpected errors with a sanitized message and the "streak" source tag +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":0,"requestId":"fec29320-925f-4496-b82f-f9eab4787c57"} + +stdout | app/api/streak/route.error-resilience.test.ts > GET /api/streak — error resilience & exception safety > dev-telemetry logging on unhandled errors > does not invoke dev-telemetry logging for expected, user-facing validation errors +[INFO] Incoming streak request {"source":"streak","requestId":"963c0893-90fd-4dd7-9676-e4e304c5a48e"} + +stdout | app/api/streak/route.error-resilience.test.ts > GET /api/streak — error resilience & exception safety > Cache-Control on error paths not covered by route.test.ts > returns a 400 with no-store caching for validation errors so a corrected reload is never served stale data +[INFO] Incoming streak request {"source":"streak","requestId":"d6aedce6-b456-4f35-9f26-bfe5b5771dab"} + +stdout | app/api/streak/route.error-resilience.test.ts > GET /api/streak — error resilience & exception safety > Cache-Control on error paths not covered by route.test.ts > never lets a client cache a 404 not-found error response +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"4a347397-6d29-436e-997b-872259a0ad9b"} + +stdout | app/api/streak/route.error-resilience.test.ts > GET /api/streak — error resilience & exception safety > Cache-Control on error paths not covered by route.test.ts > never lets a client cache a 404 not-found error response +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"4a347397-6d29-436e-997b-872259a0ad9b"} + +stdout | app/api/streak/route.error-resilience.test.ts > GET /api/streak — error resilience & exception safety > internal fallback catches keep dependent views healthy > still returns a valid 200 commit-clock SVG when the commit-hour distribution fetch fails internally +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"commit_clock","requestId":"130371b0-1e68-41dd-8136-0304398a6638"} + +stdout | app/api/streak/route.error-resilience.test.ts > GET /api/streak — error resilience & exception safety > internal fallback catches keep dependent views healthy > still returns a valid 200 commit-clock SVG when the commit-hour distribution fetch fails internally +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"commit_clock","format":"svg","status":200,"durationMs":1,"requestId":"130371b0-1e68-41dd-8136-0304398a6638"} + + ✓ app/api/streak/route.error-resilience.test.ts (21 tests) 613ms + ✓ components/dashboard/DeploymentTracker.timezone-boundaries.test.tsx (12 tests) 1149ms + ✓ shows "Just now" for a timestamp a few seconds in the past 353ms +stderr | components/dashboard/PRInsights/PRTrendChart.empty-fallback.test.tsx > PRTrendChart Empty/Missing Inputs Verification > renders successfully with empty activity datasets +The tag <stop> is unrecognized in this browser. If you meant to render a React component, start its name with an uppercase letter. +<linearGradient /> is using incorrect casing. Use PascalCase for React components, or lowercase for HTML elements. +The tag <linearGradient> is unrecognized in this browser. If you meant to render a React component, start its name with an uppercase letter. +The tag <defs> is unrecognized in this browser. If you meant to render a React component, start its name with an uppercase letter. + +stderr | components/dashboard/PRInsights/PRTrendChart.empty-fallback.test.tsx > PRTrendChart Empty/Missing Inputs Verification > renders chart container when weekly and monthly data are empty +<linearGradient /> is using incorrect casing. Use PascalCase for React components, or lowercase for HTML elements. + +stderr | components/dashboard/PRInsights/PRTrendChart.empty-fallback.test.tsx > PRTrendChart Empty/Missing Inputs Verification > allows switching to weekly view with empty datasets +<linearGradient /> is using incorrect casing. Use PascalCase for React components, or lowercase for HTML elements. + +stderr | components/dashboard/PRInsights/PRTrendChart.empty-fallback.test.tsx > PRTrendChart Empty/Missing Inputs Verification > allows switching back to monthly view with empty datasets +<linearGradient /> is using incorrect casing. Use PascalCase for React components, or lowercase for HTML elements. + +stderr | components/dashboard/PRInsights/PRTrendChart.empty-fallback.test.tsx > PRTrendChart Empty/Missing Inputs Verification > maintains DOM structure with fully zeroed insight data +<linearGradient /> is using incorrect casing. Use PascalCase for React components, or lowercase for HTML elements. + + ✓ components/dashboard/PRInsights/PRTrendChart.empty-fallback.test.tsx (5 tests) 507ms + ✓ renders successfully with empty activity datasets 313ms + ✓ app/contributors/loading.mock-integrations.test.tsx (5 tests) 835ms + ✓ tests service loading paths to ensure pending state overlays render 650ms + ✓ components/dashboard/GithubWrapped.empty-fallback.test.tsx (5 tests) 725ms + ✓ Render the target module or component with empty arrays or null parameters: Renders safely 310ms + ✓ components/Leaderboard.empty-fallback.test.tsx (5 tests) 419ms + ✓ components/CherryBlossom.mouse-interactivity.test.tsx (5 tests) 505ms + ✓ components/dashboard/RepositoryGraph.responsive-breakpoints.test.tsx (5 tests) 424ms + ✓ components/dashboard/ResumeProfileSection.theme-contrast.test.tsx (5 tests) 399ms + ✓ components/dashboard/Achievements.test.tsx (8 tests) 824ms + ✓ components/dashboard/PRInsights/Highlights.responsive-breakpoints.test.tsx (5 tests) 695ms + ✓ 1. mocks standard mobile-width media coordinates (e.g. 375px wide viewports) 322ms + ✓ app/generator/components/SectionCard.timezone-boundaries.test.tsx (5 tests) 265ms + ✓ components/dashboard/DashboardSkeleton.accessibility.test.tsx (5 tests) 522ms + ✓ components/ShareButtons.responsive-breakpoints.test.tsx (5 tests) 246ms + ✓ components/dashboard/LanguageChart.empty-fallback.test.tsx (5 tests) 209ms + ✓ app/compare/page.responsive-breakpoints.test.tsx (5 tests) 564ms + ✓ lib/calculate.test.ts (125 tests) 922ms + ✓ components/dashboard/PRInsights/PRStatusDistribution.mock-integrations.test.tsx (5 tests) 468ms + ✓ components/dashboard/ResumeUpload.test.tsx (5 tests) 1022ms + ✓ shows error for invalid file type 541ms + ✓ components/dashboard/ProfileCard.timezone-boundaries.test.tsx (5 tests) 576ms + ✓ Case 1: formats a single UTC timestamp cleanly to the expected regional dates 322ms + ✓ components/TopRivalriesTicker.mouse-interactivity.test.tsx (5 tests) 806ms + ✓ components/dashboard/StatsCard.empty-fallback.test.tsx (5 tests) 1309ms + ✓ uses fallback icon when icon name is unknown 1004ms + ✓ components/dashboard/ContributionCity3D.empty-fallback.test.tsx (7 tests) 533ms + ✓ components/dashboard/PRInsights/PRStatusDistribution.timezone-boundaries.test.tsx (5 tests) 925ms + ✓ should process PR data metrics accurately across distinct timezones (EST vs IST) 503ms + ✓ components/dashboard/EnterpriseHealth.test.tsx (4 tests) 1219ms + ✓ renders team name correctly 952ms + ✓ components/dashboard/PRInsights/PRInsightsClient.empty-fallback.test.tsx (5 tests) 897ms + ✓ 1. renders safely without crashing when the API returns an empty dataset 533ms + ✓ app/api/og/route.empty-fallback.test.tsx (5 tests) 576ms + ✓ falls back to the default user when user parameter is provided as an empty string 533ms +stdout | app/api/streak/tests/scale.test.ts > Integration Test: API Streak Scale Parameter Group > Test 1: should return 200 OK for valid scale=log +[INFO] Incoming streak request {"source":"streak","user":"JhaSourav07","view":"default","requestId":"5296a1c6-8846-4275-a9bc-f8d9959227ca"} + +stderr | app/api/streak/tests/scale.test.ts > Integration Test: API Streak Scale Parameter Group > Test 1: should return 200 OK for valid scale=log +[CommitPulse API] Empty profile or null repository nodes discovered for user "JhaSourav07". Falling back to baseline collection. + +stdout | app/api/streak/tests/scale.test.ts > Integration Test: API Streak Scale Parameter Group > Test 1: should return 200 OK for valid scale=log +[INFO] Streak request completed {"source":"streak","user":"JhaSourav07","view":"default","format":"svg","status":200,"durationMs":110,"requestId":"5296a1c6-8846-4275-a9bc-f8d9959227ca"} + +stdout | app/api/streak/tests/scale.test.ts > Integration Test: API Streak Scale Parameter Group > Test 2: should return 200 OK for valid scale=linear +[INFO] Incoming streak request {"source":"streak","user":"JhaSourav07","view":"default","requestId":"e8239c4d-e75a-44fe-9483-8437a39b7dc7"} + +stderr | app/api/streak/tests/scale.test.ts > Integration Test: API Streak Scale Parameter Group > Test 2: should return 200 OK for valid scale=linear +[CommitPulse API] Empty profile or null repository nodes discovered for user "JhaSourav07". Falling back to baseline collection. + +stdout | app/api/streak/tests/scale.test.ts > Integration Test: API Streak Scale Parameter Group > Test 2: should return 200 OK for valid scale=linear +[INFO] Streak request completed {"source":"streak","user":"JhaSourav07","view":"default","format":"svg","status":200,"durationMs":30,"requestId":"e8239c4d-e75a-44fe-9483-8437a39b7dc7"} + +stdout | app/api/streak/tests/scale.test.ts > Integration Test: API Streak Scale Parameter Group > Test 3: should render different SVGs for linear vs log scaling +[INFO] Incoming streak request {"source":"streak","user":"JhaSourav07","view":"default","requestId":"fdc8dbf5-adee-4e88-b29b-e3f909a2263b"} + +stderr | app/api/streak/tests/scale.test.ts > Integration Test: API Streak Scale Parameter Group > Test 3: should render different SVGs for linear vs log scaling +[CommitPulse API] Empty profile or null repository nodes discovered for user "JhaSourav07". Falling back to baseline collection. + +stdout | app/api/streak/tests/scale.test.ts > Integration Test: API Streak Scale Parameter Group > Test 3: should render different SVGs for linear vs log scaling +[INFO] Streak request completed {"source":"streak","user":"JhaSourav07","view":"default","format":"svg","status":200,"durationMs":13,"requestId":"fdc8dbf5-adee-4e88-b29b-e3f909a2263b"} + +stdout | app/api/streak/tests/scale.test.ts > Integration Test: API Streak Scale Parameter Group > Test 3: should render different SVGs for linear vs log scaling +[INFO] Incoming streak request {"source":"streak","user":"JhaSourav07","view":"default","requestId":"d72094d7-7d96-424e-a106-becb04281a68"} + +stderr | app/api/streak/tests/scale.test.ts > Integration Test: API Streak Scale Parameter Group > Test 3: should render different SVGs for linear vs log scaling +[CommitPulse API] Empty profile or null repository nodes discovered for user "JhaSourav07". Falling back to baseline collection. + +stdout | app/api/streak/tests/scale.test.ts > Integration Test: API Streak Scale Parameter Group > Test 3: should render different SVGs for linear vs log scaling +[INFO] Streak request completed {"source":"streak","user":"JhaSourav07","view":"default","format":"svg","status":200,"durationMs":18,"requestId":"d72094d7-7d96-424e-a106-becb04281a68"} + +stdout | app/api/streak/tests/scale.test.ts > Integration Test: API Streak Scale Parameter Group > Test 4: should fallback gracefully to linear behavior for invalid scale inputs +[INFO] Incoming streak request {"source":"streak","user":"JhaSourav07","view":"default","requestId":"c3ddba14-a770-4788-bfcd-16af6110ba75"} + +stderr | app/api/streak/tests/scale.test.ts > Integration Test: API Streak Scale Parameter Group > Test 4: should fallback gracefully to linear behavior for invalid scale inputs +[CommitPulse API] Empty profile or null repository nodes discovered for user "JhaSourav07". Falling back to baseline collection. + +stdout | app/api/streak/tests/scale.test.ts > Integration Test: API Streak Scale Parameter Group > Test 4: should fallback gracefully to linear behavior for invalid scale inputs +[INFO] Streak request completed {"source":"streak","user":"JhaSourav07","view":"default","format":"svg","status":200,"durationMs":6,"requestId":"c3ddba14-a770-4788-bfcd-16af6110ba75"} + +stdout | app/api/streak/tests/scale.test.ts > Integration Test: API Streak Scale Parameter Group > Test 4: should fallback gracefully to linear behavior for invalid scale inputs +[INFO] Incoming streak request {"source":"streak","user":"JhaSourav07","view":"default","requestId":"25500595-80db-43f1-81ac-cc6bdd0b2412"} + +stderr | app/api/streak/tests/scale.test.ts > Integration Test: API Streak Scale Parameter Group > Test 4: should fallback gracefully to linear behavior for invalid scale inputs +[CommitPulse API] Empty profile or null repository nodes discovered for user "JhaSourav07". Falling back to baseline collection. + +stdout | app/api/streak/tests/scale.test.ts > Integration Test: API Streak Scale Parameter Group > Test 4: should fallback gracefully to linear behavior for invalid scale inputs +[INFO] Streak request completed {"source":"streak","user":"JhaSourav07","view":"default","format":"svg","status":200,"durationMs":4,"requestId":"25500595-80db-43f1-81ac-cc6bdd0b2412"} + +stdout | app/api/streak/tests/scale.test.ts > Integration Test: API Streak Scale Parameter Group > Test 5: should return appropriate HTTP headers for SVG rendering +[INFO] Incoming streak request {"source":"streak","user":"JhaSourav07","view":"default","requestId":"e732331f-4bb9-4f69-932f-5a699bf072ef"} + + ✓ components/Leaderboard.mouse-interactivity.test.tsx (5 tests) 548ms + ✓ Interactive Pointer Detection (Cursor Hovers Equivalent): applies explicit cursor-pointer classes on interactive elements 370ms +stderr | app/api/streak/tests/scale.test.ts > Integration Test: API Streak Scale Parameter Group > Test 5: should return appropriate HTTP headers for SVG rendering +[CommitPulse API] Empty profile or null repository nodes discovered for user "JhaSourav07". Falling back to baseline collection. + +stdout | app/api/streak/tests/scale.test.ts > Integration Test: API Streak Scale Parameter Group > Test 5: should return appropriate HTTP headers for SVG rendering +[INFO] Streak request completed {"source":"streak","user":"JhaSourav07","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"e732331f-4bb9-4f69-932f-5a699bf072ef"} + + ✓ app/api/streak/tests/scale.test.ts (5 tests) 574ms + ✓ Test 1: should return 200 OK for valid scale=log 304ms + ✓ components/dashboard/ProfileCard.theme-contrast.test.tsx (5 tests) 487ms + ✓ components/dashboard/ActivityLandscape.error-resilience.test.tsx (6 tests) 2275ms + ✓ renders without crashing on hydration with valid empty data 1308ms + ✓ renders correctly with valid data 300ms + ✓ components/AnimatedCursor.test.tsx (6 tests) 2118ms + ✓ bails out and does not hide native cursor on touch/mobile devices (pointer: fine matches false) 1200ms +stderr | components/dashboard/GrowthTrendChart.theme-contrast.test.tsx > GrowthTrendChart theme contrast > renders heading with dark and light theme text classes +React does not recognize the `whileInView` prop on a DOM element. If you intentionally want it to appear in the DOM as a custom attribute, spell it as lowercase `whileinview` instead. If you accidentally passed it from a parent component, remove it from the DOM element. + + ✓ app/components/FeatureCard.type-compiler.test.tsx (5 tests) 3164ms + ✓ 5. asserts that runtime parsing fallbacks handle missing attributes safely and complete standard mounting cycles 3086ms + ✓ components/dashboard/GrowthTrendChart.theme-contrast.test.tsx (5 tests) 2180ms + ✓ renders heading with dark and light theme text classes 945ms + ✓ renders legend labels with theme-aware contrast styling 317ms + ✓ renders container with dark and light background variants 408ms +stdout | app/api/streak/route.theme-contrast.test.ts > GET /api/streak theme contrast > renders successfully with dark theme +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"2f3dea97-0b64-465f-88d0-92a9ba3c9769"} + +stdout | app/api/streak/route.theme-contrast.test.ts > GET /api/streak theme contrast > renders successfully with dark theme +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":468,"requestId":"2f3dea97-0b64-465f-88d0-92a9ba3c9769"} + +stdout | app/api/streak/route.theme-contrast.test.ts > GET /api/streak theme contrast > renders successfully with light theme +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"8f8ce29e-6b06-4154-93f6-9c373e8dafda"} + +stdout | app/api/streak/route.theme-contrast.test.ts > GET /api/streak theme contrast > renders successfully with light theme +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":16,"requestId":"8f8ce29e-6b06-4154-93f6-9c373e8dafda"} + +stdout | app/api/streak/route.theme-contrast.test.ts > GET /api/streak theme contrast > produces different SVG output for dark and light themes +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"0470b3e2-87c8-4af1-a070-b43fc528a493"} + +stdout | app/api/streak/route.theme-contrast.test.ts > GET /api/streak theme contrast > produces different SVG output for dark and light themes +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":25,"requestId":"0470b3e2-87c8-4af1-a070-b43fc528a493"} + +stdout | app/api/streak/route.theme-contrast.test.ts > GET /api/streak theme contrast > produces different SVG output for dark and light themes +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"d0ef36d6-ffdb-498c-ab82-09decd3269c9"} + +stdout | app/api/streak/route.theme-contrast.test.ts > GET /api/streak theme contrast > produces different SVG output for dark and light themes +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":3,"requestId":"d0ef36d6-ffdb-498c-ab82-09decd3269c9"} + +stdout | app/api/streak/route.theme-contrast.test.ts > GET /api/streak theme contrast > uses prefers-color-scheme CSS when theme=auto +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"6ca1b1ff-c5a8-4cc4-92d3-c48cce9a492a"} + +stdout | app/api/streak/route.theme-contrast.test.ts > GET /api/streak theme contrast > uses prefers-color-scheme CSS when theme=auto +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":28,"requestId":"6ca1b1ff-c5a8-4cc4-92d3-c48cce9a492a"} + +stdout | app/api/streak/route.theme-contrast.test.ts > GET /api/streak theme contrast > includes CSS variables for automatic theme switching +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"224626a0-164e-48c6-963b-957fc53638ea"} + +stdout | app/api/streak/route.theme-contrast.test.ts > GET /api/streak theme contrast > includes CSS variables for automatic theme switching +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":19,"requestId":"224626a0-164e-48c6-963b-957fc53638ea"} + + ✓ app/api/streak/route.theme-contrast.test.ts (5 tests) 1961ms + ✓ renders successfully with dark theme 1135ms + ✓ app/api/wrapped/route.theme-contrast.test.tsx (5 tests) 882ms + ✓ 1. should emulate both dark and light presets 340ms +stderr | components/dashboard/ProfileOptimizerModal.mock-integrations.test.tsx > ProfileOptimizerModal - Async Integration Fixed > 2. updates loading text after interval tick +`ReactDOMTestUtils.act` is deprecated in favor of `React.act`. Import `act` from `react` instead of `react-dom/test-utils`. See https://react.dev/warnings/react-dom-test-utils for more info. + + ✓ components/dashboard/ProfileOptimizerModal.mock-integrations.test.tsx (5 tests) 2521ms + ✓ 1. renders initial loading state 1037ms + ✓ 2. updates loading text after interval tick 489ms + ✓ 3. completes full cycle safely 505ms + ✓ 4. resets properly on reopen 394ms + ✓ components/dashboard/AchievementsSkeleton.test.tsx (4 tests) 490ms + ✓ renders without crashing 303ms + ✓ components/dashboard/ActivityLandscape.mock-integrations.test.tsx (5 tests) 540ms + ✓ app/customize/components/AdvancedSettingsPanel.theme-contrast.test.tsx (5 tests) 621ms + ✓ includes light and dark theme classes on section labels 336ms + ✓ app/customize/components/AdvancedSettingsPanel.test.tsx (2 tests) 412ms +stdout | app/api/streak/route.mouse-interactivity.test.ts > ApiStreakRoute Tests > returns 400 Bad Request when the required user parameter is missing +[INFO] Incoming streak request {"source":"streak","requestId":"a445b351-6c06-4b1a-8dc2-ac945ca5c3e0"} + +stdout | app/api/streak/route.mouse-interactivity.test.ts > ApiStreakRoute Tests > returns JSON data when format is set to json +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"d55e7160-7787-4879-b661-40c872a7c0e5"} + +stdout | app/api/streak/route.mouse-interactivity.test.ts > ApiStreakRoute Tests > returns JSON data when format is set to json +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"json","status":200,"durationMs":78,"requestId":"d55e7160-7787-4879-b661-40c872a7c0e5"} + +stdout | app/api/streak/route.mouse-interactivity.test.ts > ApiStreakRoute Tests > handles ETag / If-None-Match and returns 304 Not Modified +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"64777880-0166-4280-aa1d-f83127293af0"} + +stdout | app/api/streak/route.mouse-interactivity.test.ts > ApiStreakRoute Tests > handles ETag / If-None-Match and returns 304 Not Modified +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"json","status":200,"durationMs":1,"requestId":"64777880-0166-4280-aa1d-f83127293af0"} + +stdout | app/api/streak/route.mouse-interactivity.test.ts > ApiStreakRoute Tests > handles ETag / If-None-Match and returns 304 Not Modified +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"961c08ca-f7fe-44a6-814c-f3be3b0769a2"} + +stdout | app/api/streak/route.mouse-interactivity.test.ts > ApiStreakRoute Tests > handles ETag / If-None-Match and returns 304 Not Modified +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"json","status":200,"durationMs":1,"requestId":"961c08ca-f7fe-44a6-814c-f3be3b0769a2"} + +stdout | app/api/streak/route.mouse-interactivity.test.ts > ApiStreakRoute Tests > bypasses the cache and sets Cache-Control: no-store when refresh is true +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"ab5e7d3c-138e-49ff-9573-f909618b8cac"} + +stdout | app/api/streak/route.mouse-interactivity.test.ts > ApiStreakRoute Tests > bypasses the cache and sets Cache-Control: no-store when refresh is true +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"json","status":200,"durationMs":3,"requestId":"ab5e7d3c-138e-49ff-9573-f909618b8cac"} + +stdout | app/api/streak/route.mouse-interactivity.test.ts > ApiStreakRoute Tests > returns SVG image content with Content-Security-Policy header by default +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"f0a806c9-a350-49cb-8d68-998936b0f65f"} + +stdout | app/api/streak/route.mouse-interactivity.test.ts > ApiStreakRoute Tests > returns SVG image content with Content-Security-Policy header by default +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":4,"requestId":"f0a806c9-a350-49cb-8d68-998936b0f65f"} + + ✓ app/contributors/ContributorsClient.error-resilience.test.tsx (5 tests) 907ms + ✓ renders successfully with valid data 541ms + ✓ app/api/streak/route.mouse-interactivity.test.ts (5 tests) 313ms + ✓ app/generator/components/GitHubImportModal.test.tsx (5 tests) 1253ms + ✓ renders correctly when open 560ms + ✓ components/dashboard/PRInsights/ReviewAnalytics.mouse-interactivity.test.tsx (5 tests) 229ms + ✓ app/contributors/ContributorsSearch.responsive-breakpoints.test.tsx (5 tests) 408ms +stderr | components/dashboard/CommitClock.theme-contrast.test.tsx > CommitClock - Theme Contrast > renders light and dark mode container classes +React does not recognize the `whileInView` prop on a DOM element. If you intentionally want it to appear in the DOM as a custom attribute, spell it as lowercase `whileinview` instead. If you accidentally passed it from a parent component, remove it from the DOM element. + + ✓ components/dashboard/GrowthTrendChart.empty-fallback.test.tsx (5 tests) 1017ms + ✓ renders successfully with empty activity arrays 538ms + ✓ components/dashboard/CommitClock.theme-contrast.test.tsx (5 tests) 843ms + ✓ renders light and dark mode container classes 418ms +stderr | components/dashboard/RadarChart.mouse-interactivity.test.tsx > RadarChart mouse interactivity contract > renders chart title and subtitle +React does not recognize the `whileInView` prop on a DOM element. If you intentionally want it to appear in the DOM as a custom attribute, spell it as lowercase `whileinview` instead. If you accidentally passed it from a parent component, remove it from the DOM element. + + ✓ app/api/og/route.timezone-boundaries.test.tsx (5 tests) 416ms + ✓ returns a consistent image for a UTC calendar boundary 328ms + ✓ components/dashboard/RadarChart.mouse-interactivity.test.tsx (5 tests) 676ms + ✓ components/AnimatedCursor.timezone-boundaries.test.tsx (5 tests) 877ms + ✓ renders both cursor elements in test environment regardless of prefers-reduced-motion — NODE_ENV guard acts as UTC baseline override 607ms + ✓ components/dashboard/ProfileCard.mock-integrations.test.tsx (5 tests) 819ms + ✓ renders with ShareSheet initially closed 364ms + ✓ components/dashboard/StatsCard.accessibility.test.tsx (5 tests) 293ms + ✓ app/customize/components/ControlsPanel.mock-integrations.test.tsx (5 tests) 505ms + ✓ should simulate pending state loading flags overlay correctly 320ms + ✓ components/dashboard/ProfileOptimizerModal.error-resilience.test.tsx (5 tests) 533ms + ✓ maintains hydration stability with null userData and renders the loading state without crashing 389ms + ✓ app/customize/components/SectionLabel.accessibility.test.tsx (7 tests) 597ms + ✓ components/TopRivalriesTicker.theme-contrast.test.tsx (5 tests) 704ms + ✓ 2. asserts that visual styling for TopRivalriesTicker adapts properly to current theme settings 458ms +stderr | components/dashboard/GrowthTrendChart.mouse-interactivity.test.tsx > GrowthTrendChart mouse interactivity > handles mouse enter events without crashing +React does not recognize the `whileInView` prop on a DOM element. If you intentionally want it to appear in the DOM as a custom attribute, spell it as lowercase `whileinview` instead. If you accidentally passed it from a parent component, remove it from the DOM element. + + ✓ components/CherryBlossom.test.tsx (5 tests) 697ms + ✓ components/dashboard/GrowthTrendChart.mouse-interactivity.test.tsx (5 tests) 1128ms + ✓ handles mouse enter events without crashing 404ms + ✓ components/dashboard/Achievements.theme-contrast.test.tsx (5 tests) 825ms + ✓ adapts visual container elements safely when toggling between light and dark settings 510ms + ✓ components/dashboard/RepositoryGraph.mock-integrations.test.tsx (5 tests) 782ms + ✓ renders successfully with mocked dynamic graph integration 508ms + ✓ components/dashboard/RadarChart.responsive-breakpoints.test.tsx (5 tests) 1094ms + ✓ Case 1: mock standard mobile-width (375px) layout reflow to single-column 402ms + ✓ Case 4: assert mobile-specific toggle states respond to view interactions 451ms +stdout | app/api/streak/tests/shading.test.ts > Streak API - shading parameter integration tests > should return 200 OK and apply shading when shading is true +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"d2790d0c-2b8a-47e3-9ed5-a3e1802b52c3"} + +stdout | app/api/streak/tests/shading.test.ts > Streak API - shading parameter integration tests > should return 200 OK and apply shading when shading is true +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":163,"requestId":"d2790d0c-2b8a-47e3-9ed5-a3e1802b52c3"} + +stdout | app/api/streak/tests/shading.test.ts > Streak API - shading parameter integration tests > should return 200 OK and not apply shading when shading is false +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"9eaa6857-58b5-4804-920c-1cc0193de982"} + +stdout | app/api/streak/tests/shading.test.ts > Streak API - shading parameter integration tests > should return 200 OK and not apply shading when shading is false +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"9eaa6857-58b5-4804-920c-1cc0193de982"} + +stdout | app/api/streak/tests/shading.test.ts > Streak API - shading parameter integration tests > should fallback to false and return 200 OK when shading is invalid +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"33c3ed94-a35f-4569-b8e1-86ac4cf38f78"} + +stdout | app/api/streak/tests/shading.test.ts > Streak API - shading parameter integration tests > should fallback to false and return 200 OK when shading is invalid +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"33c3ed94-a35f-4569-b8e1-86ac4cf38f78"} + +stdout | app/api/streak/tests/shading.test.ts > Streak API - shading parameter integration tests > should default to false and return 200 OK when shading is missing +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"97a93587-f2e5-4e69-a7f9-69286f5e3146"} + +stdout | app/api/streak/tests/shading.test.ts > Streak API - shading parameter integration tests > should default to false and return 200 OK when shading is missing +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"97a93587-f2e5-4e69-a7f9-69286f5e3146"} + +stdout | app/api/streak/tests/shading.test.ts > Streak API - shading parameter integration tests > should produce different SVGs when shading is true vs false +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"2d5761bf-5fca-46f3-a99b-0b06ce3f6bff"} + +stdout | app/api/streak/tests/shading.test.ts > Streak API - shading parameter integration tests > should produce different SVGs when shading is true vs false +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":14,"requestId":"2d5761bf-5fca-46f3-a99b-0b06ce3f6bff"} + +stdout | app/api/streak/tests/shading.test.ts > Streak API - shading parameter integration tests > should produce different SVGs when shading is true vs false +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"5a84bc17-d1cc-42cb-87ac-daa43b6da776"} + +stdout | app/api/streak/tests/shading.test.ts > Streak API - shading parameter integration tests > should produce different SVGs when shading is true vs false +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"5a84bc17-d1cc-42cb-87ac-daa43b6da776"} + + ✓ app/api/streak/tests/shading.test.ts (5 tests) 430ms + ✓ models/StudentProfile.timezone-boundaries.test.ts (5 tests) 577ms + ✓ maps student profile createdAt and updatedAt onto the correct visual dates across UTC, EST, IST, and JST without boundary shifts 501ms + ✓ components/dashboard/PRInsights/PRStatusDistribution.responsive-breakpoints.test.tsx (5 tests) 1214ms + ✓ 1. mocks standard mobile-width media coordinates (e.g. 375px wide viewports) 1022ms + ✓ components/dashboard/GrowthTrendChart.accessibility.test.tsx (5 tests) 850ms +stdout | app/api/streak/tests/dimensions.test.ts > Integration Test: API Streak Dimensions Parameter Group > Test 1: should return 200 OK for valid custom dimensions +[INFO] Incoming streak request {"source":"streak","user":"JhaSourav07","view":"default","requestId":"3b0537d9-5ead-4d5e-a8e5-3bf3342e783e"} + +stderr | app/api/streak/tests/dimensions.test.ts > Integration Test: API Streak Dimensions Parameter Group > Test 1: should return 200 OK for valid custom dimensions +[CommitPulse API] Empty profile or null repository nodes discovered for user "JhaSourav07". Falling back to baseline collection. + +stdout | app/api/streak/tests/dimensions.test.ts > Integration Test: API Streak Dimensions Parameter Group > Test 1: should return 200 OK for valid custom dimensions +[INFO] Streak request completed {"source":"streak","user":"JhaSourav07","view":"default","format":"svg","status":200,"durationMs":182,"requestId":"3b0537d9-5ead-4d5e-a8e5-3bf3342e783e"} + +stdout | app/api/streak/tests/dimensions.test.ts > Integration Test: API Streak Dimensions Parameter Group > Test 2: should reflect dimension changes directly in the rendered SVG +[INFO] Incoming streak request {"source":"streak","user":"JhaSourav07","view":"default","requestId":"caa4b073-9d2a-4b6e-acf2-613d243ac38d"} + +stderr | app/api/streak/tests/dimensions.test.ts > Integration Test: API Streak Dimensions Parameter Group > Test 2: should reflect dimension changes directly in the rendered SVG +[CommitPulse API] Empty profile or null repository nodes discovered for user "JhaSourav07". Falling back to baseline collection. + +stdout | app/api/streak/tests/dimensions.test.ts > Integration Test: API Streak Dimensions Parameter Group > Test 2: should reflect dimension changes directly in the rendered SVG +[INFO] Streak request completed {"source":"streak","user":"JhaSourav07","view":"default","format":"svg","status":200,"durationMs":6,"requestId":"caa4b073-9d2a-4b6e-acf2-613d243ac38d"} + +stdout | app/api/streak/tests/dimensions.test.ts > Integration Test: API Streak Dimensions Parameter Group > Test 3: should reject negative dimensions with a 400 Bad Request +[INFO] Incoming streak request {"source":"streak","requestId":"eb590066-5cba-40b7-bf01-b032afbd43d6"} + +stdout | app/api/streak/tests/dimensions.test.ts > Integration Test: API Streak Dimensions Parameter Group > Test 4: should handle completely invalid string inputs by rejecting with 400 +[INFO] Incoming streak request {"source":"streak","requestId":"70b95632-9767-43fb-80eb-5d319cf69d2f"} + +stdout | app/api/streak/tests/dimensions.test.ts > Integration Test: API Streak Dimensions Parameter Group > Test 5: should return appropriate HTTP headers for SVG rendering +[INFO] Incoming streak request {"source":"streak","user":"JhaSourav07","view":"default","requestId":"ef5701c8-786c-440a-956a-109449b411af"} + +stderr | app/api/streak/tests/dimensions.test.ts > Integration Test: API Streak Dimensions Parameter Group > Test 5: should return appropriate HTTP headers for SVG rendering +[CommitPulse API] Empty profile or null repository nodes discovered for user "JhaSourav07". Falling back to baseline collection. + +stdout | app/api/streak/tests/dimensions.test.ts > Integration Test: API Streak Dimensions Parameter Group > Test 5: should return appropriate HTTP headers for SVG rendering +[INFO] Streak request completed {"source":"streak","user":"JhaSourav07","view":"default","format":"svg","status":200,"durationMs":8,"requestId":"ef5701c8-786c-440a-956a-109449b411af"} + + ✓ app/api/streak/tests/dimensions.test.ts (5 tests) 406ms + ✓ Test 1: should return 200 OK for valid custom dimensions 322ms +stderr | components/dashboard/ComparisonStatsCard.error-resilience.test.tsx > ComparisonStatsCard Error Resilience > maintains hydration stability and renders without crashing under default properties +React does not recognize the `whileInView` prop on a DOM element. If you intentionally want it to appear in the DOM as a custom attribute, spell it as lowercase `whileinview` instead. If you accidentally passed it from a parent component, remove it from the DOM element. +React does not recognize the `whileHover` prop on a DOM element. If you intentionally want it to appear in the DOM as a custom attribute, spell it as lowercase `whilehover` instead. If you accidentally passed it from a parent component, remove it from the DOM element. + + ✓ components/dashboard/StatsCardSkeleton.error-resilience.test.tsx (5 tests) 265ms + ✓ components/dashboard/ComparisonStatsCard.error-resilience.test.tsx (5 tests) 859ms + ✓ maintains hydration stability and renders without crashing under default properties 674ms +stderr | components/dashboard/Achievements.mock-integrations.test.tsx > Achievements - Asynchronous Service Layer Mocking & Local Cache Stubs > Mock standard asynchronous imports and databases using stubs: renders mocked icons without real lucide-react +React does not recognize the `whileInView` prop on a DOM element. If you intentionally want it to appear in the DOM as a custom attribute, spell it as lowercase `whileinview` instead. If you accidentally passed it from a parent component, remove it from the DOM element. + + ✓ components/dashboard/Achievements.mock-integrations.test.tsx (5 tests) 549ms + ✓ Mock standard asynchronous imports and databases using stubs: renders mocked icons without real lucide-react 416ms + ✓ components/dashboard/StatsCard.utc-disclaimer.test.tsx (1 test) 187ms + ✓ components/dashboard/ComparisonStatsCard.timezone-boundaries.test.tsx (5 tests) 1387ms + ✓ Mock standard timezone settings (e.g., UTC, EST, IST, and JST) 832ms + ✓ app/api/og/route.error-resilience.test.tsx (5 tests) 503ms + ✓ returns a valid image response when GitHub contribution fetching throws an exception 422ms + ✓ app/generator/types.error-resilience.test.ts (5 tests) 270ms +stderr | components/Leaderboard.mock-integrations.test.tsx > Leaderboard mock integrations > renders contributor data from mocked local input without network calls +React does not recognize the `whileInView` prop on a DOM element. If you intentionally want it to appear in the DOM as a custom attribute, spell it as lowercase `whileinview` instead. If you accidentally passed it from a parent component, remove it from the DOM element. +React does not recognize the `whileHover` prop on a DOM element. If you intentionally want it to appear in the DOM as a custom attribute, spell it as lowercase `whilehover` instead. If you accidentally passed it from a parent component, remove it from the DOM element. + + ✓ components/Leaderboard.mock-integrations.test.tsx (5 tests) 873ms + ✓ renders contributor data from mocked local input without network calls 596ms + ✓ app/generator/components/SectionCard.error-resilience.test.tsx (5 tests) 931ms + ✓ maintains hydration stability and renders without crashing under normal conditions 618ms + ✓ components/dashboard/PRInsights/ReviewAnalytics.theme-contrast.test.tsx (5 tests) 615ms + ✓ app/contributors/loading.error-resilience.test.tsx (5 tests) 255ms +stdout | app/api/streak/tests/languages.test.ts > GET /api/streak — languages (lang) parameter > returns 200 with SVG content type when a valid lang=de is given +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"5b33f096-9dee-4199-9d50-da21e6b94a41"} + +stdout | app/api/streak/tests/languages.test.ts > GET /api/streak — languages (lang) parameter > returns 200 with SVG content type when a valid lang=de is given +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":45,"requestId":"5b33f096-9dee-4199-9d50-da21e6b94a41"} + +stdout | app/api/streak/tests/languages.test.ts > GET /api/streak — languages (lang) parameter > returns a well-formed SVG body when lang=pt is given +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"d4e6a44c-6246-4c55-8e3c-21d1246b0dd0"} + +stdout | app/api/streak/tests/languages.test.ts > GET /api/streak — languages (lang) parameter > returns a well-formed SVG body when lang=pt is given +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":15,"requestId":"d4e6a44c-6246-4c55-8e3c-21d1246b0dd0"} + +stdout | app/api/streak/tests/languages.test.ts > GET /api/streak — languages (lang) parameter > falls back to English labels when an unrecognised lang=zz is given +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"a91cc370-8723-4a00-9616-99f1b1954f4b"} + +stdout | app/api/streak/tests/languages.test.ts > GET /api/streak — languages (lang) parameter > falls back to English labels when an unrecognised lang=zz is given +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":3,"requestId":"a91cc370-8723-4a00-9616-99f1b1954f4b"} + +stdout | app/api/streak/tests/languages.test.ts > GET /api/streak — languages (lang) parameter > returns English labels when lang=en is explicitly provided +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"1e5fed3f-0c76-4c22-998c-94d4085a1997"} + + ✓ app/components/navbar.mock-integrations.test.tsx (2 tests) 372ms +stdout | app/api/streak/tests/languages.test.ts > GET /api/streak — languages (lang) parameter > returns English labels when lang=en is explicitly provided +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"1e5fed3f-0c76-4c22-998c-94d4085a1997"} + +stdout | app/api/streak/tests/languages.test.ts > GET /api/streak — languages (lang) parameter > sets Cache-Control and Content-Security-Policy headers for a valid lang parameter +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"43fa8fbd-88b8-4b76-b32f-17936856b3a0"} + +stdout | app/api/streak/tests/languages.test.ts > GET /api/streak — languages (lang) parameter > sets Cache-Control and Content-Security-Policy headers for a valid lang parameter +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":9,"requestId":"43fa8fbd-88b8-4b76-b32f-17936856b3a0"} + + ✓ app/api/streak/tests/languages.test.ts (5 tests) 325ms + ✓ components/dashboard/ProfileCard.type-compiler.test.tsx (5 tests) 363ms + ✓ components/dashboard/Achievements.error-resilience.test.tsx (5 tests) 450ms + ✓ hooks/useGlowEffect.responsive-breakpoints.test.ts (5 tests) 312ms +stderr | components/dashboard/Heatmap.error-resilience.test.tsx > Heatmap Error Resilience > renders fallback UI when nested runtime exception occurs +Error: Simulated runtime crash + at ThrowingComponent (/home/atulupadhyay/Contribution/commitpulse/components/dashboard/Heatmap.error-resilience.test.tsx:61:13) + at Object.react_stack_bottom_frame (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:25904:20) + at renderWithHooks (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:7662:22) + at updateFunctionComponent (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:10166:19) + at beginWork (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:11778:18) + at runWithFiberInDEV (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:874:13) + at performUnitOfWork (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:17641:22) + at workLoopSync (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:17469:41) + at renderRootSync (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:17450:11) + at performWorkOnRoot (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:16583:35) { + [stack]: [Getter/Setter], + [message]: 'Simulated runtime crash' +} + +The above error occurred in the <ThrowingComponent> component. + +React will try to recreate this component tree from scratch using the error boundary you provided, y. + + +stderr | components/dashboard/Heatmap.error-resilience.test.tsx > Heatmap Error Resilience > renders fallback UI for broken components safely +Error: Unexpected failure + at BrokenComponent (/home/atulupadhyay/Contribution/commitpulse/components/dashboard/Heatmap.error-resilience.test.tsx:89:13) + at Object.react_stack_bottom_frame (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:25904:20) + at renderWithHooks (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:7662:22) + at updateFunctionComponent (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:10166:19) + at beginWork (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:11778:18) + at runWithFiberInDEV (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:874:13) + at performUnitOfWork (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:17641:22) + at workLoopSync (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:17469:41) + at renderRootSync (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:17450:11) + at performWorkOnRoot (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:16583:35) { + [stack]: [Getter/Setter], + [message]: 'Unexpected failure' +} + +The above error occurred in the <BrokenComponent> component. + +React will try to recreate this component tree from scratch using the error boundary you provided, y. + + + ✓ components/dashboard/Heatmap.error-resilience.test.tsx (5 tests) 322ms + ✓ components/dashboard/RepositoryGraph.theme-contrast.test.tsx (5 tests) 624ms + ✓ applies dark mode heading text contrast styling 466ms + ✓ app/(root)/dashboard/layout.theme-contrast.test.tsx (5 tests) 194ms + ✓ components/dashboard/LanguageChart.mouse-interactivity.test.tsx (5 tests) 348ms + ✓ hooks/useShareActions.mouse-interactivity.test.ts (5 tests) 333ms + ✓ components/commitpulse-logo.timezone-boundaries.test.tsx (5 tests) 335ms + ✓ components/commitpulse-logo.empty-fallback.test.tsx (5 tests) 953ms + ✓ renders successfully without any props (undefined parameters) 721ms +stdout | app/api/streak/tests/refresh.test.ts > GET /api/streak - refresh parameter group > returns status 200 for valid requests with custom refresh values +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"d5646083-6ae8-4d6f-9fb1-8bd2ce46f0b7"} + +stdout | app/api/streak/tests/refresh.test.ts > GET /api/streak - refresh parameter group > returns status 200 for valid requests with custom refresh values +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":115,"requestId":"d5646083-6ae8-4d6f-9fb1-8bd2ce46f0b7"} + +stdout | app/api/streak/tests/refresh.test.ts > GET /api/streak - refresh parameter group > correctly reflects changes dictated by the parameter by forwarding bypassCache to the fetcher +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"8e760410-43cf-499a-9668-2755032e977d"} + +stdout | app/api/streak/tests/refresh.test.ts > GET /api/streak - refresh parameter group > correctly reflects changes dictated by the parameter by forwarding bypassCache to the fetcher +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"8e760410-43cf-499a-9668-2755032e977d"} + +stdout | app/api/streak/tests/refresh.test.ts > GET /api/streak - refresh parameter group > tests negative and fallback edge cases for invalid inputs of refresh +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"335e04ac-c2bc-4501-adfd-804c2b433f0f"} + +stdout | app/api/streak/tests/refresh.test.ts > GET /api/streak - refresh parameter group > tests negative and fallback edge cases for invalid inputs of refresh +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":3,"requestId":"335e04ac-c2bc-4501-adfd-804c2b433f0f"} + +stdout | app/api/streak/tests/refresh.test.ts > GET /api/streak - refresh parameter group > tests negative and fallback edge cases for invalid inputs of refresh +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"cb6625c3-0325-4b70-8654-4cd31713a129"} + +stdout | app/api/streak/tests/refresh.test.ts > GET /api/streak - refresh parameter group > tests negative and fallback edge cases for invalid inputs of refresh +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":8,"requestId":"cb6625c3-0325-4b70-8654-4cd31713a129"} + +stdout | app/api/streak/tests/refresh.test.ts > GET /api/streak - refresh parameter group > tests negative and fallback edge cases for invalid inputs of refresh +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"7ac06e30-8d79-4609-8694-a93b8f215cb2"} + +stdout | app/api/streak/tests/refresh.test.ts > GET /api/streak - refresh parameter group > tests negative and fallback edge cases for invalid inputs of refresh +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":22,"requestId":"7ac06e30-8d79-4609-8694-a93b8f215cb2"} + +stdout | app/api/streak/tests/refresh.test.ts > GET /api/streak - refresh parameter group > tests negative and fallback edge cases for invalid inputs of refresh +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"03e2149a-a36b-4b2b-90a0-86fe16c39ddf"} + +stdout | app/api/streak/tests/refresh.test.ts > GET /api/streak - refresh parameter group > tests negative and fallback edge cases for invalid inputs of refresh +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":32,"requestId":"03e2149a-a36b-4b2b-90a0-86fe16c39ddf"} + +stdout | app/api/streak/tests/refresh.test.ts > GET /api/streak - refresh parameter group > tests negative and fallback edge cases for invalid inputs of refresh +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"d05e0892-b28c-47a2-ac12-be251b1f9f53"} + +stdout | app/api/streak/tests/refresh.test.ts > GET /api/streak - refresh parameter group > tests negative and fallback edge cases for invalid inputs of refresh +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":21,"requestId":"d05e0892-b28c-47a2-ac12-be251b1f9f53"} + +stdout | app/api/streak/tests/refresh.test.ts > GET /api/streak - refresh parameter group > asserts that appropriate HTTP headers are returned in responses (cache bypass) +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"ff4cb0c4-ff5c-4b98-a7d9-e6d8ed5a6eff"} + +stdout | app/api/streak/tests/refresh.test.ts > GET /api/streak - refresh parameter group > asserts that appropriate HTTP headers are returned in responses (cache bypass) +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"ff4cb0c4-ff5c-4b98-a7d9-e6d8ed5a6eff"} + +stdout | app/api/streak/tests/refresh.test.ts > GET /api/streak - refresh parameter group > asserts that appropriate HTTP headers are returned in responses (normal cache fallback) +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"527f9b1c-9b39-437f-a2af-8e68642d31d3"} + +stdout | app/api/streak/tests/refresh.test.ts > GET /api/streak - refresh parameter group > asserts that appropriate HTTP headers are returned in responses (normal cache fallback) +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":10,"requestId":"527f9b1c-9b39-437f-a2af-8e68642d31d3"} + +stdout | app/api/streak/tests/refresh.test.ts > GET /api/streak - refresh parameter group > returns rate limit status when GitHub API quota is low +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"22ccd8ed-700a-479c-87b0-c2cde0629be9"} + +stdout | app/api/streak/tests/refresh.test.ts > GET /api/streak - refresh parameter group > returns rate limit status when IP refresh limit is exceeded +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"b014238d-aeb8-4634-a36e-6d6fe15f4c6a"} + +stderr | app/api/streak/tests/refresh.test.ts > GET /api/streak - refresh parameter group > returns rate limit status when IP refresh limit is exceeded +{"timestamp":"2026-07-23T03:05:04.037Z","type":"SECURITY_EVENT","event":"UNTRUSTED_FORWARDED_HEADER_IGNORED","resolvedIp":"unknown","header":"x-forwarded-for"} + +stdout | app/api/streak/tests/refresh.test.ts > GET /api/streak - refresh parameter group > returns rate limit status when IP refresh limit is exceeded +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":18,"requestId":"b014238d-aeb8-4634-a36e-6d6fe15f4c6a"} + +stdout | app/api/streak/tests/refresh.test.ts > GET /api/streak - refresh parameter group > returns rate limit status when IP refresh limit is exceeded +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"7e47d9cc-1315-4aeb-a722-f82ff9280d30"} + +stdout | app/api/streak/tests/refresh.test.ts > GET /api/streak - refresh parameter group > falls back to cached data when per-username cooldown is active +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"d3611054-5705-41af-8c12-d8f1153ad3ae"} + +stdout | app/api/streak/tests/refresh.test.ts > GET /api/streak - refresh parameter group > falls back to cached data when per-username cooldown is active +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":9,"requestId":"d3611054-5705-41af-8c12-d8f1153ad3ae"} + +stdout | app/api/streak/tests/refresh.test.ts > GET /api/streak - refresh parameter group > falls back to cached data when per-username cooldown is active +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"ce668a7a-8e7c-4b48-adb0-432110e9885d"} + +stdout | app/api/streak/tests/refresh.test.ts > GET /api/streak - refresh parameter group > falls back to cached data when per-username cooldown is active +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":7,"requestId":"ce668a7a-8e7c-4b48-adb0-432110e9885d"} + +stdout | app/api/streak/tests/refresh.test.ts > GET /api/streak - refresh parameter group > returns JSON error response when JSON format is requested and rate limit is hit +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"4fe40b2e-cf03-4a12-9d61-867c4d032121"} + + ✓ app/api/streak/tests/refresh.test.ts (9 tests) 1380ms + ✓ tests negative and fallback edge cases for invalid inputs of refresh 396ms + ✓ app/generator/components/sections/NameSection.empty-fallback.test.tsx (5 tests) 1706ms + ✓ renders NameSection with an empty text configuration string or null values and displays a clear fallback layout placeholder or default username 1181ms + ✓ components/dashboard/PRInsights/ReviewAnalytics.responsive-breakpoints.test.tsx (5 tests) 1381ms + ✓ 1. mocks standard mobile-width media coordinates (e.g. 375px wide viewports) 824ms +stdout | app/api/streak/route.mock-integrations.test.ts > Asynchronous Service Layer Mocking & Local Cache Stubs > 1. Mock standard asynchronous imports and databases using stubs +[INFO] Incoming streak request {"source":"streak","user":"testuser","view":"default","requestId":"f3d03342-e68c-4277-947b-6bb3b90c6ee9"} + +stdout | app/api/streak/route.mock-integrations.test.ts > Asynchronous Service Layer Mocking & Local Cache Stubs > 1. Mock standard asynchronous imports and databases using stubs +[INFO] Streak request completed {"source":"streak","user":"testuser","view":"default","format":"svg","status":200,"durationMs":170,"requestId":"f3d03342-e68c-4277-947b-6bb3b90c6ee9"} + +stdout | app/api/streak/route.mock-integrations.test.ts > Asynchronous Service Layer Mocking & Local Cache Stubs > 2. Test service loading paths to ensure pending state overlays render +[INFO] Incoming streak request {"source":"streak","user":"testuser","view":"default","requestId":"36886bca-709e-4b7b-8de1-5c9a9c488e91"} + +stdout | app/api/streak/route.mock-integrations.test.ts > Asynchronous Service Layer Mocking & Local Cache Stubs > 2. Test service loading paths to ensure pending state overlays render +[INFO] Streak request completed {"source":"streak","user":"testuser","view":"default","format":"svg","status":200,"durationMs":21,"requestId":"36886bca-709e-4b7b-8de1-5c9a9c488e91"} + +stdout | app/api/streak/route.mock-integrations.test.ts > Asynchronous Service Layer Mocking & Local Cache Stubs > 3. Assert local cache layers are queried before triggering database retrievals +[INFO] Incoming streak request {"source":"streak","user":"cacheduser","view":"default","requestId":"d7eb4adc-ab12-4dc5-a101-d4bef5cc022e"} + +stdout | app/api/streak/route.mock-integrations.test.ts > Asynchronous Service Layer Mocking & Local Cache Stubs > 3. Assert local cache layers are queried before triggering database retrievals +[INFO] Streak request completed {"source":"streak","user":"cacheduser","view":"default","format":"svg","status":200,"durationMs":20,"requestId":"d7eb4adc-ab12-4dc5-a101-d4bef5cc022e"} + +stdout | app/api/streak/route.mock-integrations.test.ts > Asynchronous Service Layer Mocking & Local Cache Stubs > 3. Assert local cache layers are queried before triggering database retrievals +[INFO] Incoming streak request {"source":"streak","user":"cacheduser","view":"default","requestId":"1bbec23b-4152-4d9a-976a-3c0ff9f52a2b"} + +stdout | app/api/streak/route.mock-integrations.test.ts > Asynchronous Service Layer Mocking & Local Cache Stubs > 3. Assert local cache layers are queried before triggering database retrievals +[INFO] Streak request completed {"source":"streak","user":"cacheduser","view":"default","format":"svg","status":200,"durationMs":37,"requestId":"1bbec23b-4152-4d9a-976a-3c0ff9f52a2b"} + +stdout | app/api/streak/route.mock-integrations.test.ts > Asynchronous Service Layer Mocking & Local Cache Stubs > 4. Verify correct fallback procedures during fake endpoint timeout blocks +[INFO] Incoming streak request {"source":"streak","user":"timeoutuser","view":"default","requestId":"07751567-e04d-465f-b1a9-826e118d44c7"} + +stdout | app/api/streak/route.mock-integrations.test.ts > Asynchronous Service Layer Mocking & Local Cache Stubs > 4. Verify correct fallback procedures during fake endpoint timeout blocks +[INFO] Streak request completed {"source":"streak","user":"timeoutuser","view":"default","format":"svg","status":200,"durationMs":20,"requestId":"07751567-e04d-465f-b1a9-826e118d44c7"} + +stdout | app/api/streak/route.mock-integrations.test.ts > Asynchronous Service Layer Mocking & Local Cache Stubs > 5. Assert complete cache sync is written on success callbacks +[INFO] Incoming streak request {"source":"streak","user":"syncuser","view":"default","requestId":"934ca024-970f-4eb3-bb65-c6531cbaa3d0"} + +stdout | app/api/streak/route.mock-integrations.test.ts > Asynchronous Service Layer Mocking & Local Cache Stubs > 5. Assert complete cache sync is written on success callbacks +[INFO] Streak request completed {"source":"streak","user":"syncuser","view":"default","format":"svg","status":200,"durationMs":16,"requestId":"934ca024-970f-4eb3-bb65-c6531cbaa3d0"} + + ✓ app/api/streak/route.mock-integrations.test.ts (5 tests) 1173ms + ✓ 1. Mock standard asynchronous imports and databases using stubs 608ms + ✓ components/dashboard/DashboardSkeleton.responsive-breakpoints.test.tsx (5 tests) 1492ms + ✓ 4. Check that skeleton card components scale down gracefully 819ms + ✓ components/TopRivalriesTicker.mock-integrations.test.tsx (5 tests) 388ms + ✓ components/dashboard/RadarChart.theme-contrast.test.tsx (5 tests) 408ms +stderr | app/api/og/route.test.ts > OG Route > falls back to zeros when github fetch fails +[ERROR] Stats fetch failed {"source":"OG","error":{}} + +stderr | app/api/og/route.test.ts > OG Route > handles missing user query param +[ERROR] Stats fetch failed {"source":"OG","error":{}} + + ✓ components/dashboard/StatsCardSkeleton.theme-contrast.test.tsx (6 tests) 414ms +stderr | app/api/og/route.test.ts > OG Route > returns 429 when rate limit is exceeded +{"timestamp":"2026-07-23T03:05:19.977Z","type":"SECURITY_EVENT","event":"UNTRUSTED_FORWARDED_HEADER_IGNORED","resolvedIp":"unknown","header":"x-forwarded-for"} + + ✓ app/api/og/route.test.ts (8 tests) 448ms + ✓ returns 200 successfully 374ms + ✓ components/dashboard/ResumeProfileSection.mock-integrations.test.tsx (5 tests) 358ms + ✓ components/CherryBlossom.mock-integrations.test.tsx (5 tests) 1237ms + ✓ Test service loading paths to ensure pending state overlays render: initially renders null (pending state) 545ms + ✓ components/dashboard/ResumeUpload.empty-fallback.test.tsx (6 tests) 333ms + ✓ components/dashboard/AchievementsSkeleton.timezone-boundaries.test.tsx (5 tests) 406ms + ✓ app/components/theme-switch.theme-contrast.test.ts (5 tests) 444ms + ✓ components/dashboard/ProfileOptimizerModal.responsive-breakpoints.test.tsx (5 tests) 358ms + ✓ lib/svg/themes/lumos.test.ts (5 tests) 435ms + ✓ generates SVG with lumos theme containing correct hex color values 400ms + ✓ components/dashboard/StatsCardSkeleton.responsive-breakpoints.test.tsx (5 tests) 271ms +stdout | app/api/streak/tests/timezone.test.ts > Streak API — tz parameter > invalid timezone > returns 400 for a completely invalid timezone string +[INFO] Incoming streak request {"source":"streak","requestId":"ec730571-c8fe-4fb4-9637-450eb5054bbe"} + +stdout | app/api/streak/tests/timezone.test.ts > Streak API — tz parameter > invalid timezone > returns a JSON error body with fieldErrors for an invalid timezone +[INFO] Incoming streak request {"source":"streak","requestId":"17ed053b-9dc9-4737-b0ec-8d8fa2c490db"} + +stdout | app/api/streak/tests/timezone.test.ts > Streak API — tz parameter > invalid timezone > does not call the GitHub API when the timezone is invalid +[INFO] Incoming streak request {"source":"streak","requestId":"21f9b3ef-0678-496b-87bb-f2daaf597856"} + +stdout | app/api/streak/tests/timezone.test.ts > Streak API — tz parameter > invalid timezone > returns 400 for a timezone that is clearly garbage +[INFO] Incoming streak request {"source":"streak","requestId":"d166b790-01fe-4178-a05c-12eb56902a3a"} + +stdout | app/api/streak/tests/timezone.test.ts > Streak API — tz parameter > invalid timezone > sets Cache-Control: no-store on the error response +[INFO] Incoming streak request {"source":"streak","requestId":"46300760-0d5e-46ab-9053-89ae30ab4b9b"} + +stdout | app/api/streak/tests/timezone.test.ts > Streak API — tz parameter > valid timezone > returns 200 with SVG for a valid IANA timezone +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"2c4543b8-fc93-4b33-a03b-9dc617a8a953"} +[INFO] Streak request completed {"source":"streak","requestId":"2c4543b8-fc93-4b33-a03b-9dc617a8a953"} + +stdout | app/api/streak/tests/timezone.test.ts > Streak API — tz parameter > valid timezone > returns 200 with SVG for a valid IANA timezone +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":14} + +stdout | app/api/streak/tests/timezone.test.ts > Streak API — tz parameter > valid timezone > returns 200 for Asia/Kolkata +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"bbdb4bc8-9708-433a-8b31-5538d7e0411c"} +[INFO] Streak request completed {"source":"streak","requestId":"bbdb4bc8-9708-433a-8b31-5538d7e0411c"} + +stdout | app/api/streak/tests/timezone.test.ts > Streak API — tz parameter > valid timezone > returns 200 for Asia/Kolkata +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":5} + +stdout | app/api/streak/tests/timezone.test.ts > Streak API — tz parameter > valid timezone > returns 200 for UTC +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"c43fb67a-c697-4dd2-a3a2-c48adaca2eb1"} +[INFO] Streak request completed {"source":"streak","requestId":"c43fb67a-c697-4dd2-a3a2-c48adaca2eb1"} + +stdout | app/api/streak/tests/timezone.test.ts > Streak API — tz parameter > valid timezone > returns 200 for UTC +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":4} + +stdout | app/api/streak/tests/timezone.test.ts > Streak API — tz parameter > valid timezone > uses getSecondsUntilMidnightInTimezone when a valid tz is provided +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"ef7f9ba4-0ac2-49c4-923b-1a6167d310fe"} +[INFO] Streak request completed {"source":"streak","requestId":"ef7f9ba4-0ac2-49c4-923b-1a6167d310fe"} + +stdout | app/api/streak/tests/timezone.test.ts > Streak API — tz parameter > valid timezone > uses getSecondsUntilMidnightInTimezone when a valid tz is provided +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2} + +stdout | app/api/streak/tests/timezone.test.ts > Streak API — tz parameter > omitted timezone > returns 200 when no tz param is provided +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"35328f23-0125-40bd-af56-34362ab30d00"} + +stdout | app/api/streak/tests/timezone.test.ts > Streak API — tz parameter > omitted timezone > returns 200 when no tz param is provided +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":3,"requestId":"35328f23-0125-40bd-af56-34362ab30d00"} + +stdout | app/api/streak/tests/timezone.test.ts > Streak API — tz parameter > omitted timezone > uses getSecondsUntilUTCMidnight when tz is omitted +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"8d4cf7e1-509c-4090-9069-465ce5f2129e"} + +stdout | app/api/streak/tests/timezone.test.ts > Streak API — tz parameter > omitted timezone > uses getSecondsUntilUTCMidnight when tz is omitted +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"8d4cf7e1-509c-4090-9069-465ce5f2129e"} + + ✓ app/api/streak/tests/timezone.test.ts (11 tests) 259ms + ✓ app/generator/utils/readmeGenerator.accessibility.test.ts (5 tests) 279ms + ✓ components/dashboard/RadarChart.mock-integrations.test.tsx (5 tests) 314ms + ✓ components/dashboard/PRInsights/Highlights.mock-integrations.test.tsx (5 tests) 560ms + ✓ 2. simulates pending service state before rendering 382ms + ✓ components/dashboard/DashboardSkeleton.timezone-boundaries.test.tsx (5 tests) 294ms + ✓ app/generator/components/sections/NameSection.theme-contrast.test.tsx (6 tests) 283ms +stderr | components/Leaderboard.theme-contrast.test.tsx > Leaderboard theme contrast behavior > renders leaderboard container +React does not recognize the `whileInView` prop on a DOM element. If you intentionally want it to appear in the DOM as a custom attribute, spell it as lowercase `whileinview` instead. If you accidentally passed it from a parent component, remove it from the DOM element. +React does not recognize the `whileHover` prop on a DOM element. If you intentionally want it to appear in the DOM as a custom attribute, spell it as lowercase `whilehover` instead. If you accidentally passed it from a parent component, remove it from the DOM element. + +stderr | app/api/notify/route.test.ts > POST /api/notify > returns 500 when MONGODB_URI is not set in production +[ERROR] Notification registration disabled: MONGODB_URI is not set {"environment":"production"} + +stderr | app/api/notify/route.test.ts > POST /api/notify > bypasses gracefully when MONGODB_URI is not set in development +[WARN] Notification registration bypassed: MONGODB_URI is not set {"environment":"development"} + +stderr | app/api/notify/route.test.ts > GET /api/notify > returns 500 when MONGODB_URI is not set in production +[ERROR] Notification lookup disabled: MONGODB_URI is not set {"environment":"production"} + +stderr | app/api/notify/route.test.ts > GET /api/notify > bypasses gracefully when MONGODB_URI is not set in development +[WARN] Notification lookup bypassed: MONGODB_URI is not set {"environment":"development"} + + ✓ app/api/notify/route.test.ts (32 tests) 245ms + ✓ components/Leaderboard.theme-contrast.test.tsx (5 tests) 307ms + ✓ app/generator/components/sections/NameSection.responsive-breakpoints.test.tsx (5 tests) 216ms + ✓ app/compare/page.mock-integrations.test.tsx (5 tests) 161ms + ✓ app/api/wrapped/route.responsive-breakpoints.test.tsx (5 tests) 407ms + ✓ components/dashboard/ResumeProfileSection.timezone-boundaries.test.tsx (5 tests) 445ms + ✓ components/dashboard/ComparisonStatsCard.empty-fallback.test.tsx (4 tests) 401ms + ✓ renders neutral progress bar when both values are zero 325ms + ✓ app/components/Icons.responsive-breakpoints.test.tsx (5 tests) 236ms +stderr | components/dashboard/CommitClock.mock-integrations.test.tsx > CommitClock: Asynchronous Service Layer Mocking & Local Cache Stubs > Test 1: should mock standard asynchronous imports and databases using stubs +Each child in a list should have a unique "key" prop. + +Check the render method of `svg`. It was passed a child from CommitClock. See https://react.dev/link/warning-keys for more information. + + ✓ components/dashboard/CommitClock.mock-integrations.test.tsx (5 tests) 446ms + ✓ components/dashboard/PRInsights/PRStatusDistribution.empty-fallback.test.tsx (5 tests) 287ms +stderr | components/DiscordButton.responsive-breakpoints.test.tsx > DiscordButton - Responsive Breakpoints & Mobile Layouts > Mobile Viewport Simulation: renders without crashing on 375px mobile viewport +React does not recognize the `whileTap` prop on a DOM element. If you intentionally want it to appear in the DOM as a custom attribute, spell it as lowercase `whiletap` instead. If you accidentally passed it from a parent component, remove it from the DOM element. + + ✓ components/DiscordButton.responsive-breakpoints.test.tsx (5 tests) 323ms + ✓ components/dashboard/PopularPinnnedRepos.empty-fallback.test.tsx (6 tests) 400ms + ✓ components/dashboard/PopularPinnnedRepos.responsive-breakpoints.test.tsx (5 tests) 325ms + ✓ components/dashboard/GithubWrapped.mock-integrations.test.tsx (5 tests) 404ms + ✓ renders wrapped stats synchronously without requiring any async service calls 372ms + ✓ components/dashboard/PRInsights/ReviewAnalytics.empty-fallback.test.tsx (5 tests) 461ms +stdout | app/api/streak/tests/views.test.ts > GET /api/streak view parameter integration > returns 200 and the standard SVG headers for view=default +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"e06753b1-464a-452d-b5bb-318842c11c93"} + +stdout | app/api/streak/tests/views.test.ts > GET /api/streak view parameter integration > returns 200 and the standard SVG headers for view=default +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":33,"requestId":"e06753b1-464a-452d-b5bb-318842c11c93"} + +stdout | app/api/streak/tests/views.test.ts > GET /api/streak view parameter integration > returns 200 and renders monthly dimensions for view=monthly +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"monthly","requestId":"f3a44e9f-e9f6-4729-9e29-c07d0eda3032"} + +stdout | app/api/streak/tests/views.test.ts > GET /api/streak view parameter integration > returns 200 and renders monthly dimensions for view=monthly +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"monthly","format":"svg","status":200,"durationMs":6,"requestId":"f3a44e9f-e9f6-4729-9e29-c07d0eda3032"} + +stdout | app/api/streak/tests/views.test.ts > GET /api/streak view parameter integration > falls back to the default layout when view is omitted +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"325548e6-f944-4e39-be34-0113009008d2"} + +stdout | app/api/streak/tests/views.test.ts > GET /api/streak view parameter integration > falls back to the default layout when view is omitted +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"325548e6-f944-4e39-be34-0113009008d2"} + +stdout | app/api/streak/tests/views.test.ts > GET /api/streak view parameter integration > treats an invalid view value as default without crashing +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"db1cca80-0c78-456a-b4bc-62f02ad0e77e"} + +stdout | app/api/streak/tests/views.test.ts > GET /api/streak view parameter integration > treats an invalid view value as default without crashing +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"db1cca80-0c78-456a-b4bc-62f02ad0e77e"} + +stdout | app/api/streak/tests/views.test.ts > GET /api/streak view parameter integration > returns 200 and renders radar map for view=radar +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"radar","requestId":"791a5179-34ee-4234-a4b9-0da71ef5142c"} + +stdout | app/api/streak/tests/views.test.ts > GET /api/streak view parameter integration > returns 200 and renders radar map for view=radar +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"radar","format":"svg","status":200,"durationMs":2,"requestId":"791a5179-34ee-4234-a4b9-0da71ef5142c"} + +stdout | app/api/streak/tests/views.test.ts > GET /api/streak view parameter integration > exposes stable caching headers on the SVG response +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"4d112ca4-6325-4044-bcdd-fc64c876c3a6"} + +stdout | app/api/streak/tests/views.test.ts > GET /api/streak view parameter integration > exposes stable caching headers on the SVG response +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"4d112ca4-6325-4044-bcdd-fc64c876c3a6"} + + ✓ app/api/streak/tests/views.test.ts (6 tests) 153ms + ✓ lib/validations.test.ts (196 tests) 277ms + ✓ hooks/useRecentSearches.timezone-boundaries.test.ts (5 tests) 104ms + ✓ components/ShareButtons.timezone-boundaries.test.tsx (5 tests) 182ms + ✓ components/dashboard/PRInsights/RepoPerformanceTable.error-resilience.test.tsx (5 tests) 317ms + ✓ components/dashboard/DashboardSkeleton.test.tsx (3 tests) 251ms + ✓ components/dashboard/ComparisonStatsCard.mouse-interactivity.test.tsx (5 tests) 304ms + ✓ components/dashboard/PRInsights/RepoPerformanceTable.mouse-interactivity.test.tsx (5 tests) 279ms + ✓ components/ShareButtons.mock-integrations.test.tsx (5 tests) 212ms + ✓ components/TopRivalriesTicker.empty-fallback.test.tsx (5 tests) 293ms +stderr | app/layout.mock-integrations.test.tsx > Layout Asynchronous Service Layer Mocking & Local Cache Stubs > mocks standard asynchronous imports and databases using stubs +In HTML, <html> cannot be a child of <div>. +This will cause a hydration error. + + ✓ app/layout.mock-integrations.test.tsx (5 tests) 209ms +stderr | components/dashboard/AIInsights.type-compiler.test.tsx > AIInsights — TypeScript Compiler Validation & Schema Constraints Stability > validates that AIInsight fields id, icon, and text are all required strings +React does not recognize the `whileInView` prop on a DOM element. If you intentionally want it to appear in the DOM as a custom attribute, spell it as lowercase `whileinview` instead. If you accidentally passed it from a parent component, remove it from the DOM element. + + ✓ components/dashboard/AIInsights.type-compiler.test.tsx (5 tests) 318ms + ✓ components/dashboard/ResumeProfileSection.test.tsx (6 tests) 195ms +stdout | app/api/streak/route.empty-fallback.test.ts > ApiStreakRoute - Edge Cases & Empty/Missing Inputs > renders without breaking when calendar arrays are completely empty +[INFO] Incoming streak request {"source":"streak","user":"emptyuser","view":"default","requestId":"8049d450-693c-4c89-bdd9-82a84f87b51b"} + +stdout | app/api/streak/route.empty-fallback.test.ts > ApiStreakRoute - Edge Cases & Empty/Missing Inputs > renders without breaking when calendar arrays are completely empty +[INFO] Streak request completed {"source":"streak","user":"emptyuser","view":"default","format":"svg","status":200,"durationMs":16,"requestId":"8049d450-693c-4c89-bdd9-82a84f87b51b"} + +stdout | app/api/streak/route.empty-fallback.test.ts > ApiStreakRoute - Edge Cases & Empty/Missing Inputs > returns a fallback error response when required parameters are missing +[INFO] Incoming streak request {"source":"streak","requestId":"e20f9590-fdb4-4783-872b-2ac4a37b73be"} + +stdout | app/api/streak/route.empty-fallback.test.ts > ApiStreakRoute - Edge Cases & Empty/Missing Inputs > maintains standard styles when weeks exist but contribution counts are zero +[INFO] Incoming streak request {"source":"streak","user":"zerouser","view":"default","requestId":"48406303-40fd-4e6c-a7f8-e6cd18c9fc6b"} + +stdout | app/api/streak/route.empty-fallback.test.ts > ApiStreakRoute - Edge Cases & Empty/Missing Inputs > maintains standard styles when weeks exist but contribution counts are zero +[INFO] Streak request completed {"source":"streak","user":"zerouser","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"48406303-40fd-4e6c-a7f8-e6cd18c9fc6b"} + +stdout | app/api/streak/route.empty-fallback.test.ts > ApiStreakRoute - Edge Cases & Empty/Missing Inputs > handles offline fallback state from GitHub fetcher gracefully +[INFO] Incoming streak request {"source":"streak","user":"offlineuser","view":"default","requestId":"83491f3c-3253-478a-b068-97c1322d3059"} + +stdout | app/api/streak/route.empty-fallback.test.ts > ApiStreakRoute - Edge Cases & Empty/Missing Inputs > handles offline fallback state from GitHub fetcher gracefully +[INFO] Streak request completed {"source":"streak","user":"offlineuser","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"83491f3c-3253-478a-b068-97c1322d3059"} + +stdout | app/api/streak/route.empty-fallback.test.ts > ApiStreakRoute - Edge Cases & Empty/Missing Inputs > returns valid JSON with empty values when format=json and inputs are empty +[INFO] Incoming streak request {"source":"streak","user":"jsonuser","view":"default","requestId":"83860788-0a68-4fda-b044-010e48dfeaa1"} + +stdout | app/api/streak/route.empty-fallback.test.ts > ApiStreakRoute - Edge Cases & Empty/Missing Inputs > returns valid JSON with empty values when format=json and inputs are empty +[INFO] Streak request completed {"source":"streak","user":"jsonuser","view":"default","format":"json","status":200,"durationMs":5,"requestId":"83860788-0a68-4fda-b044-010e48dfeaa1"} + + ✓ app/api/streak/route.empty-fallback.test.ts (5 tests) 128ms + ✓ components/TopRivalriesTicker.error-resilience.test.tsx (5 tests) 381ms +stderr | app/api/repo-burnout/route.test.ts > GET /api/repo-burnout > returns 400 when owner or repo is missing +{"timestamp":"2026-07-23T03:05:47.851Z","type":"SECURITY_EVENT","event":"UNTRUSTED_FORWARDED_HEADER_IGNORED","resolvedIp":"unknown","header":"x-forwarded-for"} + +stderr | app/api/repo-burnout/route.test.ts > GET /api/repo-burnout > returns 429 when GitHub API quota is low and refresh is requested +[Quota Low] Blocked manual refresh from IP 127.0.0.1 for octocat/hello-world + +stderr | app/api/repo-burnout/route.test.ts > GET /api/repo-burnout > returns 429 when IP refresh limit is exceeded +[Rate Limit Exceeded] Blocked manual refresh from IP 127.0.0.1 for octocat/hello-world + +stderr | app/api/repo-burnout/route.test.ts > GET /api/repo-burnout > returns 429 when GitHub API quota is low and bypassCache is requested +[Quota Low] Blocked manual refresh from IP 127.0.0.1 for octocat/hello-world + +stderr | app/api/repo-burnout/route.test.ts > GET /api/repo-burnout > returns 429 when IP refresh limit is exceeded for bypassCache +[Rate Limit Exceeded] Blocked manual refresh from IP 127.0.0.1 for octocat/hello-world + +stderr | app/api/repo-burnout/route.test.ts > GET /api/repo-burnout > shares rate limit between refresh and bypassCache parameters +[Rate Limit Exceeded] Blocked manual refresh from IP 127.0.0.1 for octocat/hello-world + +stderr | app/api/repo-burnout/route.test.ts > GET /api/repo-burnout > returns 404 when repository is not found +Error in /api/repo-burnout for octocat/nonexistent: Error: not found + at /home/atulupadhyay/Contribution/commitpulse/app/api/repo-burnout/route.test.ts:189:55 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:302:11 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:1903:26 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2326:20 + at new Promise (<anonymous>) + at runWithCancel (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2323:10) + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2305:20 + at new Promise (<anonymous>) + at runWithTimeout (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2272:10) + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2955:64 + +stderr | app/api/repo-burnout/route.test.ts > GET /api/repo-burnout > returns 500 with generic error message for unexpected errors +Error in /api/repo-burnout for octocat/hello-world: Error: Database connection failed + at /home/atulupadhyay/Contribution/commitpulse/app/api/repo-burnout/route.test.ts:197:55 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:302:11 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:1903:26 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2326:20 + at new Promise (<anonymous>) + at runWithCancel (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2323:10) + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2305:20 + at new Promise (<anonymous>) + at runWithTimeout (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2272:10) + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2955:64 + +stderr | app/api/repo-burnout/route.test.ts > GET /api/repo-burnout > returns 500 with generic error message for non-Error thrown values +Error in /api/repo-burnout for octocat/hello-world: unexpected failure + + ✓ app/api/repo-burnout/route.test.ts (14 tests) 157ms + ✓ components/dashboard/StatsCardSkeleton.empty-fallback.test.tsx (5 tests) 135ms +stderr | components/dashboard/ComparisonStatsCard.theme-contrast.test.tsx > ComparisonStatsCard — Theme & Color Cohesion > renders light and dark mode surface and border classes on card container +React does not recognize the `whileInView` prop on a DOM element. If you intentionally want it to appear in the DOM as a custom attribute, spell it as lowercase `whileinview` instead. If you accidentally passed it from a parent component, remove it from the DOM element. +React does not recognize the `whileHover` prop on a DOM element. If you intentionally want it to appear in the DOM as a custom attribute, spell it as lowercase `whilehover` instead. If you accidentally passed it from a parent component, remove it from the DOM element. + + ✓ components/dashboard/ComparisonStatsCard.theme-contrast.test.tsx (5 tests) 268ms + ✓ lib/svg/generator.opacity.test.ts (16 tests) 234ms + ✓ app/(root)/dashboard/layout.mock-integrations.test.tsx (2 tests) 165ms + ✓ components/dashboard/ResumePreviewForm.theme-contrast.test.tsx (5 tests) 278ms + ✓ components/dashboard/Achievements.responsive-breakpoints.test.tsx (5 tests) 365ms + ✓ app/(root)/dashboard/[username]/loading.mouse-interactivity.test.tsx (5 tests) 303ms + ✓ app/components/Icons.error-resilience.test.tsx (5 tests) 309ms + ✓ app/components/FeatureCard.theme-contrast.test.tsx (5 tests) 270ms + ✓ components/dashboard/AIInsights.timezone-boundaries.test.tsx (5 tests) 288ms + ✓ models/Notification.timezone-boundaries.test.ts (5 tests) 150ms + ✓ components/dashboard/RepositoryGraph.empty-fallback.test.tsx (5 tests) 252ms + ✓ components/ShareButtons.theme-contrast.test.tsx (5 tests) 148ms +stderr | components/dashboard/StatsCard.mock-integrations.test.tsx > StatsCard mock integrations > renders with mocked Flame icon +React does not recognize the `whileInView` prop on a DOM element. If you intentionally want it to appear in the DOM as a custom attribute, spell it as lowercase `whileinview` instead. If you accidentally passed it from a parent component, remove it from the DOM element. +React does not recognize the `whileHover` prop on a DOM element. If you intentionally want it to appear in the DOM as a custom attribute, spell it as lowercase `whilehover` instead. If you accidentally passed it from a parent component, remove it from the DOM element. + + ✓ components/dashboard/StatsCard.mock-integrations.test.tsx (5 tests) 319ms +stderr | components/Leaderboard.error-resilience.test.tsx > Leaderboard error resilience > renders without crashing with valid contributor data +React does not recognize the `whileInView` prop on a DOM element. If you intentionally want it to appear in the DOM as a custom attribute, spell it as lowercase `whileinview` instead. If you accidentally passed it from a parent component, remove it from the DOM element. + + ✓ components/Leaderboard.error-resilience.test.tsx (5 tests) 260ms +stderr | app/contributors/page.error-resilience.test.tsx > ContributorsPage Error Resilience > handles failed contributor fetches without crashing +[ERROR] Failed to fetch contributors {"error":{}} + +stderr | app/contributors/page.error-resilience.test.tsx > ContributorsPage Error Resilience > handles rate limit responses gracefully +[ERROR] Failed to fetch contributors {"error":{}} + +stderr | app/contributors/page.error-resilience.test.tsx > ContributorsPage Error Resilience > passes empty contributor collections after fetch failures +[ERROR] Failed to fetch contributors {"error":{}} + +stderr | app/contributors/page.error-resilience.test.tsx > ContributorsPage Error Resilience > continues rendering when unexpected service exceptions occur +[ERROR] Failed to fetch contributors {"error":{}} + + ✓ app/contributors/page.error-resilience.test.tsx (5 tests) 157ms + ✓ components/dashboard/StatsCard.responsive-breakpoints.test.tsx (5 tests) 240ms + ✓ app/generator/data/technologies.mouse-interactivity.test.tsx (5 tests) 295ms + ✓ components/dashboard/StatsCardSkeleton.test.tsx (4 tests) 295ms + ✓ components/dashboard/Heatmap.empty-fallback.test.tsx (5 tests) 221ms + ✓ app/customize/components/SectionLabel.mock-integrations.test.tsx (5 tests) 200ms + ✓ components/ShareButtons.mouse-interactivity.test.tsx (5 tests) 299ms + ✓ components/dashboard/StatsCardSkeleton.mock-integrations.test.tsx (5 tests) 217ms + ✓ components/dashboard/AchievementsSkeleton.mock-integrations.test.tsx (5 tests) 149ms + ✓ hooks/useShareActions.error-resilience.test.ts (5 tests) 179ms + ✓ lib/svg/generator.additional.test.ts (81 tests) 103ms + ✓ components/dashboard/ProfileOptimizerModal.mouse-interactivity.test.tsx (5 tests) 218ms + ✓ app/components/Icons.timezone-boundaries.test.tsx (5 tests) 215ms + ✓ components/dashboard/StatsCard.timezone-boundaries.test.tsx (5 tests) 194ms + ✓ components/dashboard/RadarChart.error-resilience.test.tsx (5 tests) 159ms + ✓ app/customize/components/SectionLabel.error-resilience.test.tsx (5 tests) 221ms + ✓ components/dashboard/PRInsights/Highlights.error-resilience.test.tsx (4 tests) 333ms +stdout | app/api/streak/tests/staleWatermark.test.ts > GET /api/streak stale watermark > adds the stale watermark when the fetcher returns offline fallback data +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"e6dd2527-0ae2-4836-843c-1b8dc3369313"} + +stdout | app/api/streak/tests/staleWatermark.test.ts > GET /api/streak stale watermark > adds the stale watermark when the fetcher returns offline fallback data +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":33,"requestId":"e6dd2527-0ae2-4836-843c-1b8dc3369313"} + +stdout | app/api/streak/tests/staleWatermark.test.ts > GET /api/streak stale watermark > does not add the stale watermark for a live fetch +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"b0de93b4-ae4d-46d5-9151-0795febcc8be"} + +stdout | app/api/streak/tests/staleWatermark.test.ts > GET /api/streak stale watermark > does not add the stale watermark for a live fetch +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"b0de93b4-ae4d-46d5-9151-0795febcc8be"} + + ✓ app/api/streak/tests/staleWatermark.test.ts (2 tests) 230ms + ✓ components/dashboard/StatsCardSkeleton.timezone-boundaries.test.tsx (5 tests) 346ms +stdout | app/api/streak/tests/theme.test.ts > Streak API - theme parameter integration tests > should return 200 OK and render dark theme by default +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"89ae95e2-6472-4c9e-b5b1-6225257d2867"} + +stdout | app/api/streak/tests/theme.test.ts > Streak API - theme parameter integration tests > should return 200 OK and render dark theme by default +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":32,"requestId":"89ae95e2-6472-4c9e-b5b1-6225257d2867"} + +stdout | app/api/streak/tests/theme.test.ts > Streak API - theme parameter integration tests > should return 200 OK and render light theme when theme is light +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"c1564cdc-1210-44d3-9519-dfa873e5dab6"} + +stdout | app/api/streak/tests/theme.test.ts > Streak API - theme parameter integration tests > should return 200 OK and render light theme when theme is light +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"c1564cdc-1210-44d3-9519-dfa873e5dab6"} + +stdout | app/api/streak/tests/theme.test.ts > Streak API - theme parameter integration tests > should return 200 OK when theme is auto +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"c5c9b577-8b79-475d-bdb5-e845635dbf36"} + +stdout | app/api/streak/tests/theme.test.ts > Streak API - theme parameter integration tests > should return 200 OK when theme is auto +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"c5c9b577-8b79-475d-bdb5-e845635dbf36"} + +stdout | app/api/streak/tests/theme.test.ts > Streak API - theme parameter integration tests > should return 200 OK when theme is random +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"5bfa7acf-f956-4a10-abd2-7cfca34590c9"} + +stdout | app/api/streak/tests/theme.test.ts > Streak API - theme parameter integration tests > should return 200 OK when theme is random +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"5bfa7acf-f956-4a10-abd2-7cfca34590c9"} + +stdout | app/api/streak/tests/theme.test.ts > Streak API - theme parameter integration tests > should return 400 Bad Request when theme parameter is invalid +[INFO] Incoming streak request {"source":"streak","requestId":"e1474ec5-7627-4507-aa1e-7b2a7374f6e7"} + +stdout | app/api/streak/tests/theme.test.ts > Streak API - theme parameter integration tests > should produce different SVGs when theme is dark vs light +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"9071a943-6cac-4d21-8f05-4574beb01e2a"} + +stdout | app/api/streak/tests/theme.test.ts > Streak API - theme parameter integration tests > should produce different SVGs when theme is dark vs light +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"9071a943-6cac-4d21-8f05-4574beb01e2a"} + +stdout | app/api/streak/tests/theme.test.ts > Streak API - theme parameter integration tests > should produce different SVGs when theme is dark vs light +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"238234cd-a2e1-4b1d-b50a-c542c45d6495"} + +stdout | app/api/streak/tests/theme.test.ts > Streak API - theme parameter integration tests > should produce different SVGs when theme is dark vs light +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"238234cd-a2e1-4b1d-b50a-c542c45d6495"} + + ✓ app/api/streak/tests/theme.test.ts (6 tests) 269ms + ✓ lib/validations.empty-fallback.test.ts (8 tests) 201ms + ✓ components/commitpulse-logo.accessibility.test.tsx (5 tests) 104ms + ✓ components/CherryBlossom.empty-fallback.test.tsx (5 tests) 381ms + ✓ components/dashboard/DependencyIntelligenceCenter.test.tsx (2 tests) 351ms +stderr | app/contributors/page.mock-integrations.test.tsx > ContributorsPage Mock Integrations > falls back to empty contributor data on failed endpoint responses +[ERROR] Failed to fetch contributors {"error":{}} + + ✓ app/contributors/page.mock-integrations.test.tsx (5 tests) 126ms + ✓ components/dashboard/CollaborationIntelligenceHub.test.tsx (2 tests) 305ms + ✓ app/generator/components/sections/NameSection.mock-integrations.test.tsx (5 tests) 430ms + ✓ hooks/useDebounce.empty-fallback.test.ts (5 tests) 161ms +stderr | app/api/stats/route.test.ts > GET /api/stats > serves cached stats instead of bypassing cache during refresh cooldown +{"timestamp":"2026-07-23T03:06:10.002Z","type":"SECURITY_EVENT","event":"STATS_REFRESH_COOLDOWN_VIOLATION","user":"testuser","ip":"127.0.0.1","remainingMs":29997} + +stderr | app/api/stats/route.test.ts > GET /api/stats > returns 429 when stats refresh exceeds the client refresh rate limit +{"timestamp":"2026-07-23T03:06:10.010Z","type":"SECURITY_EVENT","event":"UNTRUSTED_FORWARDED_HEADER_IGNORED","resolvedIp":"unknown","header":"x-real-ip"} + +stderr | app/api/stats/route.test.ts > GET /api/stats > returns 429 when stats refresh exceeds the client refresh rate limit +{"timestamp":"2026-07-23T03:06:10.014Z","type":"SECURITY_EVENT","event":"STATS_REFRESH_RATE_LIMIT_EXCEEDED","user":"octocat","ip":"127.0.0.1","limit":1} + +stderr | app/api/stats/route.test.ts > GET /api/stats > blocks stats refresh when the shared GitHub quota is low +{"timestamp":"2026-07-23T03:06:10.017Z","type":"SECURITY_EVENT","event":"LOW_QUOTA_STATS_REFRESH_BLOCKED","user":"testuser","ip":"127.0.0.1","remainingQuota":400} + +stderr | app/api/stats/route.test.ts > GET /api/stats > returns 500 when the GitHub API throws +[ERROR] Unhandled error in /api/stats {"error":{}} + +stderr | app/api/stats/route.test.ts > GET /api/stats > returns 500 with a generic message for non-Error throws +[ERROR] Unhandled error in /api/stats {"error":"something went wrong"} + + ✓ app/api/stats/route.test.ts (21 tests) 203ms + ✓ components/dashboard/VisualizationTooltip.timezone-boundaries.test.tsx (5 tests) 395ms + ✓ renders correctly with UTC timezone content 327ms + ✓ app/template.mouse-interactivity.test.tsx (5 tests) 434ms + ✓ displays the interactive tooltip overlay when a mouseenter event triggers on the node 348ms +stderr | components/DiscordButton.empty-fallback.test.tsx > DiscordButton - Edge Cases & Empty/Missing Inputs > renders without crashing with no props +React does not recognize the `whileTap` prop on a DOM element. If you intentionally want it to appear in the DOM as a custom attribute, spell it as lowercase `whiletap` instead. If you accidentally passed it from a parent component, remove it from the DOM element. + + ✓ components/commitpulse-logo.mouse-interactivity.test.tsx (5 tests) 163ms + ✓ components/DiscordButton.empty-fallback.test.tsx (5 tests) 543ms + ✓ renders without crashing with no props 321ms + ✓ app/components/FeatureCard.mouse-interactivity.test.tsx (5 tests) 176ms + ✓ hooks/useGlowEffect.mouse-interactivity.test.ts (5 tests) 246ms + ✓ app/template.theme-contrast.test.tsx (5 tests) 577ms + ✓ Case 1: Emulate a light preset and assert structural identifiers appear 473ms + ✓ components/dashboard/AIInsightsSkeleton.test.tsx (4 tests) 113ms +stderr | components/dashboard/AIInsights.error-resilience.test.tsx > AIInsights Error Resilience & Robustness > handles insights with missing id field gracefully +Each child in a list should have a unique "key" prop. + +Check the render method of `AIInsights`. See https://react.dev/link/warning-keys for more information. +React does not recognize the `whileInView` prop on a DOM element. If you intentionally want it to appear in the DOM as a custom attribute, spell it as lowercase `whileinview` instead. If you accidentally passed it from a parent component, remove it from the DOM element. + + ✓ app/(root)/dashboard/layout.responsive-breakpoints.test.tsx (5 tests) 241ms + ✓ components/dashboard/AIInsights.error-resilience.test.tsx (5 tests) 275ms +stderr | middleware.test.ts > middleware > ignores spoofed X-Forwarded-For when request.ip is present +{"timestamp":"2026-07-23T03:06:15.815Z","type":"SECURITY_EVENT","event":"SPOOFED_HEADER_ATTEMPT","claimedIp":"1.2.3.4","resolvedIp":"203.0.113.10","header":"x-forwarded-for"} + +stderr | middleware.test.ts > middleware integration tests (rate-limit spoofing prevention) > Scenario 1: Default (No trusted proxies) ignores spoofed headers and locks rate limit to default/connection IP +{"timestamp":"2026-06-26T06:32:00.000Z","type":"SECURITY_EVENT","event":"UNTRUSTED_FORWARDED_HEADER_IGNORED","resolvedIp":"unknown","header":"x-forwarded-for"} + +stderr | middleware.test.ts > middleware integration tests (rate-limit spoofing prevention) > Scenario 1b: Default (No trusted proxies) uses connection IP (request.ip) and ignores spoofed X-Forwarded-For +{"timestamp":"2026-06-26T06:34:00.000Z","type":"SECURITY_EVENT","event":"SPOOFED_HEADER_ATTEMPT","claimedIp":"1.2.3.0","resolvedIp":"192.0.2.200","header":"x-forwarded-for"} + + ✓ middleware.test.ts (13 tests) 406ms +stderr | app/contributors/page.accessibility.test.tsx > ContributorsPage Accessibility > renders successfully when contributor data is empty +[ERROR] Failed to fetch contributors {"error":{}} + + ✓ app/contributors/page.accessibility.test.tsx (5 tests) 158ms +stderr | components/dashboard/CommitClock.empty-fallback.test.tsx > CommitClock - Empty Fallback > renders fallback UI when data array is empty +React does not recognize the `whileInView` prop on a DOM element. If you intentionally want it to appear in the DOM as a custom attribute, spell it as lowercase `whileinview` instead. If you accidentally passed it from a parent component, remove it from the DOM element. + + ✓ components/dashboard/CommitClock.empty-fallback.test.tsx (5 tests) 214ms +stdout | app/api/wrapped/route.test.ts > GET /api/wrapped > cache-control header > bypasses the cache entirely when refresh=true is specified +recordRefresh executed + +stderr | app/api/wrapped/route.test.ts > GET /api/wrapped > error handling > returns 500 with SVG error structure when fetch throws +[ERROR] Unhandled error {"source":"wrapped","message":"GitHub is down"} + + ✓ components/dashboard/AIInsights.test.tsx (5 tests) 214ms +stdout | app/api/wrapped/route.test.ts > GET /api/wrapped > cache bypass security > returns 429 when IP refresh limit is exceeded +recordRefresh executed + +stdout | app/api/wrapped/route.test.ts > GET /api/wrapped > cache bypass security > falls back to cached data when per-username cooldown is active +recordRefresh executed + + ✓ app/api/wrapped/route.test.ts (27 tests) 181ms + ✓ components/dashboard/AIInsightsSkeleton.mouse-interactivity.test.tsx (5 tests) 239ms + ✓ hooks/useRecentSearches.mock-integrations.test.ts (5 tests) 77ms + ✓ components/dashboard/AIInsightsSkeleton.theme-contrast.test.tsx (5 tests) 134ms + ✓ components/dashboard/AchievementsSkeleton.theme-contrast.test.tsx (5 tests) 245ms +stdout | app/api/streak/tests/layout.test.ts > Streak API - layout parameter integration tests > should return 200 OK and render default layout when layout parameter is default +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"5dd702a2-15fe-4c39-b65d-86ee126bcc74"} + +stdout | app/api/streak/tests/layout.test.ts > Streak API - layout parameter integration tests > should return 200 OK and render default layout when layout parameter is default +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":40,"requestId":"5dd702a2-15fe-4c39-b65d-86ee126bcc74"} + +stdout | app/api/streak/tests/layout.test.ts > Streak API - layout parameter integration tests > should return 200 OK and render compact layout when layout parameter is compact +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"de1338dd-ae5c-4e28-837f-9a01b2cc6fcf"} + +stdout | app/api/streak/tests/layout.test.ts > Streak API - layout parameter integration tests > should return 200 OK and render compact layout when layout parameter is compact +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":3,"requestId":"de1338dd-ae5c-4e28-837f-9a01b2cc6fcf"} + +stdout | app/api/streak/tests/layout.test.ts > Streak API - layout parameter integration tests > should return 200 OK and render full layout when layout parameter is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"a3dbb2bb-3195-4f58-b6b4-d27571e7b10d"} + +stdout | app/api/streak/tests/layout.test.ts > Streak API - layout parameter integration tests > should return 200 OK and render full layout when layout parameter is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":3,"requestId":"a3dbb2bb-3195-4f58-b6b4-d27571e7b10d"} + +stdout | app/api/streak/tests/layout.test.ts > Streak API - layout parameter integration tests > should return 400 Bad Request when layout parameter is invalid +[INFO] Incoming streak request {"source":"streak","requestId":"c424ccca-b625-495f-8e4c-a908581158bc"} + +stdout | app/api/streak/tests/layout.test.ts > Streak API - layout parameter integration tests > should fall back to default layout when layout is empty +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"29359725-0563-4934-aca4-8fb28a2b7ad5"} + +stdout | app/api/streak/tests/layout.test.ts > Streak API - layout parameter integration tests > should fall back to default layout when layout is empty +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"29359725-0563-4934-aca4-8fb28a2b7ad5"} + + ✓ app/api/streak/tests/layout.test.ts (5 tests) 218ms + ✓ hooks/useRecentSearches.test.ts (16 tests) 153ms +stderr | app/layout.empty-fallback.test.tsx > Edge Cases & Empty/Missing Inputs Verification > 1. Render the target module or component with empty arrays or null parameters +In HTML, <html> cannot be a child of <div>. +This will cause a hydration error. + + ✓ app/layout.empty-fallback.test.tsx (5 tests) 163ms +stdout | app/api/streak/tests/weekday.test.ts > GET /api/streak?view=weekday > returns 200 and the standard SVG headers for view=weekday +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"weekday","requestId":"190f37ee-99a2-4c66-804b-53967333fdde"} + +stdout | app/api/streak/tests/weekday.test.ts > GET /api/streak?view=weekday > returns 200 and the standard SVG headers for view=weekday +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"weekday","format":"svg","status":200,"durationMs":82,"requestId":"190f37ee-99a2-4c66-804b-53967333fdde"} + +stdout | app/api/streak/tests/weekday.test.ts > GET /api/streak?view=weekday > renders all seven weekday labels +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"weekday","requestId":"829944ab-5789-464f-92f5-882f0a40b0de"} + +stdout | app/api/streak/tests/weekday.test.ts > GET /api/streak?view=weekday > renders all seven weekday labels +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"weekday","format":"svg","status":200,"durationMs":2,"requestId":"829944ab-5789-464f-92f5-882f0a40b0de"} + + ✓ hooks/useLocalStorage.mouse-interactivity.test.ts (5 tests) 473ms +stdout | app/api/streak/tests/weekday.test.ts > GET /api/streak?view=weekday > shows the total contributions count as a subtitle +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"weekday","requestId":"3e5c5333-0ad4-4d12-84a0-a4dcc69068bf"} + +stdout | app/api/streak/tests/weekday.test.ts > GET /api/streak?view=weekday > shows the total contributions count as a subtitle +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"weekday","format":"svg","status":200,"durationMs":5,"requestId":"3e5c5333-0ad4-4d12-84a0-a4dcc69068bf"} + +stdout | app/api/streak/tests/weekday.test.ts > GET /api/streak?view=weekday > exposes stable caching headers on the weekday SVG response +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"weekday","requestId":"6382323f-5e7f-47ca-8cf9-7cfcff08a065"} + +stdout | app/api/streak/tests/weekday.test.ts > GET /api/streak?view=weekday > exposes stable caching headers on the weekday SVG response +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"weekday","format":"svg","status":200,"durationMs":5,"requestId":"6382323f-5e7f-47ca-8cf9-7cfcff08a065"} + +stdout | app/api/streak/tests/weekday.test.ts > GET /api/streak?view=weekday > respects the tz parameter without crashing +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"weekday","requestId":"14a188df-febf-49a5-a4cb-613e9e2ef0aa"} +[INFO] Streak request completed {"source":"streak","requestId":"14a188df-febf-49a5-a4cb-613e9e2ef0aa"} + +stdout | app/api/streak/tests/weekday.test.ts > GET /api/streak?view=weekday > respects the tz parameter without crashing +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"weekday","format":"svg","status":200,"durationMs":23} + + ✓ app/api/streak/tests/weekday.test.ts (6 tests) 582ms + ✓ app/generator/components/ReadmeInsight.test.tsx (4 tests) 486ms + ✓ renders title and correct default tip when state is completely empty 367ms +stderr | components/DiscordButton.theme-contrast.test.tsx > DiscordButton - Dark and Light Theme Contrast > renders correctly in dark mode +React does not recognize the `whileTap` prop on a DOM element. If you intentionally want it to appear in the DOM as a custom attribute, spell it as lowercase `whiletap` instead. If you accidentally passed it from a parent component, remove it from the DOM element. + + ✓ components/DiscordButton.theme-contrast.test.tsx (5 tests) 539ms + ✓ renders correctly in dark mode 333ms + ✓ hooks/useDebounce.type-compiler.test.ts (5 tests) 239ms + ✓ models/Notification.theme-contrast.test.ts (5 tests) 486ms + ✓ utils/urls.theme-contrast.test.ts (5 tests) 325ms + ✓ app/template.empty-fallback.test.tsx (10 tests) 624ms + ✓ app/components/Icons.test.tsx (6 tests) 559ms + ✓ renders all 5 icons as valid SVG elements without crashing 449ms +stderr | app/api/stats/route.mouse-interactivity.test.ts > ApiStatsRoute Tests > returns 400 Bad Request when required user parameter is missing or invalid +{"timestamp":"2026-07-23T03:06:32.417Z","type":"SECURITY_EVENT","event":"UNTRUSTED_FORWARDED_HEADER_IGNORED","resolvedIp":"unknown","header":"x-forwarded-for"} + +stderr | app/api/stats/route.mouse-interactivity.test.ts > ApiStatsRoute Tests > returns 429 when refresh is requested and quota monitor is low +{"timestamp":"2026-07-23T03:06:32.545Z","type":"SECURITY_EVENT","event":"LOW_QUOTA_STATS_REFRESH_BLOCKED","user":"octocat","ip":"127.0.0.1","remainingQuota":5000} + +stderr | app/api/stats/route.mouse-interactivity.test.ts > ApiStatsRoute Tests > returns 429 when refresh is requested and rate limit check fails +{"timestamp":"2026-07-23T03:06:32.554Z","type":"SECURITY_EVENT","event":"STATS_REFRESH_RATE_LIMIT_EXCEEDED","user":"octocat","ip":"127.0.0.1","limit":10} + +stderr | app/api/stats/route.mouse-interactivity.test.ts > ApiStatsRoute Tests > serves cached data and returns Cooldown-Served-Cached header if refresh is requested during cooldown window +{"timestamp":"2026-07-23T03:06:32.569Z","type":"SECURITY_EVENT","event":"STATS_REFRESH_COOLDOWN_VIOLATION","user":"octocat","ip":"127.0.0.1","remainingMs":0} + + ✓ app/api/stats/route.mouse-interactivity.test.ts (6 tests) 277ms +stderr | components/dashboard/Achievements.type-compiler.test.tsx > Achievements - TypeScript Compiler Validation & Schema Constraints Stability > Validate Achievement type fields are correctly typed: renders component without TypeScript schema violations +React does not recognize the `whileInView` prop on a DOM element. If you intentionally want it to appear in the DOM as a custom attribute, spell it as lowercase `whileinview` instead. If you accidentally passed it from a parent component, remove it from the DOM element. + + ✓ components/dashboard/Achievements.type-compiler.test.tsx (5 tests) 789ms + ✓ Validate Achievement type fields are correctly typed: renders component without TypeScript schema violations 475ms + ✓ components/dashboard/ResumeProfileSection.empty-fallback.test.tsx (5 tests) 376ms + ✓ components/dashboard/PRInsights/RepoPerformanceTable.empty-fallback.test.tsx (5 tests) 484ms +stderr | components/dashboard/AIInsights.empty-fallback.test.tsx > AIInsights > renders with an empty insights array +React does not recognize the `whileInView` prop on a DOM element. If you intentionally want it to appear in the DOM as a custom attribute, spell it as lowercase `whileinview` instead. If you accidentally passed it from a parent component, remove it from the DOM element. + + ✓ components/dashboard/AIInsights.empty-fallback.test.tsx (5 tests) 415ms + ✓ lib/export3d.responsive-breakpoints.test.ts (5 tests) 175ms + ✓ hooks/useLocalStorage.mock-integrations.test.ts (5 tests) 98ms +stderr | app/contributors/page.mouse-interactivity.test.tsx > ContributorsPage Mouse Interactivity > renders successfully when contributor retrieval falls back to an empty state +[ERROR] Failed to fetch contributors {"error":{}} + +stdout | app/api/streak/route.timezone-boundaries.test.ts > ApiStreakRoute Timezone Normalization & Calendar Boundary Alignment > accepts UTC timezone and returns a valid SVG +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"34c27fb6-d598-4b35-b896-cfd4e6c867bf"} +[INFO] Streak request completed {"source":"streak","requestId":"34c27fb6-d598-4b35-b896-cfd4e6c867bf"} + +stdout | app/api/streak/route.timezone-boundaries.test.ts > ApiStreakRoute Timezone Normalization & Calendar Boundary Alignment > accepts UTC timezone and returns a valid SVG +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":96} + + ✓ app/contributors/page.mouse-interactivity.test.tsx (5 tests) 413ms +stdout | app/api/streak/route.timezone-boundaries.test.ts > ApiStreakRoute Timezone Normalization & Calendar Boundary Alignment > accepts Asia/Kolkata timezone and uses timezone-aware cache calculation +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"589db156-7917-47ae-8d41-8063c6dc610f"} +[INFO] Streak request completed {"source":"streak","requestId":"589db156-7917-47ae-8d41-8063c6dc610f"} + +stdout | app/api/streak/route.timezone-boundaries.test.ts > ApiStreakRoute Timezone Normalization & Calendar Boundary Alignment > accepts Asia/Kolkata timezone and uses timezone-aware cache calculation +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":21} + +stdout | app/api/streak/route.timezone-boundaries.test.ts > ApiStreakRoute Timezone Normalization & Calendar Boundary Alignment > returns 400 for an invalid timezone and skips GitHub fetching +[INFO] Incoming streak request {"source":"streak","requestId":"4f05e41b-08f9-4e31-a75b-f6d0fde8d753"} + + ✓ app/components/Icons.mouse-interactivity.test.tsx (5 tests) 198ms +stdout | app/api/streak/route.timezone-boundaries.test.ts > ApiStreakRoute Timezone Normalization & Calendar Boundary Alignment > uses timezone cache duration in JSON responses +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"a1f2c02e-00f6-4165-95ad-62a0a70fc962"} +[INFO] Streak request completed {"source":"streak","requestId":"a1f2c02e-00f6-4165-95ad-62a0a70fc962"} + +stdout | app/api/streak/route.timezone-boundaries.test.ts > ApiStreakRoute Timezone Normalization & Calendar Boundary Alignment > uses timezone cache duration in JSON responses +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"json","status":200,"durationMs":7} + +stdout | app/api/streak/route.timezone-boundaries.test.ts > ApiStreakRoute Timezone Normalization & Calendar Boundary Alignment > preserves leap-year boundary dates across timezone-aware JSON responses +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"d576a6c2-d391-40d6-bb9c-a7b61b2e4784"} +[INFO] Streak request completed {"source":"streak","requestId":"d576a6c2-d391-40d6-bb9c-a7b61b2e4784"} + +stdout | app/api/streak/route.timezone-boundaries.test.ts > ApiStreakRoute Timezone Normalization & Calendar Boundary Alignment > preserves leap-year boundary dates across timezone-aware JSON responses +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"json","status":200,"durationMs":2} + + ✓ app/api/streak/route.timezone-boundaries.test.ts (5 tests) 351ms + ✓ lib/export3d.error-resilience.test.tsx (5 tests) 299ms + ✓ app/compare/page.error-resilience.test.tsx (5 tests) 150ms + ✓ components/dashboard/AIInsightsSkeleton.empty-fallback.test.tsx (5 tests) 141ms + ✓ hooks/useRecentSearches.error-resilience.test.ts (5 tests) 146ms + ✓ lib/export3d.empty-fallback.test.ts (7 tests) 93ms + ✓ context/TranslationContext.test.tsx (2 tests) 242ms + ✓ components/commitpulse-logo.test.tsx (5 tests) 120ms + ✓ app/api/stats/route.timezone-boundaries.test.ts (6 tests) 83ms + ✓ app/api/wrapped/tests/statsCalculation.test.ts (5 tests) 84ms + ✓ app/api/compare/route.timezone-boundaries.test.ts (6 tests) 107ms + ✓ lib/calculate.mouse-interactivity.test.ts (5 tests) 271ms + ✓ app/customize/components/SectionLabel.test.tsx (5 tests) 117ms + ✓ app/template.mock-integrations.test.tsx (5 tests) 103ms + ✓ hooks/useLocalStorage.timezone-boundaries.test.ts (5 tests) 377ms + ✓ lib/svg/components/VersusPanel.test.tsx (4 tests) 195ms + ✓ hooks/useShareActions.empty-fallback.test.ts (5 tests) 179ms + ✓ lib/calculate.empty-calendar-v3.test.ts (5 tests) 68ms + ✓ app/customize/config-io.test.ts (37 tests) 204ms + ✓ hooks/useLocalStorage.test.ts (6 tests) 144ms + ✓ components/dashboard/AIInsightsSkeleton.mock-integrations.test.tsx (5 tests) 308ms + ✓ utils/time.test.ts (39 tests) 167ms + ✓ app/customize/components/SectionLabel.responsive-breakpoints.test.tsx (5 tests) 122ms + ✓ hooks/useGlowEffect.timezone-boundaries.test.ts (5 tests) 125ms + ✓ hooks/useGlowEffect.empty-fallback.test.ts (6 tests) 116ms + ✓ hooks/useDebounce.theme-contrast.test.ts (5 tests) 151ms + ✓ components/dashboard/AchievementsSkeleton.responsive-breakpoints.test.tsx (5 tests) 201ms + ✓ components/commitpulse-logo.responsive-breakpoints.test.tsx (5 tests) 180ms + ✓ components/dashboard/AchievementsSkeleton.empty-fallback.test.tsx (5 tests) 120ms + ✓ app/template.timezone-boundaries.test.tsx (5 tests) 128ms + ✓ lib/calculate.unsorted-calendar.test.ts (5 tests) 62ms + ✓ hooks/useDebounce.timezone-boundaries.test.ts (5 tests) 100ms + ✓ components/dashboard/AchievementsSkeleton.accessibility.test.tsx (5 tests) 158ms + ✓ lib/calculate.dst-boundary.test.ts (5 tests) 125ms +stderr | lib/cache.test.ts > DistributedCache > fails closed on incr() when Redis errors, instead of using an unsynced local counter +[ERROR] Cache INCR failed — failing closed to avoid bypassing distributed rate limits {"component":"DistributedCache","key":"[REDACTED]","error":{}} + +stderr | lib/cache.test.ts > DistributedCache > fails closed on incr() when Redis errors, instead of using an unsynced local counter +[ERROR] Cache INCR failed — failing closed to avoid bypassing distributed rate limits {"component":"DistributedCache","key":"[REDACTED]","error":{}} + +stderr | lib/cache.mock-integrations.test.ts > Asynchronous Service Layer Mocking & Local Cache Stubs > 1. Mock standard asynchronous imports and databases using stubs +[ERROR] Cache GET failed {"component":"DistributedCache","key":"[REDACTED]","error":{}} + +stderr | lib/cache.mock-integrations.test.ts > Asynchronous Service Layer Mocking & Local Cache Stubs > 1. Mock standard asynchronous imports and databases using stubs +[ERROR] Cache lock failed {"component":"DistributedCache","key":"[REDACTED]","error":{}} + +stderr | lib/cache.mock-integrations.test.ts > Asynchronous Service Layer Mocking & Local Cache Stubs > 1. Mock standard asynchronous imports and databases using stubs +[ERROR] Cache SET failed {"component":"DistributedCache","key":"[REDACTED]","error":{}} + +stderr | lib/cache.test.ts > DistributedCache > localLocks memory leak prevention > Behavior 3: Safety Eviction (Fixes #6177) +[ERROR] Safety eviction triggered for hanging lock {"component":"DistributedCache","key":"[REDACTED]"} + + ✓ lib/cache.test.ts (72 tests) 320ms +stderr | lib/cache.mock-integrations.test.ts > Asynchronous Service Layer Mocking & Local Cache Stubs > 2. Test service loading paths to ensure pending state overlays render +[ERROR] Cache GET failed {"component":"DistributedCache","key":"[REDACTED]","error":{}} + +stderr | lib/cache.mock-integrations.test.ts > Asynchronous Service Layer Mocking & Local Cache Stubs > 2. Test service loading paths to ensure pending state overlays render +[ERROR] Cache lock failed {"component":"DistributedCache","key":"[REDACTED]","error":{}} + + ✓ app/api/compare/route.error-resilience.test.ts (5 tests) 69ms +stderr | lib/cache.mock-integrations.test.ts > Asynchronous Service Layer Mocking & Local Cache Stubs > 2. Test service loading paths to ensure pending state overlays render +[ERROR] Cache SET failed {"component":"DistributedCache","key":"[REDACTED]","error":{}} + +stderr | lib/cache.mock-integrations.test.ts > Asynchronous Service Layer Mocking & Local Cache Stubs > 3. Assert local cache layers are queried before triggering database retrievals +[ERROR] Cache GET failed {"component":"DistributedCache","key":"[REDACTED]","error":{}} + +stderr | lib/cache.mock-integrations.test.ts > Asynchronous Service Layer Mocking & Local Cache Stubs > 3. Assert local cache layers are queried before triggering database retrievals +[ERROR] Cache lock failed {"component":"DistributedCache","key":"[REDACTED]","error":{}} + +stderr | lib/cache.mock-integrations.test.ts > Asynchronous Service Layer Mocking & Local Cache Stubs > 3. Assert local cache layers are queried before triggering database retrievals +[ERROR] Cache SET failed {"component":"DistributedCache","key":"[REDACTED]","error":{}} + +stderr | lib/cache.mock-integrations.test.ts > Asynchronous Service Layer Mocking & Local Cache Stubs > 4. Verify correct fallback procedures during fake endpoint timeout blocks +[ERROR] Cache GET failed {"component":"DistributedCache","key":"[REDACTED]","error":{}} + +stderr | lib/cache.mock-integrations.test.ts > Asynchronous Service Layer Mocking & Local Cache Stubs > 4. Verify correct fallback procedures during fake endpoint timeout blocks +[ERROR] Cache lock failed {"component":"DistributedCache","key":"[REDACTED]","error":{}} + +stderr | lib/cache.mock-integrations.test.ts > Asynchronous Service Layer Mocking & Local Cache Stubs > 4. Verify correct fallback procedures during fake endpoint timeout blocks +[ERROR] Cache SET failed {"component":"DistributedCache","key":"[REDACTED]","error":{}} + +stderr | lib/cache.mock-integrations.test.ts > Asynchronous Service Layer Mocking & Local Cache Stubs > 5. Assert complete cache sync is written on success callbacks +[ERROR] Cache GET failed {"component":"DistributedCache","key":"[REDACTED]","error":{}} + +stderr | lib/cache.mock-integrations.test.ts > Asynchronous Service Layer Mocking & Local Cache Stubs > 5. Assert complete cache sync is written on success callbacks +[ERROR] Cache lock failed {"component":"DistributedCache","key":"[REDACTED]","error":{}} + +stderr | lib/cache.mock-integrations.test.ts > Asynchronous Service Layer Mocking & Local Cache Stubs > 5. Assert complete cache sync is written on success callbacks +[ERROR] Cache SET failed {"component":"DistributedCache","key":"[REDACTED]","error":{}} + + ✓ lib/cache.mock-integrations.test.ts (5 tests) 102ms + ✓ app/components/Icons.mock-integrations.test.tsx (5 tests) 186ms + ✓ app/api/streak/animated/route.test.ts (9 tests) 110ms +stderr | lib/rate-limit.test.ts > rateLimit > Redis/KV integration > falls back to memory if fetch fails (non-ok response) +Rate limit KV error, falling back to memory + +stderr | lib/rate-limit.test.ts > rateLimit > Redis/KV integration > falls back to memory if fetch fails (non-ok response) +Rate limit KV error, falling back to memory + +stderr | lib/rate-limit.test.ts > rateLimit > Redis/KV integration > falls back to memory if fetch fails (non-ok response) +Rate limit KV error, falling back to memory + +stderr | lib/rate-limit.test.ts > rateLimit > Redis/KV integration > falls back to memory if fetch throws a network error +Rate limit KV error, falling back to memory + +stderr | lib/rate-limit.test.ts > rateLimit > Redis/KV integration > falls back to memory if fetch throws a network error +Rate limit KV error, falling back to memory + +stderr | lib/rate-limit.test.ts > rateLimit > Redis/KV integration > falls back to memory if fetch throws a network error +Rate limit KV error, falling back to memory + + ✓ lib/rate-limit.test.ts (30 tests) 227ms + ✓ components/dashboard/PopularPinnnedRepos.timezone-boundaries.test.tsx (5 tests) 130ms + ✓ app/compare/page.empty-fallback.test.tsx (5 tests) 126ms + ✓ app/(root)/dashboard/layout.error-resilience.test.tsx (2 tests) 239ms + ✓ app/api/wakatime/route.test.ts (3 tests) 58ms + ✓ hooks/useRecentSearches.theme-contrast.test.ts (5 tests) 77ms + ✓ hooks/useDebounce.test.ts (7 tests) 124ms + ✓ app/template.test.tsx (5 tests) 128ms + ✓ app/customize/components/SectionLabel.empty-fallback.test.tsx (5 tests) 127ms + ✓ app/components/Icons.empty-fallback.test.tsx (5 tests) 159ms + ✓ lib/graph/types.accessibility.test.ts (5 tests) 88ms + ✓ app/customize/components/SectionLabel.theme-contrast.test.tsx (5 tests) 161ms +stdout | app/api/github/route.test.ts > Unrestricted Cache Bypass & Abuse Mitigation (Issue #1978) > Scenario 1: serves cached data and checks SWR background refresh +[BackgroundRefresh] Queuing background refresh for: torvalds + +stdout | app/api/github/route.test.ts > Unrestricted Cache Bypass & Abuse Mitigation (Issue #1978) > Scenario 1: serves cached data and checks SWR background refresh +[BackgroundRefresh] Successfully completed background refresh for: torvalds + +stderr | app/api/github/route.test.ts > Unrestricted Cache Bypass & Abuse Mitigation (Issue #1978) > Scenario 3: serves cached response for repeated refresh requests within cooldown +[WARN] Security event {"type":"SECURITY_EVENT","event":"REFRESH_COOLDOWN_VIOLATION","username":"torvalds","ip":"127.0.0.1","remainingMs":29997} + +stderr | app/api/github/route.test.ts > Unrestricted Cache Bypass & Abuse Mitigation (Issue #1978) > Scenario 4: returns 429 when client refresh rate limit is exceeded +{"timestamp":"2026-07-23T03:07:03.950Z","type":"SECURITY_EVENT","event":"UNTRUSTED_FORWARDED_HEADER_IGNORED","resolvedIp":"unknown","header":"x-real-ip"} + +stderr | app/api/github/route.test.ts > Unrestricted Cache Bypass & Abuse Mitigation (Issue #1978) > Scenario 4: returns 429 when client refresh rate limit is exceeded +[WARN] Security event {"type":"SECURITY_EVENT","event":"REFRESH_RATE_LIMIT_EXCEEDED","username":"torvalds","ip":"127.0.0.1","limit":2} + +stderr | app/api/github/route.test.ts > Unrestricted Cache Bypass & Abuse Mitigation (Issue #1978) > Scenario 5: blocks manual refresh when remaining GitHub quota is low (<10%) +[WARN] Security event {"type":"SECURITY_EVENT","event":"LOW_QUOTA_REFRESH_BLOCKED","username":"torvalds","ip":"127.0.0.1","remainingQuota":400} + +stdout | app/api/github/route.test.ts > Unrestricted Cache Bypass & Abuse Mitigation (Issue #1978) > Scenario 6: asynchronous background refresh completes successfully +[BackgroundRefresh] Queuing background refresh for: torvalds + +stdout | app/api/github/route.test.ts > Unrestricted Cache Bypass & Abuse Mitigation (Issue #1978) > Scenario 6: asynchronous background refresh completes successfully +[BackgroundRefresh] Successfully completed background refresh for: torvalds + + ✓ app/api/github/route.test.ts (14 tests) 148ms + ✓ app/components/Icons.accessibility.test.tsx (6 tests) 218ms + ✓ app/api/og/route.mock-integrations.test.tsx (5 tests) 46ms + ✓ hooks/useLocalStorage.empty-fallback.test.ts (5 tests) 58ms + ✓ hooks/useLocalStorage.error-resilience.test.ts (5 tests) 168ms + ✓ components/dashboard/DeveloperCollaborationIntelligenceHub.test.tsx (1 test) 225ms + ✓ services/github/quota-monitor.mouse-interactivity.test.ts (7 tests) 66ms + ✓ lib/github.contributed-repos-pagination.test.ts (2 tests) 84ms +(node:47091) [MONGOOSE] Warning: Mongoose: `Document.prototype.validateSync()` is deprecated and will be removed in Mongoose 10. Use `Document.prototype.validate()` instead. +(Use `node-22 --trace-warnings ...` to show where the warning was created) +(node:47091) [MONGOOSE] Warning: Mongoose: `Document.prototype.validateSync()` is deprecated and will be removed in Mongoose 10. Use `Document.prototype.validate()` instead. + ✓ models/Notification.error-resilience.test.ts (5 tests) 92ms + ✓ app/generator/types.mock-integrations.test.ts (5 tests) 126ms + ✓ app/components/heroTitle.test.tsx (4 tests) 137ms + ✓ app/components/Icons.theme-contrast.test.tsx (5 tests) 254ms +stderr | lib/calculate.error-resilience.test.ts > calculate-error-resilience > should gracefully fallback to UTC when Intl.DateTimeFormat throws in convertLocalToUtc +[vitest] The DateTimeFormat mock did not use 'function' or 'class' in its implementation, see https://vitest.dev/api/vi#vi-spyon for examples. + +stderr | lib/calculate.error-resilience.test.ts > calculate-error-resilience > should fallback safely when Intl formatter crashes inside getLocalTodayStr +[vitest] The DateTimeFormat mock did not use 'function' or 'class' in its implementation, see https://vitest.dev/api/vi#vi-spyon for examples. +[vitest] The DateTimeFormat mock did not use 'function' or 'class' in its implementation, see https://vitest.dev/api/vi#vi-spyon for examples. +[vitest] The DateTimeFormat mock did not use 'function' or 'class' in its implementation, see https://vitest.dev/api/vi#vi-spyon for examples. +[vitest] The DateTimeFormat mock did not use 'function' or 'class' in its implementation, see https://vitest.dev/api/vi#vi-spyon for examples. + + ✓ lib/calculate.error-resilience.test.ts (5 tests) 58ms + ✓ components/dashboard/heatmapUtils.responsive-breakpoints.test.ts (5 tests) 124ms +stderr | app/api/stats/route.validation.test.ts > GET /api/stats additional runtime coverage > treats bypassCache=true as a refresh request +{"timestamp":"2026-07-23T03:07:10.540Z","type":"SECURITY_EVENT","event":"UNTRUSTED_FORWARDED_HEADER_IGNORED","resolvedIp":"unknown","header":"x-forwarded-for"} + +stderr | app/api/stats/route.validation.test.ts > GET /api/stats additional runtime coverage > records refresh requests through bypassCache=true +{"timestamp":"2026-07-23T03:07:10.622Z","type":"SECURITY_EVENT","event":"STATS_REFRESH_COOLDOWN_VIOLATION","user":"octocat","ip":"127.0.0.1","remainingMs":29996} + + ✓ app/api/stats/route.validation.test.ts (5 tests) 100ms + ✓ lib/svg/radar.nightOwl.test.ts (4 tests) 122ms + ✓ services/github/refresh-policy.mock-integrations.test.ts (5 tests) 83ms + ✓ models/StudentProfile.mock-integrations.test.ts (5 tests) 70ms + ✓ components/dashboard/ResumePreviewForm.timezone-boundaries.test.tsx (5 tests) 98ms + ✓ app/contributors/loading.responsive-breakpoints.test.tsx (3 tests) 117ms + ✓ lib/calculate.multiyear-scaling.test.ts (5 tests) 149ms + ✓ hooks/useShareActions.timezone-boundaries.test.ts (5 tests) 99ms + ✓ app/api/compare/route.responsive-breakpoints.test.ts (5 tests) 158ms + ✓ app/(root)/dashboard/loading.mouse-interactivity.test.tsx (5 tests) 133ms +(node:47313) [MONGOOSE] Warning: Mongoose: `Document.prototype.validateSync()` is deprecated and will be removed in Mongoose 10. Use `Document.prototype.validate()` instead. +(Use `node-22 --trace-warnings ...` to show where the warning was created) +(node:47313) [MONGOOSE] Warning: Mongoose: `Document.prototype.validateSync()` is deprecated and will be removed in Mongoose 10. Use `Document.prototype.validate()` instead. +(node:47313) [MONGOOSE] Warning: Mongoose: `Document.prototype.validateSync()` is deprecated and will be removed in Mongoose 10. Use `Document.prototype.validate()` instead. +(node:47313) [MONGOOSE] Warning: Mongoose: `Document.prototype.validateSync()` is deprecated and will be removed in Mongoose 10. Use `Document.prototype.validate()` instead. + ✓ models/StudentProfile.type-compiler.test.ts (5 tests) 43ms + ✓ app/components/ScrollRestoration.theme-contrast.test.tsx (5 tests) 88ms + ✓ app/api/student/resume/upload/route.timezone-boundaries.test.ts (5 tests) 246ms +stderr | lib/resume-parser.error-resilience.test.ts > resume-parser-error-resilience > should handle buffer toString failures gracefully (exception safety) +Failed to parse PDF using pdf-parse, falling back to UTF-8 decoding: Error: Buffer conversion failed + at Buffer.<anonymous> (/home/atulupadhyay/Contribution/commitpulse/lib/resume-parser.error-resilience.test.ts:43:13) + at Buffer.toString (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/spy/dist/index.js:332:34) + at extractTextFromBuffer (/home/atulupadhyay/Contribution/commitpulse/lib/resume-parser.ts:140:18) + at parseResume (/home/atulupadhyay/Contribution/commitpulse/lib/resume-parser.ts:205:25) + at /home/atulupadhyay/Contribution/commitpulse/lib/resume-parser.error-resilience.test.ts:46:18 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:302:11 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:1903:26 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2326:20 + at new Promise (<anonymous>) + at runWithCancel (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2323:10) + + ✓ lib/resume-parser.error-resilience.test.ts (7 tests) 118ms +stdout | app/api/wrapped/route.mock-integrations.test.ts > GET /api/wrapped validation > Test Case 1: refresh=true checks rate limiter and bypasses cache +recordRefresh executed + + ✓ hooks/useDebounce.boundary-robustness.test.ts (5 tests) 100ms +stdout | app/api/wrapped/route.mock-integrations.test.ts > GET /api/wrapped validation > Test Case 5: successful refresh records cache update +recordRefresh executed + + ✓ app/api/wrapped/route.mock-integrations.test.ts (5 tests) 51ms + ✓ app/contributors/page.top-contributors.test.tsx (1 test) 95ms + ✓ app/generator/components/PreviewPanel.security.test.tsx (3 tests) 91ms + ✓ app/api/compare/route.theme-contrast.test.ts (5 tests) 72ms +stderr | app/api/track-user/route.error-resilience.test.ts > app/api/track-user/route - error resilience > returns a structured fallback when the database operation times out +Database operation failed or timed out. Bypassing user tracking: Error: Database operation timed out + at /home/atulupadhyay/Contribution/commitpulse/app/api/track-user/route.ts:137:41 + at callTimer (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/vitest/dist/chunks/test.DNmyFkvJ.js:1773:25) + at doTickInner (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/vitest/dist/chunks/test.DNmyFkvJ.js:2444:30) + at doTick (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/vitest/dist/chunks/test.DNmyFkvJ.js:2525:21) + at Immediate.<anonymous> (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/vitest/dist/chunks/test.DNmyFkvJ.js:2546:34) + at processImmediate (node:internal/timers:484:21) + +stderr | app/api/track-user/route.error-resilience.test.ts > app/api/track-user/route - error resilience > survives a mid-stream database write failure without hard-crashing the endpoint +Database operation failed or timed out. Bypassing user tracking: Error: write interruption + at /home/atulupadhyay/Contribution/commitpulse/app/api/track-user/route.error-resilience.test.ts:161:53 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:302:11 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:1903:26 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2326:20 + at new Promise (<anonymous>) + at runWithCancel (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2323:10) + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2305:20 + at new Promise (<anonymous>) + at runWithTimeout (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2272:10) + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2955:64 + + ✓ app/api/track-user/route.error-resilience.test.ts (5 tests) 70ms + ✓ app/contributors/page.pagination.test.tsx (2 tests) 91ms +stdout | app/api/wrapped/route.timezone-boundaries.test.ts > Timezone normalization & calendar boundary alignment > passes bypassCache=true when refresh=true is provided +recordRefresh executed + + ✓ app/api/wrapped/route.timezone-boundaries.test.ts (5 tests) 104ms + ✓ app/(root)/dashboard/loading.test.tsx (3 tests) 68ms + ✓ app/components/ScrollRestoration.mock-integrations.test.tsx (5 tests) 131ms + ✓ components/dashboard/LanguageChart.timezone-boundaries.test.tsx (5 tests) 135ms + ✓ app/api/compare/tests/validation.test.ts (5 tests) 59ms +stdout | services/github/background-refresh.mouse-interactivity.test.ts > BackgroundRefresh - Mouse Interactivity & Click Handling > prevents duplicate refresh triggers from rapid double-click interactions +[BackgroundRefresh] Queuing background refresh for: double-click-user +[BackgroundRefresh] Refresh already active for: double-click-user + +stdout | services/github/background-refresh.mouse-interactivity.test.ts > BackgroundRefresh - Mouse Interactivity & Click Handling > verifies click handlers invoke refresh exactly once +[BackgroundRefresh] Queuing background refresh for: click-user + +stderr | services/github/background-refresh.mouse-interactivity.test.ts > BackgroundRefresh - Mouse Interactivity & Click Handling > verifies click handlers invoke refresh exactly once +[BackgroundRefresh] Background refresh failed for: click-user Error: [GitHub API] Failed to fetch contributions for user "click-user" + at getFullDashboardData (/home/atulupadhyay/Contribution/commitpulse/lib/github.ts:2349:11) + at processTicksAndRejections (node:internal/process/task_queues:103:5) + at /home/atulupadhyay/Contribution/commitpulse/services/github/background-refresh.ts:110:11 { + [cause]: TypeError: res.clone is not a function + at fetchGraphQLWithRetry (/home/atulupadhyay/Contribution/commitpulse/lib/github.ts:474:6) + at processTicksAndRejections (node:internal/process/task_queues:103:5) + at fetchContributionsUncached (/home/atulupadhyay/Contribution/commitpulse/lib/github.ts:1154:15) + at loadWithTimeout (/home/atulupadhyay/Contribution/commitpulse/lib/github.ts:933:14) + at fetchGitHubContributions (/home/atulupadhyay/Contribution/commitpulse/lib/github.ts:1016:22) + at async Promise.allSettled (index 2) + at getFullDashboardData (/home/atulupadhyay/Contribution/commitpulse/lib/github.ts:2333:7) + at /home/atulupadhyay/Contribution/commitpulse/services/github/background-refresh.ts:110:11 +} + +stdout | services/github/background-refresh.mouse-interactivity.test.ts > BackgroundRefresh - Mouse Interactivity & Click Handling > applies pointer cursor state while refresh job is active +[BackgroundRefresh] Queuing background refresh for: hover-user + +stdout | services/github/background-refresh.mouse-interactivity.test.ts > BackgroundRefresh - Mouse Interactivity & Click Handling > hides temporary overlay state after mouseleave refresh completion +[BackgroundRefresh] Queuing background refresh for: mouseleave-user + +stdout | services/github/background-refresh.mouse-interactivity.test.ts > BackgroundRefresh - Mouse Interactivity & Click Handling > hides temporary overlay state after mouseleave refresh completion +[BackgroundRefresh] Successfully completed background refresh for: mouseleave-user + + ✓ services/github/background-refresh.mouse-interactivity.test.ts (5 tests) 77ms + ✓ test-utils/timezone-mock.test.ts (26 tests) 95ms + ✓ app/api/stats/route.mock-integrations.test.ts (5 tests) 151ms + ✓ lib/validations.normalizeTimezone.test.ts (21 tests) 104ms + ✓ app/api/stats/route.empty-fallback.test.ts (5 tests) 148ms + ✓ app/components/ScrollRestoration.responsive-breakpoints.test.tsx (5 tests) 141ms + ✓ app/api/wrapped/yearBoundary.test.ts (5 tests) 86ms + ✓ lib/cache.timezone-boundaries.test.ts (5 tests) 121ms + ✓ app/api/github/route.responsive-breakpoints.test.ts (5 tests) 281ms + ✓ types/network.empty-fallback.test.ts (5 tests) 247ms + ✓ app/api/user-details/route.timezone-boundaries.test.ts (5 tests) 177ms + ✓ hooks/useDebounce.mock-integrations.test.ts (5 tests) 461ms + ✓ app/api/user-details/route.test.ts (8 tests) 231ms + ✓ app/api/github/route.theme-contrast.test.ts (5 tests) 225ms + ✓ hooks/useLocalStorage.responsive-breakpoints.test.ts (5 tests) 365ms + ✓ hooks/useShareActions.responsive-breakpoints.test.ts (5 tests) 936ms + ✓ supports copy link actions correctly on a 375px mobile viewport 374ms + ✓ uses the native mobile share API successfully on a 375px viewport 317ms + ✓ hooks/useRecentSearches.empty-fallback.test.ts (5 tests) 171ms + ✓ app/api/user-details/route.theme-contrast.test.ts (5 tests) 145ms + ✓ components/dashboard/heatmapUtils.timezone-boundaries.test.ts (5 tests) 392ms + ✓ app/api/stats/route.error-resilience.test.ts (5 tests) 92ms + ✓ app/components/ScrollRestoration.error-resilience.test.tsx (5 tests) 110ms + ✓ app/components/ScrollRestoration.mouse-interactivity.test.tsx (5 tests) 134ms + ✓ lib/calculate.empty-fallback.test.ts (21 tests) 68ms + ✓ services/github/refresh-rate-limiter.theme-contrast.test.ts (5 tests) 201ms + ✓ app/components/ScrollRestoration.test.tsx (5 tests) 201ms +Not implemented: HTMLCanvasElement's toDataURL() method: without installing the canvas npm package +Not implemented: HTMLCanvasElement's toDataURL() method: without installing the canvas npm package +Not implemented: HTMLCanvasElement's toDataURL() method: without installing the canvas npm package +Not implemented: HTMLCanvasElement's toDataURL() method: without installing the canvas npm package + ✓ lib/pdf-export.test.ts (4 tests) 99ms + ✓ app/api/achievements/route.empty-fallback.test.ts (10 tests) 87ms + ✓ app/api/compare/route.test.ts (20 tests) 76ms + ✓ models/User.empty-fallback.test.ts (5 tests) 34ms + ✓ services/github/pr-insights.empty-fallback.test.ts (5 tests) 49ms + ✓ services/github/__tests__/org-bot-filtering.test.ts (2 tests) 198ms + ✓ hooks/useGlowEffect.error-resilience.test.ts (5 tests) 302ms + ✓ hooks/useFetchCache.test.ts (6 tests) 276ms + ✓ services/github/validate-user.timezone-boundaries.test.ts (5 tests) 59ms + ✓ app/customize/components/ExportPanel.timezone-boundaries.test.tsx (5 tests) 84ms + ✓ lib/validations.streakParamsSchema.test.ts (24 tests) 130ms + ✓ app/api/streak/png/route.test.ts (3 tests) 78ms + ✓ utils/clipboard.test.ts (4 tests) 146ms + ✓ lib/svg/radar.test.ts (7 tests) 195ms + ✓ services/github/ci-analytics.security.test.ts (1 test) 99ms + ✓ locales/parity.test.ts (34 tests) 126ms + ✓ lib/export3d.mouse-interactivity.test.ts (5 tests) 33ms + ✓ app/api/achievements/route.test.ts (20 tests) 142ms + ✓ lib/cache.mouse-interactivity.test.ts (5 tests) 52ms + ✓ lib/calculate.year-boundary-v4.test.ts (5 tests) 109ms + ✓ services/github/refresh-rate-limiter.timezone-boundaries.test.ts (5 tests) 58ms + ✓ hooks/useGlowEffect.test.ts (4 tests) 67ms + ✓ app/api/compare/route.mouse-interactivity.test.ts (6 tests) 75ms + ✓ app/generator/data/technologies.empty-fallback.test.ts (5 tests) 77ms + ✓ app/api/notify/route.timezone-boundaries.test.ts (5 tests) 135ms + ✓ models/User.connection-state-0-v4.test.ts (5 tests) 71ms + ✓ app/api/student/resume/upload/route.empty-fallback.test.ts (5 tests) 39ms + ✓ utils/dashboardPeriod.theme-contrast.test.ts (5 tests) 190ms + ✓ app/generator/types.theme-contrast.test.ts (5 tests) 49ms +stderr | app/api/pr-insights/route.theme-contrast.test.ts > GET /api/pr-insights > returns 500 with the error message when fetchPRInsights throws an Error +Error fetching PR insights: Error: GitHub API error + at /home/atulupadhyay/Contribution/commitpulse/app/api/pr-insights/route.theme-contrast.test.ts:102:50 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:302:11 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:1903:26 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2326:20 + at new Promise (<anonymous>) + at runWithCancel (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2323:10) + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2305:20 + at new Promise (<anonymous>) + at runWithTimeout (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2272:10) + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2955:64 + +stderr | app/api/pr-insights/route.theme-contrast.test.ts > GET /api/pr-insights > returns 500 with a generic message when fetchPRInsights throws a non-Error value +Error fetching PR insights: unexpected failure + + ✓ app/api/pr-insights/route.theme-contrast.test.ts (7 tests) 186ms + ✓ scripts/benchmark-svg.test.ts (8 tests) 78ms +stderr | app/api/notify/route.delete.test.ts > DELETE /api/notify > bypasses gracefully when MONGODB_URI is not set in development +MONGODB_URI is not set. Bypassing notification deletion for local development. + + ✓ app/api/notify/route.delete.test.ts (4 tests) 69ms + ✓ hooks/useKeyboardShortcuts.test.ts (4 tests) 94ms + ✓ hooks/useGlowEffect.mock-integrations.test.ts (5 tests) 86ms + ✓ lib/svg/generator.buildTowerPaths.test.ts (5 tests) 121ms + ✓ app/api/github/route.timezone-boundaries.test.ts (5 tests) 60ms + ✓ app/components/ScrollRestoration.empty-fallback.test.tsx (5 tests) 63ms + ✓ app/api/compare/route.mock-integrations.test.ts (5 tests) 154ms +stderr | app/api/webhooks/github/route.test.ts > POST /api/webhooks/github > returns 500 when the webhook secret is not configured +[ERROR] Push webhook rejected: GITHUB_WEBHOOK_SECRET is not configured {"route":"/api/webhooks/github"} + +stdout | app/api/webhooks/github/route.test.ts > POST /api/webhooks/github > invalidates the default and current-year contribution cache on push +[INFO] Push webhook invalidated contribution cache {"route":"/api/webhooks/github","username":"octocat","invalidatedKeys":"[REDACTED]"} + + ✓ app/api/webhooks/github/route.test.ts (9 tests) 135ms + ✓ lib/calculate.mock-integrations.test.ts (5 tests) 97ms + ✓ components/dashboard/AIInsightsSkeleton.type-compiler.test.tsx (5 tests) 71ms + ✓ app/components/ScrollRestoration.timezone-boundaries.test.tsx (5 tests) 133ms + ✓ lib/validations.githubParamsSchema.test.ts (7 tests) 33ms + ✓ lib/calculate.timezone-boundaries.test.ts (5 tests) 155ms + ✓ app/api/streak/png/route.type-compiler.test.ts (5 tests) 51ms + ✓ lib/svg/constellation.test.ts (9 tests) 71ms + ✓ services/github/pr-insights.theme-contrast.test.ts (5 tests) 71ms + ✓ components/dashboard/RadarChart.type-compiler.test.tsx (5 tests) 27ms + ✓ hooks/useLocalStorage.theme-contrast.test.ts (5 tests) 51ms + ✓ app/generator/data/socials.timezone-boundaries.test.ts (6 tests) 70ms + ✓ app/api/student/resume/confirm/route.error-resilience.test.ts (5 tests) 64ms + ✓ app/api/compare/route.empty-fallback.test.ts (6 tests) 55ms + ✓ app/generator/data/technologies.type-compiler.test.ts (5 tests) 38ms +stderr | app/api/github/route.mouse-interactivity.test.ts > GET /api/github - Interactive Tooltips, Cursor Hovers & Touch Event Propagation > verifies that responsive tooltip layouts display at computed coordinates mapped through metadata headers +{"timestamp":"2026-07-23T03:08:10.094Z","type":"SECURITY_EVENT","event":"UNTRUSTED_FORWARDED_HEADER_IGNORED","resolvedIp":"unknown","header":"x-real-ip"} + +stderr | app/api/github/route.mouse-interactivity.test.ts > GET /api/github - Interactive Tooltips, Cursor Hovers & Touch Event Propagation > verifies that responsive tooltip layouts display at computed coordinates mapped through metadata headers +[WARN] Security event {"type":"SECURITY_EVENT","event":"REFRESH_RATE_LIMIT_EXCEEDED","username":"torvalds","ip":"127.0.0.1","limit":1} + +stderr | app/api/github/route.mouse-interactivity.test.ts > GET /api/github - Interactive Tooltips, Cursor Hovers & Touch Event Propagation > blocks refresh interactions when quota becomes critically low +[WARN] Security event {"type":"SECURITY_EVENT","event":"LOW_QUOTA_REFRESH_BLOCKED","username":"octocat","ip":"127.0.0.1","remainingQuota":100} + +stderr | app/api/github/route.mouse-interactivity.test.ts > GET /api/github - Interactive Tooltips, Cursor Hovers & Touch Event Propagation > checks that simulated mouseleave cooldown events successfully hide temporary overlay visuals by returning cached data +[WARN] Security event {"type":"SECURITY_EVENT","event":"REFRESH_COOLDOWN_VIOLATION","username":"octocat","ip":"127.0.0.1","remainingMs":29998} + + ✓ app/api/github/route.mouse-interactivity.test.ts (5 tests) 59ms + ✓ lib/resume-parser.binary.test.ts (2 tests) 19ms + ✓ app/api/compare/githubFetch.test.ts (5 tests) 68ms + ✓ lib/svg/themes.test.ts (193 tests) 129ms + ✓ lib/api-contract/extractBadgeParams.test.ts (4 tests) 45ms + ✓ lib/calculate.fractional-tz.test.ts (2 tests) 75ms +stderr | app/api/pr-insights/route.mouse-interactivity.test.ts > pr-insights mouse interactivity contract > uses per-IP rate limiting so different IPs get independent buckets +{"timestamp":"2026-07-23T03:08:11.942Z","type":"SECURITY_EVENT","event":"UNTRUSTED_FORWARDED_HEADER_IGNORED","resolvedIp":"unknown","header":"x-forwarded-for"} + +stderr | app/api/pr-insights/route.mouse-interactivity.test.ts > pr-insights mouse interactivity contract > returns error message from thrown Error +Error fetching PR insights: Error: Service failed + at /home/atulupadhyay/Contribution/commitpulse/app/api/pr-insights/route.mouse-interactivity.test.ts:93:50 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:302:11 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:1903:26 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2326:20 + at new Promise (<anonymous>) + at runWithCancel (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2323:10) + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2305:20 + at new Promise (<anonymous>) + at runWithTimeout (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2272:10) + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2955:64 + +stderr | app/api/pr-insights/route.mouse-interactivity.test.ts > pr-insights mouse interactivity contract > returns fallback error message for unknown thrown values +Error fetching PR insights: unknown + + ✓ app/api/pr-insights/route.mouse-interactivity.test.ts (7 tests) 57ms + ✓ app/contributors/loading.type-compiler.test.tsx (5 tests) 34ms + ✓ lib/svg/generatorConstants.test.ts (27 tests) 74ms + ✓ utils/dashboardPeriod.test.ts (8 tests) 119ms + ✓ app/generator/data/socials.theme-contrast.test.ts (6 tests) 45ms + ✓ lib/calculate.year-boundary.test.ts (5 tests) 57ms + ✓ lib/validations.statsParamsSchema.test.ts (8 tests) 68ms + ✓ services/github/refresh-rate-limiter.mouse-interactivity.test.ts (5 tests) 124ms + ✓ app/contributors/page.type-compiler.test.tsx (5 tests) 117ms + ✓ app/api/pr-insights/route.empty-fallback.test.ts (5 tests) 157ms + ✓ services/security/track-user-protection.timezone-boundaries.test.ts (5 tests) 66ms + ✓ lib/logger.test.ts (5 tests) 38ms + ✓ app/api/spotify/route.test.ts (4 tests) 72ms + ✓ app/api/notify/route.responsive-breakpoints.test.ts (6 tests) 83ms + ✓ app/api/github/route.error-resilience.test.ts (5 tests) 57ms + ✓ app/api/ci-analytics/route.test.ts (4 tests) 57ms + ✓ services/github/refresh-rate-limiter.empty-fallback.test.ts (5 tests) 38ms +stdout | services/github/background-refresh.error-resilience.test.ts > BackgroundRefresh - Error Resilience (Hydration Stability, Exception Safety & Error Fallbacks) > Exception Safety: does not throw or crash when getFullDashboardData rejects with an unexpected runtime exception +[BackgroundRefresh] Queuing background refresh for: crash_user + +stderr | services/github/background-refresh.error-resilience.test.ts > BackgroundRefresh - Error Resilience (Hydration Stability, Exception Safety & Error Fallbacks) > Exception Safety: does not throw or crash when getFullDashboardData rejects with an unexpected runtime exception +[BackgroundRefresh] Background refresh failed for: crash_user Error: Unexpected runtime exception: database connection refused + at /home/atulupadhyay/Contribution/commitpulse/services/github/background-refresh.error-resilience.test.ts:20:7 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:302:11 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:1903:26 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2326:20 + at new Promise (<anonymous>) + at runWithCancel (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2323:10) + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2305:20 + at new Promise (<anonymous>) + at runWithTimeout (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2272:10) + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2955:64 + +stdout | services/github/background-refresh.error-resilience.test.ts > BackgroundRefresh - Error Resilience (Hydration Stability, Exception Safety & Error Fallbacks) > Error Fallback: logs error to dev-telemetry (console.error) when background refresh fails +[BackgroundRefresh] Queuing background refresh for: telemetry_user + +stdout | services/github/background-refresh.error-resilience.test.ts > BackgroundRefresh - Error Resilience (Hydration Stability, Exception Safety & Error Fallbacks) > Hydration Stability: active job set is fully cleared after exception so subsequent refresh attempts are not blocked +[BackgroundRefresh] Queuing background refresh for: hydration_user + +stderr | services/github/background-refresh.error-resilience.test.ts > BackgroundRefresh - Error Resilience (Hydration Stability, Exception Safety & Error Fallbacks) > Hydration Stability: active job set is fully cleared after exception so subsequent refresh attempts are not blocked +[BackgroundRefresh] Background refresh failed for: hydration_user Error: First call fails + at /home/atulupadhyay/Contribution/commitpulse/services/github/background-refresh.error-resilience.test.ts:51:58 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:302:11 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:1903:26 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2326:20 + at new Promise (<anonymous>) + at runWithCancel (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2323:10) + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2305:20 + at new Promise (<anonymous>) + at runWithTimeout (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2272:10) + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2955:64 + +stdout | services/github/background-refresh.error-resilience.test.ts > BackgroundRefresh - Error Resilience (Hydration Stability, Exception Safety & Error Fallbacks) > Hydration Stability: active job set is fully cleared after exception so subsequent refresh attempts are not blocked +[BackgroundRefresh] Queuing background refresh for: hydration_user + +stdout | services/github/background-refresh.error-resilience.test.ts > BackgroundRefresh - Error Resilience (Hydration Stability, Exception Safety & Error Fallbacks) > Hydration Stability: active job set is fully cleared after exception so subsequent refresh attempts are not blocked +[BackgroundRefresh] Successfully completed background refresh for: hydration_user + +stdout | services/github/background-refresh.error-resilience.test.ts > BackgroundRefresh - Error Resilience (Hydration Stability, Exception Safety & Error Fallbacks) > Exception Safety: handles non-Error throws (strings, objects) without crashing +[BackgroundRefresh] Queuing background refresh for: non_error_user + +stderr | app/api/pr-insights/route.mock-integrations.test.ts > GET /api/pr-insights - Asynchronous Service Layer Mocking & Local Cache Stubs > falls back to a 504 timeout response when the upstream endpoint aborts +Error fetching PR insights: Error [AbortError]: The operation was aborted. + at /home/atulupadhyay/Contribution/commitpulse/app/api/pr-insights/route.mock-integrations.test.ts:101:24 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:302:11 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:1903:26 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2326:20 + at new Promise (<anonymous>) + at runWithCancel (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2323:10) + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2305:20 + at new Promise (<anonymous>) + at runWithTimeout (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2272:10) + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2955:64 + +stderr | app/api/pr-insights/route.mock-integrations.test.ts > GET /api/pr-insights - Asynchronous Service Layer Mocking & Local Cache Stubs > propagates a 500 error response when the async service layer throws a non-abort error +Error fetching PR insights: Error: Database retrieval failed + at /home/atulupadhyay/Contribution/commitpulse/app/api/pr-insights/route.mock-integrations.test.ts:135:54 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:302:11 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:1903:26 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2326:20 + at new Promise (<anonymous>) + at runWithCancel (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2323:10) + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2305:20 + at new Promise (<anonymous>) + at runWithTimeout (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2272:10) + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2955:64 + +stdout | services/github/background-refresh.error-resilience.test.ts > BackgroundRefresh - Error Resilience (Hydration Stability, Exception Safety & Error Fallbacks) > Error Fallback: reset() provides a clean recovery path clearing all active jobs including stuck ones +[BackgroundRefresh] Queuing background refresh for: stuck_user_1 +[BackgroundRefresh] Queuing background refresh for: stuck_user_2 + + ✓ app/api/pr-insights/route.mock-integrations.test.ts (5 tests) 53ms + ✓ services/github/background-refresh.error-resilience.test.ts (5 tests) 76ms + ✓ components/dashboard/PRInsights/PRTrendChart.mock-integrations.test.tsx (5 tests) 65ms + ✓ tests/claim-handler.test.ts (7 tests) 91ms + ✓ app/api/notify/route.error-resilience.test.ts (5 tests) 85ms +(node:49130) [MONGOOSE] Warning: Mongoose: `Document.prototype.validateSync()` is deprecated and will be removed in Mongoose 10. Use `Document.prototype.validate()` instead. +(Use `node-22 --trace-warnings ...` to show where the warning was created) +(node:49130) [MONGOOSE] Warning: Mongoose: `Document.prototype.validateSync()` is deprecated and will be removed in Mongoose 10. Use `Document.prototype.validate()` instead. +(node:49130) [MONGOOSE] Warning: Mongoose: `Document.prototype.validateSync()` is deprecated and will be removed in Mongoose 10. Use `Document.prototype.validate()` instead. +(node:49130) [MONGOOSE] Warning: Mongoose: `Document.prototype.validateSync()` is deprecated and will be removed in Mongoose 10. Use `Document.prototype.validate()` instead. + ✓ models/Notification.test.ts (12 tests) 67ms + ✓ app/customize/types.timezone-boundaries.test.ts (5 tests) 45ms +stderr | utils/tracking.test.ts > trackUser > handles non-serializable input gracefully without throwing +Failed to format tracking payload TypeError: Converting circular structure to JSON + at JSON.<anonymous> (/home/atulupadhyay/Contribution/commitpulse/utils/tracking.test.ts:149:13) + at JSON.stringify (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/spy/dist/index.js:332:34) + at trackUser (/home/atulupadhyay/Contribution/commitpulse/utils/tracking.ts:33:20) + at /home/atulupadhyay/Contribution/commitpulse/utils/tracking.test.ts:152:18 + at Proxy.assertThrows (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/chai/index.js:2798:5) + at Proxy.methodWrapper (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/chai/index.js:1700:25) + at Proxy.<anonymous> (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/expect/dist/index.js:1216:12) + at Proxy.overwritingMethodWrapper (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/chai/index.js:1750:33) + at Proxy.<anonymous> (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/expect/dist/index.js:1552:16) + at Proxy.<anonymous> (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/expect/dist/index.js:1156:15) + + ✓ utils/tracking.test.ts (12 tests) 58ms + ✓ lib/mongodb.empty-fallback.test.ts (6 tests) 19ms + ✓ utils/time.theme-contrast.test.ts (5 tests) 71ms + ✓ utils/color.test.ts (36 tests) 90ms + ✓ app/api/wrapped/route.empty-fallback.test.ts (5 tests) 146ms + ✓ app/api/achievements/route.accessibility.test.ts (6 tests) 211ms + ✓ lib/github.theme-contrast.test.ts (5 tests) 76ms + ✓ app/api/streak/png/route.theme-contrast.test.ts (5 tests) 94ms + ✓ app/api/team-attribution/route.test.ts (6 tests) 81ms + ✓ lib/github.empty-fallback.test.ts (5 tests) 99ms + ✓ lib/export3d.test.ts (12 tests) 134ms + ✓ app/components/ScrollRestoration.type-compiler.test.tsx (5 tests) 71ms + ✓ app/api/pr-insights/route.timezone-boundaries.test.ts (5 tests) 63ms + ✓ lib/svg/themes/nord_light.test.ts (5 tests) 69ms + ✓ lib/i18n/badgeLabels.test.ts (30 tests) 139ms + ✓ components/dashboard/tooltipUtils.accessibility.test.ts (5 tests) 70ms + ✓ app/api/wrapped/tests/validation.test.ts (5 tests) 152ms + ✓ lib/svg/accentConsistency.test.ts (3 tests) 73ms +stderr | utils/getClientIp.theme-contrast.test.ts > getClientIp — Dark & Light Prefers-Color-Scheme Visual Cohesion (Variation 3) > should reject spoofed X-Forwarded-For headers with correct contrast-boundary IP resolution +{"timestamp":"2026-07-23T03:08:33.333Z","type":"SECURITY_EVENT","event":"SPOOFED_HEADER_ATTEMPT","claimedIp":"198.51.100.5","resolvedIp":"203.0.113.10","header":"x-forwarded-for"} + + ✓ utils/getClientIp.theme-contrast.test.ts (5 tests) 82ms + ✓ lib/resume-parser.test.ts (9 tests) 67ms + ✓ app/contributors/ContributorsSearch.type-compiler.test.tsx (5 tests) 47ms + ✓ app/customize/utils.mock-integrations.test.ts (5 tests) 212ms + ✓ app/api/stats/route.type-compiler.test.ts (5 tests) 387ms + ✓ services/github/refresh-rate-limiter.mock-integrations.test.ts (5 tests) 59ms + ✓ lib/search/fuzzySearch.test.ts (13 tests) 199ms + ✓ app/contributors/ContributorsClient.type-compiler.test.tsx (5 tests) 117ms + ✓ lib/syncQueue.test.ts (6 tests) 141ms +stdout | services/github/background-refresh.test.ts > BackgroundRefresh Unit Tests > triggerRefresh > sanitizes username (trims and converts to lowercase) +[BackgroundRefresh] Queuing background refresh for: testuser + +stdout | services/github/background-refresh.test.ts > BackgroundRefresh Unit Tests > triggerRefresh > sanitizes username (trims and converts to lowercase) +[BackgroundRefresh] Successfully completed background refresh for: testuser + + ✓ app/api/github/route.mock-integrations.test.ts (5 tests) 126ms +stdout | services/github/background-refresh.test.ts > BackgroundRefresh Unit Tests > triggerRefresh > prevents concurrent duplicate jobs for the same user +[BackgroundRefresh] Queuing background refresh for: user1 +[BackgroundRefresh] Refresh already active for: user1 + +stdout | services/github/background-refresh.test.ts > BackgroundRefresh Unit Tests > triggerRefresh > prevents concurrent duplicate jobs for the same user +[BackgroundRefresh] Successfully completed background refresh for: user1 + +stdout | services/github/background-refresh.test.ts > BackgroundRefresh Unit Tests > triggerRefresh > removes the user from active jobs on failure +[BackgroundRefresh] Queuing background refresh for: user-fail + +stdout | services/github/background-refresh.test.ts > BackgroundRefresh Unit Tests > triggerRefresh > handles expired tokens or authentication errors gracefully +[BackgroundRefresh] Queuing background refresh for: invalid_token_user + +stdout | services/github/background-refresh.test.ts > BackgroundRefresh Unit Tests > triggerRefresh > recovers correctly from network dropouts during synchronization +[BackgroundRefresh] Queuing background refresh for: offline_user + +stdout | services/github/background-refresh.test.ts > BackgroundRefresh Unit Tests > reset > clears all currently active jobs +[BackgroundRefresh] Queuing background refresh for: active-user + + ✓ services/github/background-refresh.test.ts (11 tests) 131ms + ✓ app/customize/utils.test.ts (25 tests) 92ms + ✓ lib/graph/recommendationEngine.test.ts (6 tests) 55ms + ✓ app/generator/data/socials.empty-fallback.test.ts (5 tests) 82ms + ✓ app/generator/utils/readmeGenerator.mock-integrations.test.ts (5 tests) 154ms + ✓ lib/validations.year.test.ts (28 tests) 84ms + ✓ app/generator/data/socials.error-resilience.test.ts (5 tests) 66ms + ✓ app/generator/components/sections/TechnologyGraph.mock-integrations.test.tsx (5 tests) 52ms +stderr | utils/getClientIp.test.ts > getClientIp > ignores spoofed X-Forwarded-For when request.ip is present +{"timestamp":"2026-07-23T03:08:48.819Z","type":"SECURITY_EVENT","event":"SPOOFED_HEADER_ATTEMPT","claimedIp":"198.51.100.5","resolvedIp":"203.0.113.10","header":"x-forwarded-for"} + +stderr | utils/getClientIp.test.ts > getClientIp > ignores direct client-supplied custom priority headers +{"timestamp":"2026-07-23T03:08:48.825Z","type":"SECURITY_EVENT","event":"UNTRUSTED_FORWARDED_HEADER_IGNORED","resolvedIp":"unknown","header":"cf-connecting-ip"} + +stderr | utils/getClientIp.test.ts > getClientIp > stops at the first untrusted proxy in the chain +{"timestamp":"2026-07-23T03:08:48.831Z","type":"SECURITY_EVENT","event":"SPOOFED_HEADER_ATTEMPT","claimedIp":"198.51.100.5","resolvedIp":"8.8.8.8","header":"x-forwarded-for"} + +stderr | utils/getClientIp.test.ts > getClientIp > supports wildcards to trust all proxies (trust-all behavior) +{"timestamp":"2026-07-23T03:08:48.833Z","type":"SECURITY_EVENT","event":"WILDCARD_TRUST_USED","resolvedIp":"198.51.100.5","chain":["198.51.100.5","203.0.113.10"],"header":"x-forwarded-for"} + +stderr | utils/getClientIp.test.ts > getClientIp > sanitizes multi-IP lists and traverses untrusted hops from right to left +{"timestamp":"2026-07-23T03:08:48.835Z","type":"SECURITY_EVENT","event":"SPOOFED_HEADER_ATTEMPT","claimedIp":"203.0.113.195","resolvedIp":"198.51.100.10","header":"x-forwarded-for"} + +stderr | utils/getClientIp.test.ts > getClientIp > does not return a trusted proxy as the client IP when it is the only hop in the chain +{"timestamp":"2026-07-23T03:08:48.870Z","type":"SECURITY_EVENT","event":"SPOOFED_HEADER_ATTEMPT","claimedIp":"203.0.113.5","resolvedIp":"127.0.0.1","header":"x-forwarded-for"} + + ✓ utils/getClientIp.test.ts (12 tests) 68ms + ✓ app/generator/types.timezone-boundaries.test.ts (5 tests) 34ms + ✓ lib/analytics/authorAttribution.test.ts (12 tests) 33ms + ✓ models/Notification.mock-integrations.test.ts (5 tests) 75ms + ✓ app/api/user-details/route.mouse-interactivity.test.ts (5 tests) 62ms + ✓ app/api/health/route.test.ts (4 tests) 63ms + ✓ lib/resume-parser.mouse-interactivity.test.ts (5 tests) 37ms + ✓ app/api/streak/png/route.mock-integrations.test.ts (5 tests) 67ms + ✓ lib/resume-parser.mock-integrations.test.ts (5 tests) 41ms + ✓ lib/github-owner-verification.test.ts (5 tests) 96ms + ✓ services/github/quota-monitor.mock-integrations.test.ts (6 tests) 47ms + ✓ app/api/user-details/route.mock-integrations.test.ts (5 tests) 64ms + ✓ app/api/wrapped/route.error-resilience.test.ts (5 tests) 231ms +(node:49941) [MONGOOSE] Warning: Mongoose: `Document.prototype.validateSync()` is deprecated and will be removed in Mongoose 10. Use `Document.prototype.validate()` instead. +(Use `node-22 --trace-warnings ...` to show where the warning was created) +(node:49941) [MONGOOSE] Warning: Mongoose: `Document.prototype.validateSync()` is deprecated and will be removed in Mongoose 10. Use `Document.prototype.validate()` instead. +(node:49941) [MONGOOSE] Warning: Mongoose: `Document.prototype.validateSync()` is deprecated and will be removed in Mongoose 10. Use `Document.prototype.validate()` instead. +(node:49941) [MONGOOSE] Warning: Mongoose: `Document.prototype.validateSync()` is deprecated and will be removed in Mongoose 10. Use `Document.prototype.validate()` instead. + ✓ models/StudentProfile.error-resilience.test.ts (5 tests) 54ms + ✓ lib/i18n/badgeLabels.accessibility.test.ts (5 tests) 15ms + ✓ app/generator/data/technologies.error-resilience.test.ts (5 tests) 153ms + ✓ app/api/webhooks/cicd/route.test.ts (4 tests) 49ms + ✓ lib/svg/themes/dracula.test.ts (5 tests) 19ms + ✓ components/dashboard/heatmapUtils.mock-integrations.test.ts (5 tests) 19ms + ✓ lib/export3d.theme-contrast.test.ts (5 tests) 249ms + ✓ models/Notification.responsive-breakpoints.test.ts (5 tests) 169ms + ✓ app/api/student/resume/upload/route.error-resilience.test.ts (5 tests) 35ms + ✓ services/github/background-refresh.empty-fallback.test.ts (5 tests) 27ms + ✓ services/github/quota-monitor.error-resilience.test.ts (5 tests) 28ms +(node:50069) [MONGOOSE] Warning: Mongoose: `Document.prototype.validateSync()` is deprecated and will be removed in Mongoose 10. Use `Document.prototype.validate()` instead. +(Use `node-22 --trace-warnings ...` to show where the warning was created) +(node:50069) [MONGOOSE] Warning: Mongoose: `Document.prototype.validateSync()` is deprecated and will be removed in Mongoose 10. Use `Document.prototype.validate()` instead. +(node:50069) [MONGOOSE] Warning: Mongoose: `Document.prototype.validateSync()` is deprecated and will be removed in Mongoose 10. Use `Document.prototype.validate()` instead. +(node:50069) [MONGOOSE] Warning: Mongoose: `Document.prototype.validateSync()` is deprecated and will be removed in Mongoose 10. Use `Document.prototype.validate()` instead. +(node:50069) [MONGOOSE] Warning: Mongoose: `Document.prototype.validateSync()` is deprecated and will be removed in Mongoose 10. Use `Document.prototype.validate()` instead. + ✓ models/Notification.empty-fallback.test.ts (5 tests) 122ms + ✓ app/api/pr-insights/route.error-resilience.test.ts (5 tests) 66ms + ✓ utils/calculateBurnoutRisk.test.ts (27 tests) 43ms + ✓ components/dashboard/GrowthTrendChart.type-compiler.test.tsx (5 tests) 47ms + ✓ components/Leaderboard.type-compiler.test.tsx (5 tests) 48ms + ✓ models/StudentProfile.test.ts (6 tests) 134ms + ✓ lib/svg/themes/nord.test.ts (6 tests) 37ms + ✓ middleware.rate-limit.test.ts (6 tests) 57ms +stdout | services/github/background-refresh.theme-contrast.test.ts > BackgroundRefresh - Theme Contrast Equivalent (Mode Cohesion) > Behavior Adaptation Cohesion: accurately transitions user from Idle to Active Job state +[BackgroundRefresh] Queuing background refresh for: transition_user + +stdout | services/github/background-refresh.theme-contrast.test.ts > BackgroundRefresh - Theme Contrast Equivalent (Mode Cohesion) > Behavior Adaptation Cohesion: accurately transitions user from Idle to Active Job state +[BackgroundRefresh] Successfully completed background refresh for: transition_user + +stdout | services/github/background-refresh.theme-contrast.test.ts > BackgroundRefresh - Theme Contrast Equivalent (Mode Cohesion) > Contrast Verification (Concurrency): rigidly rejects colliding background jobs to preserve active state contrast +[BackgroundRefresh] Queuing background refresh for: collide_user +[BackgroundRefresh] Refresh already active for: collide_user + +stdout | services/github/background-refresh.theme-contrast.test.ts > BackgroundRefresh - Theme Contrast Equivalent (Mode Cohesion) > Contrast Verification (Concurrency): rigidly rejects colliding background jobs to preserve active state contrast +[BackgroundRefresh] Successfully completed background refresh for: collide_user + +stdout | services/github/background-refresh.theme-contrast.test.ts > BackgroundRefresh - Theme Contrast Equivalent (Mode Cohesion) > Configuration Preservation (Error Resilience): clears active state smoothly upon integration failures without getting stuck +[BackgroundRefresh] Queuing background refresh for: error_user + +stderr | services/github/background-refresh.theme-contrast.test.ts > BackgroundRefresh - Theme Contrast Equivalent (Mode Cohesion) > Configuration Preservation (Error Resilience): clears active state smoothly upon integration failures without getting stuck +[BackgroundRefresh] Background refresh failed for: error_user Error: Network failure + at /home/atulupadhyay/Contribution/commitpulse/services/github/background-refresh.theme-contrast.test.ts:82:67 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:302:11 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:1903:26 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2326:20 + at new Promise (<anonymous>) + at runWithCancel (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2323:10) + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2305:20 + at new Promise (<anonymous>) + at runWithTimeout (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2272:10) + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2955:64 + +stdout | services/github/background-refresh.theme-contrast.test.ts > BackgroundRefresh - Theme Contrast Equivalent (Mode Cohesion) > Foreground/Background Cohesion (Sanitization): flawlessly aligns active states across disparate formatting inputs +[BackgroundRefresh] Queuing background refresh for: messy_user + +stdout | services/github/background-refresh.theme-contrast.test.ts > BackgroundRefresh - Theme Contrast Equivalent (Mode Cohesion) > Foreground/Background Cohesion (Sanitization): flawlessly aligns active states across disparate formatting inputs +[BackgroundRefresh] Successfully completed background refresh for: messy_user + + ✓ services/github/background-refresh.theme-contrast.test.ts (5 tests) 74ms +stderr | services/github/burnout-analyzer.test.ts > BurnoutAnalyzer Service > falls back to rules-based recommendations when Gemini returns malformed JSON +Gemini returned malformed JSON, skipping AI recommendations. + + ✓ services/github/burnout-analyzer.test.ts (3 tests) 45ms + ✓ lib/svg/themes/midnight_ocean.test.ts (6 tests) 188ms +stderr | services/wakatime/api.test.ts > WakaTime API Service > getWakaTimeStats > handles non-ok responses gracefully +Error fetching WakaTime stats: 401 Unauthorized + +stderr | services/wakatime/api.test.ts > WakaTime API Service > getWakaTimeStats > handles fetch errors gracefully +Error fetching WakaTime stats: Error: Network error + at /home/atulupadhyay/Contribution/commitpulse/services/wakatime/api.test.ts:97:46 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:302:11 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:1903:26 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2326:20 + at new Promise (<anonymous>) + at runWithCancel (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2323:10) + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2305:20 + at new Promise (<anonymous>) + at runWithTimeout (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2272:10) + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2955:64 + + ✓ services/wakatime/api.test.ts (6 tests) 98ms + ✓ lib/mongodb.test.ts (10 tests) 33ms + ✓ app/api/notify/route.type-compiler.test.ts (5 tests) 36ms + ✓ utils/dashboardPeriod.empty-fallback.test.ts (6 tests) 22ms + ✓ components/CherryBlossom.type-compiler.test.tsx (5 tests) 24ms + ✓ services/github/quota-monitor.responsive-breakpoints.test.ts (5 tests) 60ms + ✓ lib/validations.compareParamsSchema.test.ts (6 tests) 160ms + ✓ services/github/quota-monitor.empty-fallback.test.ts (5 tests) 30ms + ✓ lib/github.telemetry.test.ts (2 tests) 27ms + ✓ app/api/student/resume/upload/route.theme-contrast.test.ts (5 tests) 51ms + ✓ lib/analytics/teamHealth.test.ts (4 tests) 44ms + ✓ app/api/wrapped/route.type-compiler.test.ts (5 tests) 20ms + ✓ services/github/refresh-policy.responsive-breakpoints.test.ts (3 tests) 38ms +stderr | app/api/streak/png/route.error-resilience.test.ts > GET /api/streak/png - Error Resilience > returns fallback SVG when PNG conversion fails +[vitest] The vi.fn() mock did not use 'function' or 'class' in its implementation, see https://vitest.dev/api/vi#vi-spyon for examples. + +stderr | app/api/streak/png/route.error-resilience.test.ts > GET /api/streak/png - Error Resilience > logs conversion errors +[vitest] The vi.fn() mock did not use 'function' or 'class' in its implementation, see https://vitest.dev/api/vi#vi-spyon for examples. + +stderr | app/api/streak/png/route.error-resilience.test.ts > GET /api/streak/png - Error Resilience > handles non Error exceptions safely +[vitest] The vi.fn() mock did not use 'function' or 'class' in its implementation, see https://vitest.dev/api/vi#vi-spyon for examples. + + ✓ app/api/streak/png/route.error-resilience.test.ts (5 tests) 118ms +stdout | services/github/background-refresh.mock-integrations.test.ts > BackgroundRefresh Mock Integrations > mocks standard asynchronous imports using stubs for background refresh +[BackgroundRefresh] Queuing background refresh for: john_doe + +stdout | services/github/background-refresh.mock-integrations.test.ts > BackgroundRefresh Mock Integrations > mocks standard asynchronous imports using stubs for background refresh +[BackgroundRefresh] Successfully completed background refresh for: john_doe + +stdout | services/github/background-refresh.mock-integrations.test.ts > BackgroundRefresh Mock Integrations > tests service loading paths to ensure pending state overlays render +[BackgroundRefresh] Queuing background refresh for: pending_user + +stdout | services/github/background-refresh.mock-integrations.test.ts > BackgroundRefresh Mock Integrations > tests service loading paths to ensure pending state overlays render +[BackgroundRefresh] Successfully completed background refresh for: pending_user + +stdout | services/github/background-refresh.mock-integrations.test.ts > BackgroundRefresh Mock Integrations > verifies correct fallback procedures during fake endpoint timeout blocks +[BackgroundRefresh] Queuing background refresh for: timeout_user + + ✓ services/github/background-refresh.mock-integrations.test.ts (5 tests) 61ms + ✓ lib/svg/sanitizer.test.ts (75 tests) 84ms + ✓ lib/graph/recommendationEngine.accessibility.test.ts (5 tests) 79ms + ✓ lib/svg/themes/neon.test.ts (5 tests) 55ms + ✓ services/github/validate-user.test.ts (5 tests) 58ms + ✓ app/api/track-user/route.mock-integrations.test.ts (5 tests) 48ms + ✓ utils/dateRange.theme-contrast.test.ts (5 tests) 44ms + ✓ services/security/track-user-protection.test.ts (12 tests) 139ms + ✓ utils/urls.test.ts (10 tests) 55ms + ✓ lib/security/csrf.test.ts (15 tests) 93ms + ✓ lib/svg/layout.test.ts (45 tests) 32ms + ✓ hooks/useGlowEffect.theme-contrast.test.ts (5 tests) 18ms + ✓ lib/svg/sanitizer.empty-fallback.test.ts (5 tests) 43ms + ✓ lib/svg/constants.mock-integrations.test.ts (5 tests) 27ms + ✓ lib/structured-clone-regression.test.ts (1 test) 185ms + ✓ lib/resume-parser.theme-contrast.test.ts (5 tests) 35ms + ✓ components/dashboard/HistoricalTrendView.type-compiler.test.tsx (5 tests) 115ms + ✓ models/StudentProfile.theme-contrast.test.ts (5 tests) 35ms + ✓ app/api/streak/route.type-compiler.test.ts (5 tests) 42ms + ✓ models/User.connection-state-0-v5.test.ts (5 tests) 56ms + ✓ types/dashboard.empty-fallback.test.ts (5 tests) 17ms + ✓ lib/i18n/languages/de.test.ts (5 tests) 18ms + ✓ lib/i18n/languages/hi.test.ts (5 tests) 72ms + ✓ lib/cache.error-resilience.test.ts (5 tests) 86ms + ✓ lib/secretScanner.test.ts (14 tests) 38ms + ✓ src/utils/svgRenderer.empty-fallback.test.ts (5 tests) 90ms + ✓ services/github/background-refresh.timezone-boundaries.test.ts (5 tests) 55ms + ✓ services/github/webhook-handler.test.ts (11 tests) 37ms + ✓ services/github/background-refresh.type-compiler.test.ts (5 tests) 50ms + ✓ lib/i18n/languages/ta.test.ts (5 tests) 43ms + ✓ app/generator/data/socials.type-compiler.test.ts (5 tests) 333ms + ✓ app/generator/types.empty-fallback.test.ts (5 tests) 403ms + ✓ next-env.d.empty-fallback.test.ts (5 tests) 353ms + ✓ lib/resume-parser.empty-fallback.test.ts (11 tests) 156ms +stdout | services/github/background-refresh.responsive-breakpoints.test.ts > BackgroundRefresh - Responsive Breakpoints (Multi-device Columns & Mobile Viewport Layouts) > Mobile Viewport (375px): minimal-length usernames are handled without overflow or stuck state +[BackgroundRefresh] Queuing background refresh for: a + +stdout | services/github/background-refresh.responsive-breakpoints.test.ts > BackgroundRefresh - Responsive Breakpoints (Multi-device Columns & Mobile Viewport Layouts) > Mobile Viewport (375px): minimal-length usernames are handled without overflow or stuck state +[BackgroundRefresh] Successfully completed background refresh for: a + +stdout | services/github/background-refresh.responsive-breakpoints.test.ts > BackgroundRefresh - Responsive Breakpoints (Multi-device Columns & Mobile Viewport Layouts) > Column Reflow: multiple concurrent jobs for different users queue independently without collapsing into one +[BackgroundRefresh] Queuing background refresh for: user_col_1 +[BackgroundRefresh] Queuing background refresh for: user_col_2 +[BackgroundRefresh] Queuing background refresh for: user_col_3 + +stdout | services/github/background-refresh.responsive-breakpoints.test.ts > BackgroundRefresh - Responsive Breakpoints (Multi-device Columns & Mobile Viewport Layouts) > Column Reflow: multiple concurrent jobs for different users queue independently without collapsing into one +[BackgroundRefresh] Successfully completed background refresh for: user_col_1 +[BackgroundRefresh] Successfully completed background refresh for: user_col_2 +[BackgroundRefresh] Successfully completed background refresh for: user_col_3 + +stdout | services/github/background-refresh.responsive-breakpoints.test.ts > BackgroundRefresh - Responsive Breakpoints (Multi-device Columns & Mobile Viewport Layouts) > No Horizontal Scroll: maximum-length usernames (39 chars) do not cause overflow or blocked job state +[BackgroundRefresh] Queuing background refresh for: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa + +stdout | services/github/background-refresh.responsive-breakpoints.test.ts > BackgroundRefresh - Responsive Breakpoints (Multi-device Columns & Mobile Viewport Layouts) > No Horizontal Scroll: maximum-length usernames (39 chars) do not cause overflow or blocked job state +[BackgroundRefresh] Successfully completed background refresh for: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa + +stdout | services/github/background-refresh.responsive-breakpoints.test.ts > BackgroundRefresh - Responsive Breakpoints (Multi-device Columns & Mobile Viewport Layouts) > Navigation Scaling: usernames with mixed casing and whitespace scale down gracefully to normalized active state +[BackgroundRefresh] Queuing background refresh for: navuser_xl + +stdout | services/github/background-refresh.responsive-breakpoints.test.ts > BackgroundRefresh - Responsive Breakpoints (Multi-device Columns & Mobile Viewport Layouts) > Mobile Toggle State: rapid successive trigger attempts on same user toggle cleanly without duplicate jobs +[BackgroundRefresh] Queuing background refresh for: toggle_user +[BackgroundRefresh] Refresh already active for: toggle_user + +stdout | services/github/background-refresh.responsive-breakpoints.test.ts > BackgroundRefresh - Responsive Breakpoints (Multi-device Columns & Mobile Viewport Layouts) > Mobile Toggle State: rapid successive trigger attempts on same user toggle cleanly without duplicate jobs +[BackgroundRefresh] Successfully completed background refresh for: toggle_user + +stdout | services/github/background-refresh.responsive-breakpoints.test.ts > BackgroundRefresh - Responsive Breakpoints (Multi-device Columns & Mobile Viewport Layouts) > Mobile Toggle State: rapid successive trigger attempts on same user toggle cleanly without duplicate jobs +[BackgroundRefresh] Queuing background refresh for: toggle_user + +stdout | services/github/background-refresh.responsive-breakpoints.test.ts > BackgroundRefresh - Responsive Breakpoints (Multi-device Columns & Mobile Viewport Layouts) > Mobile Toggle State: rapid successive trigger attempts on same user toggle cleanly without duplicate jobs +[BackgroundRefresh] Successfully completed background refresh for: toggle_user + + ✓ services/github/background-refresh.responsive-breakpoints.test.ts (5 tests) 214ms + ✓ lib/svg/generator.wrappedEscape.test.ts (4 tests) 49ms + ✓ lib/svg/themes/cyber-pulse.test.ts (5 tests) 60ms + ✓ components/dashboard/tooltipUtils.mock-integrations.test.ts (5 tests) 144ms + ✓ app/customize/utils.responsive-breakpoints.test.ts (5 tests) 22ms + ✓ services/github/refresh-rate-limiter.responsive-breakpoints.test.ts (5 tests) 40ms + ✓ utils/dateRange.empty-fallback.test.ts (6 tests) 30ms + ✓ services/github/quota-monitor.timezone-boundaries.test.ts (5 tests) 41ms + ✓ utils/trustedProxy.test.ts (11 tests) 26ms + ✓ app/generator/components/sections/TechnologiesSection.type-compiler.test.tsx (5 tests) 166ms + ✓ hooks/useShareActions.type-compiler.test.ts (5 tests) 38ms + ✓ components/dashboard/heatmapUtils.test.ts (7 tests) 34ms + ✓ app/customize/types.mock-integrations.test.ts (5 tests) 89ms +stderr | utils/getClientIp.accessibility.test.ts > getClientIp - Accessibility Standards & Screen Reader Aria Compliance > Focus Outline Behavior: ignores untrusted forwarded headers when no trusted peer exists +{"timestamp":"2026-07-23T03:09:46.757Z","type":"SECURITY_EVENT","event":"UNTRUSTED_FORWARDED_HEADER_IGNORED","resolvedIp":"unknown","header":"x-forwarded-for"} + +stderr | utils/getClientIp.accessibility.test.ts > getClientIp - Accessibility Standards & Screen Reader Aria Compliance > Tab Ordering: wildcard trust returns the leftmost client IP in the chain +{"timestamp":"2026-07-23T03:09:46.769Z","type":"SECURITY_EVENT","event":"WILDCARD_TRUST_USED","resolvedIp":"198.51.100.5","chain":["198.51.100.5","203.0.113.10"],"header":"x-forwarded-for"} + + ✓ utils/getClientIp.accessibility.test.ts (5 tests) 72ms + ✓ components/InteractiveViewer.type-compiler.test.tsx (5 tests) 41ms + ✓ app/generator/utils/readmeGenerator.empty-fallback.test.ts (7 tests) 30ms + ✓ app/api/github/route.type-compiler.test.ts (5 tests) 15ms + ✓ lib/svg/themes/tokyo_night.test.ts (5 tests) 75ms + ✓ app/generator/components/sections/NameSection.timezone-boundaries.test.tsx (5 tests) 20ms + ✓ auth.session.test.ts (2 tests) 10ms + ✓ utils/trustedProxy.coverage.test.ts (5 tests) 44ms + ✓ services/github/refresh-policy.timezone-boundaries.test.ts (5 tests) 54ms + ✓ lib/i18n/languages/es.test.ts (5 tests) 10ms + ✓ app/api/user-details/route.type-compiler.test.ts (5 tests) 24ms + ✓ app/api/streak/png/route.empty-fallback.test.ts (5 tests) 53ms + ✓ app/layout.type-compiler.test.tsx (5 tests) 12ms + ✓ lib/svg/generator.particleCount.test.ts (6 tests) 14ms + ✓ components/dashboard/RefreshButton.type-compiler.test.tsx (5 tests) 51ms + ✓ lib/svg/animations.empty-fallback.test.ts (5 tests) 35ms + ✓ utils/urls.accessibility.test.ts (5 tests) 59ms + ✓ app/customize/utils.error-resilience.test.ts (5 tests) 25ms +(node:51607) [MONGOOSE] Warning: Mongoose: `Document.prototype.validateSync()` is deprecated and will be removed in Mongoose 10. Use `Document.prototype.validate()` instead. +(Use `node-22 --trace-warnings ...` to show where the warning was created) +(node:51607) [MONGOOSE] Warning: Mongoose: `Document.prototype.validateSync()` is deprecated and will be removed in Mongoose 10. Use `Document.prototype.validate()` instead. + ✓ models/Notification.type-compiler.test.ts (5 tests) 91ms + ✓ utils/getClientIp.empty-fallback.test.ts (6 tests) 53ms + ✓ lib/validations.theme-contrast.test.ts (5 tests) 25ms + ✓ app/api/architecture/route.test.ts (1 test) 35ms + ✓ lib/svg/wakatime.test.ts (3 tests) 66ms + ✓ components/dashboard/tooltipUtils.empty-fallback.test.ts (5 tests) 14ms + ✓ app/generator/utils/readmeGenerator.test.ts (4 tests) 105ms +stdout | lib/svg/optimizer.test.ts > optimizeSVG > should achieve significant size reduction on a larger sample SVG +Original: 1062 bytes, Minified: 695 bytes, Reduction: 34.56% + + ✓ lib/svg/optimizer.test.ts (15 tests) 124ms + ✓ lib/svg/themes/aurora_cyberpunk.test.ts (5 tests) 25ms + ✓ components/dashboard/tooltipUtils.responsive-breakpoints.test.ts (5 tests) 32ms + ✓ services/github/validate-user.theme-contrast.test.ts (5 tests) 49ms + ✓ lib/svg/layout.theme-contrast.test.ts (5 tests) 16ms + ✓ lib/svg/constants.timezone-boundaries.test.ts (5 tests) 13ms + ✓ lib/svg/sanitizer.accessibility.test.ts (5 tests) 15ms + ✓ lib/svg/themes/ocean.test.ts (5 tests) 25ms + ✓ lib/validate-env.test.ts (21 tests) 37ms + ✓ utils/tracking.empty-fallback.test.ts (5 tests) 89ms + ✓ services/github/refresh-policy.test.ts (5 tests) 45ms + ✓ lib/cache.empty-fallback.test.ts (5 tests) 14ms + ✓ lib/graph/dependencyGraph.empty-fallback.test.ts (5 tests) 47ms + ✓ app/generator/data/technologies.mock-integrations.test.ts (5 tests) 10ms + ✓ components/TopRivalriesTicker.type-compiler.test.tsx (6 tests) 11ms + ✓ utils/cacheControl.empty-fallback.test.ts (6 tests) 18ms + ✓ lib/svg/themes/gruvbox_light.test.ts (5 tests) 28ms + ✓ app/generator/components/sections/SocialsSection.type-compiler.test.tsx (5 tests) 27ms + ✓ lib/svg/themes/forest.test.ts (6 tests) 28ms + ✓ services/github/validate-user.type-compiler.test.ts (5 tests) 20ms + ✓ lib/validations.wrappedParamsSchema.test.ts (6 tests) 24ms + ✓ lib/api-contract/detectBreakingChanges.test.ts (9 tests) 41ms + ✓ components/dashboard/AchievementsSkeleton.type-compiler.test.tsx (5 tests) 47ms + ✓ app/components/theme-switch.type-compiler.test.tsx (5 tests) 20ms + ✓ lib/notification-management-token.empty-fallback.test.ts (26 tests) 70ms + ✓ hooks/useShareActions.theme-contrast.test.ts (5 tests) 39ms + ✓ components/dashboard/ProfileOptimizerModal.type-compiler.test.tsx (5 tests) 16ms + ✓ app/layout.mouse-interactivity.test.tsx (5 tests) 57ms + ✓ components/KonamiEasterEgg.type-compiler.test.tsx (5 tests) 123ms + ✓ lib/svg/generator.accessibility.test.ts (5 tests) 36ms + ✓ app/not-found.type-compiler.test.tsx (5 tests) 44ms + ✓ lib/svg/themes/catppuccin_latte.test.ts (5 tests) 83ms + ✓ utils/dateRange.test.ts (15 tests) 26ms + ✓ components/dashboard/ResumeProfileSection.type-compiler.test.tsx (6 tests) 13ms + ✓ services/security/track-user-protection.mouse-interactivity.test.ts (5 tests) 34ms + ✓ services/github/validate-user.empty-fallback.test.ts (5 tests) 39ms + ✓ app/customize/types.type-compiler.test.ts (5 tests) 9ms + ✓ lib/svg/generator.deterministicRandom.test.ts (5 tests) 24ms + ✓ lib/graph/recommendationEngine.logic.test.ts (5 tests) 25ms + ✓ components/dashboard/PRInsights/Highlights.type-compiler.test.tsx (5 tests) 33ms + ✓ app/customize/types.test.ts (3 tests) 19ms + ✓ services/github/refresh-rate-limiter.type-compiler.test.ts (5 tests) 18ms + ✓ app/components/navbar.type-compiler.test.tsx (5 tests) 22ms + ✓ hooks/useRecentSearches.type-compiler.test.ts (5 tests) 23ms + ✓ app/generator/components/SectionCard.type-compiler.test.tsx (5 tests) 30ms + ✓ components/dashboard/DeploymentTracker.type-compiler.test.tsx (12 tests) 55ms + ✓ app/generator/utils/readmeGenerator.mouse-interactivity.test.ts (5 tests) 33ms + ✓ services/github/refresh-rate-limiter.test.ts (5 tests) 51ms + ✓ services/github/refresh-rate-limiter.error-resilience.test.ts (5 tests) 33ms + ✓ lib/svg/themes/highcontrast.test.ts (5 tests) 20ms + ✓ app/generator/utils/readmeGenerator.timezone-boundaries.test.ts (5 tests) 16ms + ✓ app/layout.theme-contrast.test.tsx (5 tests) 57ms + ✓ services/security/track-user-protection.responsive-breakpoints.test.ts (5 tests) 15ms + ✓ services/spotify/api.test.ts (5 tests) 50ms + ✓ components/dashboard/ComparisonStatsCard.type-compiler.test.tsx (5 tests) 66ms + ✓ app/components/CustomizeCTA.type-compiler.test.tsx (5 tests) 15ms + ✓ app/customize/types.responsive-breakpoints.test.ts (5 tests) 62ms + ✓ components/dashboard/Heatmap.type-compiler.test.tsx (5 tests) 9ms + ✓ components/dashboard/PopularPinnedRepos.type-compiler.test.tsx (5 tests) 25ms + ✓ lib/svg/animations.theme-contrast.test.ts (5 tests) 17ms + ✓ components/dashboard/heatmapUtils.type-compiler.test.ts (5 tests) 40ms + ✓ lib/graph/recommendationEngine.empty-fallback.test.ts (5 tests) 37ms + ✓ lib/validations.notifyPostSchema.test.ts (5 tests) 196ms + ✓ app/generator/components/sections/NameSection.type-compiler.test.tsx (5 tests) 98ms + ✓ app/components/Footer.type-compiler.test.tsx (5 tests) 71ms + ✓ app/customize/types.empty-fallback.test.ts (5 tests) 65ms + ✓ lib/svg/themes/light.test.ts (5 tests) 110ms + ✓ lib/svg/themes.solarized_light.test.ts (10 tests) 45ms + ✓ lib/svg/generator.theme-contrast.test.ts (5 tests) 78ms + ✓ app/generator/utils/readmeGenerator.error-resilience.test.ts (5 tests) 41ms + ✓ utils/time.empty-fallback.test.ts (4 tests) 40ms + ✓ next-env-d-stability.test.ts (5 tests) 59ms + ✓ services/github/quota-monitor.theme-contrast.test.ts (5 tests) 31ms + ✓ app/(root)/dashboard/error.type-compiler.test.tsx (5 tests) 12ms + ✓ app/generator/data/socials.mock-integrations.test.ts (5 tests) 26ms + ✓ services/github/validate-user.mouse-interactivity.test.ts (5 tests) 16ms + ✓ app/customize/utils.mouse-interactivity.test.ts (5 tests) 41ms + ✓ services/security/track-user-protection.mock-integrations.test.ts (5 tests) 19ms + ✓ app/generator/utils/readmeGenerator.responsive-breakpoints.test.ts (5 tests) 63ms + ✓ services/github/refresh-policy.theme-contrast.test.ts (5 tests) 46ms + ✓ lib/rate-limit.empty-fallback.test.ts (5 tests) 42ms + ✓ lib/svg/sanitizer.theme-contrast.test.ts (32 tests) 29ms + ✓ types/student.empty-fallback.test.ts (6 tests) 33ms + ✓ app/documentation/code-block.timezone-boundaries.test.tsx (5 tests) 16ms + ✓ lib/svg/themes/rose.test.ts (6 tests) 24ms + ✓ lib/svg/constants.responsive-breakpoints.test.ts (5 tests) 16ms + ✓ app/generator/utils/githubMapper.test.ts (4 tests) 22ms + ✓ lib/svg/layoutConstants.empty-fallback.test.ts (5 tests) 32ms + ✓ app/customize/components/ExportPanel.type-compiler.test.tsx (5 tests) 21ms + ✓ components/reviewform.type-compiler.test.tsx (5 tests) 34ms + ✓ lib/svg/generator.empty-fallback.test.ts (5 tests) 27ms + ✓ app/customize/utils.empty-fallback.test.ts (5 tests) 23ms + ✓ lib/svg/glacier.test.ts (5 tests) 35ms + ✓ lib/rate-limit.theme-contrast.test.ts (5 tests) 43ms + ✓ app/components/SuccessGuide.type-compiler.test.tsx (5 tests) 33ms + ✓ app/customize/types.error-resilience.test.ts (5 tests) 60ms + ✓ app/api/track-user/route.responsive-breakpoints.test.ts (5 tests) 109ms + ✓ app/customize/types.theme-contrast.test.ts (5 tests) 39ms + ✓ app/generator/utils/readmeGenerator.theme-contrast.test.ts (5 tests) 24ms + ✓ app/api/student/resume/confirm/route.type-compiler.test.ts (5 tests) 16ms + ✓ lib/resume-parser.timezone-boundaries.test.ts (5 tests) 25ms + ✓ components/dashboard/PRInsights/PRStatusDistribution.type-compiler.test.tsx (5 tests) 16ms + ✓ app/api/track-user/route.theme-contrast.test.ts (5 tests) 73ms + ✓ lib/svg/themes/test-utils.empty-fallback.test.ts (5 tests) 31ms + ✓ services/github/validate-user.mock-integrations.test.ts (5 tests) 16ms + ✓ services/security/track-user-protection.type-compiler.test.ts (5 tests) 14ms + ✓ types/network.theme-contrast.test.ts (5 tests) 21ms + ✓ app/api/user-details/route.empty-fallback.test.ts (5 tests) 16ms + ✓ lib/snakeWorkflowGenerator.test.ts (12 tests) 43ms + ✓ components/dashboard/PRInsights/RepoPerformanceTable.type-compiler.test.tsx (5 tests) 10ms + ✓ app/generator/data/socials.mouse-interactivity.test.ts (5 tests) 16ms + ✓ models/User.theme-contrast.test.ts (5 tests) 10ms + ✓ services/github/ci-analytics.test.ts (4 tests) 13ms + ✓ lib/svg/languageColors.empty-fallback.test.ts (5 tests) 18ms + ✓ components/dashboard/tooltipUtils.type-compiler.test.ts (5 tests) 16ms + ✓ app/contributors/page.timezone-boundaries.test.tsx (4 tests) 35ms + ✓ app/compare/page.type-compiler.test.tsx (5 tests) 18ms + ✓ types/student.theme-contrast.test.ts (5 tests) 44ms + ✓ lib/svg/constants.theme-contrast.test.ts (6 tests) 61ms + ✓ services/security/track-user-protection.error-resilience.test.ts (5 tests) 20ms + ✓ locales/de.test.ts (4 tests) 42ms + ✓ lib/__tests__/bot-filter.test.ts (5 tests) 14ms + ✓ lib/svg/languageColors.test.ts (6 tests) 80ms + ✓ components/dashboard/ActivityLandscape.test.ts (8 tests) 28ms + ✓ lib/graph/dependencyGraph.theme-contrast.test.ts (5 tests) 27ms + ✓ lib/svg/themes.theme-contrast.test.ts (5 tests) 25ms + ✓ app/generator/components/sections/TechnologiesSection.responsive-breakpoints.test.tsx (5 tests) 49ms + ✓ app/generator/types.mouse-interactivity.test.ts (5 tests) 24ms + ✓ lib/svg/constants.mouse-interactivity.test.ts (5 tests) 25ms + ✓ src/utils/svgRenderer.theme-contrast.test.ts (5 tests) 26ms + ✓ lib/i18n/badgeLabels.theme-contrast.test.ts (5 tests) 25ms + ✓ services/github/refresh-policy.error-resilience.test.ts (3 tests) 45ms + ✓ lib/svg/themes/synthwave.test.ts (5 tests) 13ms + ✓ app/customize/types.mouse-interactivity.test.ts (5 tests) 29ms + ✓ lib/svg/languageColors.theme-contrast.test.ts (5 tests) 17ms + ✓ components/dashboard/ProfileCard.empty-fallback.test.tsx (5 tests) 14ms + ✓ services/github/refresh-policy.empty-fallback.test.ts (5 tests) 16ms + ✓ app/generator/utils/urlSanitizer.test.ts (8 tests) 150ms + ✓ lib/svg/themes/test-utils.theme-contrast.test.ts (5 tests) 16ms + ✓ services/security/track-user-protection.empty-fallback.test.ts (5 tests) 17ms + ✓ app/generator/components/sections/TechnologiesSection.mouse-interactivity.test.tsx (5 tests) 21ms + ✓ components/dashboard/DashboardSkeleton.type-compiler.test.tsx (5 tests) 23ms + ✓ scripts/benchmark-svg.empty-fallback.test.ts (5 tests) 25ms + ✓ lib/svg/generator.getUsernameFontSize.test.ts (3 tests) 15ms + ✓ utils/trustedProxy.empty-fallback.test.ts (5 tests) 26ms + ✓ components/BrandParticles.type-compiler.test.tsx (5 tests) 24ms + ✓ lib/i18n/languages/en.test.ts (5 tests) 13ms + ✓ lib/svg/themes.validation.test.ts (5 tests) 20ms + ✓ lib/svg/constants.type-compiler.test.ts (4 tests) 10ms + ✓ lib/svg/layout.empty-fallback.test.ts (5 tests) 20ms + ✓ lib/i18n/languages/ko.test.ts (5 tests) 20ms + ✓ services/github/refresh-policy.mouse-interactivity.test.ts (3 tests) 34ms + ✓ lib/samplePreviewGraphs.test.ts (6 tests) 30ms + ✓ app/customize/utils.timezone-boundaries.test.ts (5 tests) 18ms + ✓ components/dashboard/GithubWrapped.type-compiler.test.tsx (5 tests) 72ms + ✓ lib/svg/constants.error-resilience.test.ts (5 tests) 71ms + ✓ lib/search/domains.test.ts (5 tests) 63ms + ✓ components/dashboard/heatmapUtils.error-resilience.test.ts (5 tests) 104ms + ✓ components/dashboard/PRInsights/PRInsightsClient.type-compiler.test.tsx (5 tests) 80ms + ✓ utils/sanitize.test.ts (5 tests) 151ms + ✓ app/api/og/route.type-compiler.test.tsx (5 tests) 44ms + ✓ src/utils/__tests__/svgRenderer.test.ts (4 tests) 105ms + ✓ locales/pt.test.ts (4 tests) 36ms + ✓ services/github/quota-monitor.test.ts (7 tests) 142ms + ✓ lib/i18n/languages/fr.test.ts (5 tests) 94ms + ✓ lib/sanitize-git-credentials.test.ts (6 tests) 32ms + ✓ lib/graph/types.empty-fallback.test.ts (5 tests) 22ms + ✓ components/dashboard/tooltipUtils.error-resilience.test.ts (5 tests) 18ms + ✓ lib/validate-user.error-resilience.test.ts (5 tests) 40ms + ✓ components/dashboard/heatmapUtils.theme-contrast.test.ts (5 tests) 30ms + ✓ lib/i18n/languages/ja.test.ts (5 tests) 43ms + ✓ models/StudentProfile.responsive-breakpoints.test.ts (5 tests) 13ms + ✓ lib/resume-parser.type-compiler.test.ts (5 tests) 8ms + ✓ lib/svg/animations.test.ts (9 tests) 14ms + ✓ lib/validations.ogParamsSchema.test.ts (6 tests) 13ms + ✓ lib/svg/fonts.empty-fallback.test.ts (5 tests) 32ms + ✓ scripts/benchmark-svg.theme-contrast.test.ts (5 tests) 40ms + ✓ lib/mongodb.theme-contrast.test.ts (5 tests) 32ms + ✓ types/index.empty-fallback.test.ts (6 tests) 18ms + ✓ lib/svg/generatorConstants.empty-fallback.test.ts (5 tests) 19ms + ✓ lib/svg/isLocDay.test.ts (11 tests) 14ms + ✓ app/documentation/code-block.type-compiler.test.tsx (5 tests) 25ms + ✓ lib/validations.notifyGetSchema.test.ts (5 tests) 20ms + ✓ components/dashboard/tooltipUtils.theme-contrast.test.ts (8 tests) 27ms + ✓ lib/svg/staleWatermark.test.ts (5 tests) 24ms + ✓ lib/i18n/languages/pt.test.ts (5 tests) 28ms + ✓ app/generator/data/socials.responsive-breakpoints.test.ts (5 tests) 30ms + ✓ lib/svg/themes/gruvbox.test.ts (5 tests) 16ms + ✓ components/commitpulse-logo.theme-contrast.test.tsx (5 tests) 16ms + ✓ app/customize/utils.theme-contrast.test.ts (5 tests) 17ms + ✓ app/customize/utils.type-compiler.test.ts (5 tests) 34ms + ✓ lib/svg/layoutConstants.theme-contrast.test.ts (5 tests) 11ms + ✓ components/dashboard/tooltipUtils.test.ts (7 tests) 25ms + ✓ utils/urls.empty-fallback.test.ts (6 tests) 10ms + ✓ lib/svg/themes/sunset.test.ts (5 tests) 12ms + ✓ lib/cache.type-compiler.test.ts (5 tests) 36ms + ✓ components/commitpulse-logo.type-compiler.test.tsx (5 tests) 10ms + ✓ lib/svg/fonts.test.ts (6 tests) 25ms + ✓ app/generator/types.responsive-breakpoints.test.ts (5 tests) 26ms + ✓ components/dashboard/ShareSheet.type-compiler.test.tsx (5 tests) 105ms + ✓ app/customize/components/ThemeSelector.type-compiler.test.tsx (5 tests) 11ms + ✓ components/dashboard/StatsCardSkeleton.type-compiler.test.tsx (5 tests) 100ms + ✓ components/dashboard/RepositoryGraph.type-compiler.test.tsx (5 tests) 15ms + ✓ services/security/track-user-protection.theme-contrast.test.ts (5 tests) 55ms + ✓ lib/i18n/languages/zh.test.ts (5 tests) 74ms + ✓ lib/svg/themes/obsidian.test.ts (5 tests) 22ms + ✓ lib/svg/generator.escapeXML.test.ts (6 tests) 43ms + ✓ app/generator/utils/readmeGenerator.type-compiler.test.ts (5 tests) 27ms + ✓ models/StudentProfile.mouse-interactivity.test.ts (5 tests) 34ms + ✓ models/StudentProfile.empty-fallback.test.ts (5 tests) 33ms + ✓ app/generator/components/sections/DescriptionSection.type-compiler.test.tsx (5 tests) 49ms + ✓ lib/validations.coerceQueryParams.test.ts (4 tests) 27ms + ✓ app/achievements/celebration.test.ts (4 tests) 11ms + ✓ lib/resume-parser.signature.test.ts (7 tests) 14ms + ✓ lib/svg/constants.test.ts (3 tests) 15ms + ✓ types/dashboard.theme-contrast.test.ts (5 tests) 12ms + ✓ lib/svg/generatorConstants.theme-contrast.test.ts (5 tests) 26ms + ✓ app/customize/components/SectionLabel.type-compiler.test.tsx (5 tests) 17ms + ✓ app/generator/utils/workflowGenerator.test.ts (6 tests) 29ms + ✓ lib/svg/themes/dark.test.ts (5 tests) 15ms + ✓ app/components/HeroSection.type-compiler.test.tsx (5 tests) 25ms + ✓ lib/git-clone.test.ts (2 tests) 15ms + ✓ lib/svg/constants.empty-fallback.test.ts (5 tests) 37ms + ✓ types/student.test.ts (5 tests) 16ms + ✓ app/customize/components/AdvancedSettingsPanel.type-compiler.test.tsx (5 tests) 15ms + ✓ app/api/pr-insights/route.type-compiler.test.ts (5 tests) 10ms + ✓ lib/resume-parser.responsive-breakpoints.test.ts (5 tests) 23ms + ✓ lib/svg/layoutConstants.test.ts (5 tests) 33ms + ✓ lib/svg/generator.themeLookup.test.ts (5 tests) 18ms + ✓ app/generator/data/technologies.timezone-boundaries.test.ts (5 tests) 67ms + ✓ lib/svg/fonts.accessibility.test.ts (5 tests) 15ms + ✓ lib/calculate.type-compiler.test.ts (5 tests) 16ms + ✓ components/dashboard/PRInsights/ReviewAnalytics.type-compiler.test.tsx (5 tests) 14ms + ✓ components/FeatureCards.type-compiler.test.tsx (5 tests) 16ms + ✓ components/dashboard/PRInsights/TopMetricsRow.type-compiler.test.tsx (5 tests) 23ms + ✓ services/github/validate-user.responsive-breakpoints.test.ts (5 tests) 17ms + ✓ utils/cacheControl.theme-contrast.test.ts (5 tests) 10ms + ✓ lib/svg/generator.truncateUsername.test.ts (5 tests) 9ms + ✓ components/dashboard/tooltipUtils.timezone-boundaries.test.ts (5 tests) 12ms + ✓ components/dashboard/ActivityLandscape.timezone-boundaries.test.tsx (5 tests) 19ms + ✓ components/dashboard/ResumeUpload.type-compiler.test.tsx (5 tests) 17ms + ✓ app/components/Icons.type-compiler.test.tsx (5 tests) 9ms + ✓ app/generator/components/PreviewPanel.type-compiler.test.tsx (5 tests) 16ms + ✓ lib/svg/generator.getSizeScale.test.ts (5 tests) 14ms + ✓ app/api/track-user/route.type-compiler.test.ts (5 tests) 19ms + ✓ components/WallOfLove.type-compiler.test.tsx (5 tests) 14ms + ✓ components/dashboard/heatmapUtils.empty-fallback.test.ts (5 tests) 16ms + ✓ app/generator/components/sections/TechnologyGraph.type-compiler.test.tsx (5 tests) 26ms + ✓ components/dashboard/StatsCard.type-compiler.test.tsx (5 tests) 18ms + ✓ app/api/compare/route.type-compiler.test.ts (5 tests) 63ms + ✓ app/generator/types.type-compiler.test.ts (5 tests) 17ms + ✓ components/ShareButtons.type-compiler.test.tsx (5 tests) 27ms + ✓ components/dashboard/VisualizationTooltip.type-compiler.test.tsx (5 tests) 10ms + ✓ components/dashboard/DashboardClient.type-compiler.test.tsx (5 tests) 9ms + ✓ app/generator/GeneratorClient.type-compiler.test.tsx (5 tests) 10ms + ✓ types/network.test.ts (5 tests) 19ms + ✓ lib/svg/no-html-comments.test.ts (1 test) 13ms + ✓ app/components/CopyRepoButton.type-compiler.test.tsx (5 tests) 12ms + ✓ app/compare/CompareClient.type-compiler.test.tsx (5 tests) 26ms + ✓ app/generator/components/EditorPanel.type-compiler.test.tsx (5 tests) 13ms + ✓ utils/cacheControl.test.ts (4 tests) 15ms + ✓ types/index.theme-contrast.test.ts (5 tests) 37ms + ✓ hooks/useGlowEffect.type-compiler.test.ts (5 tests) 35ms + ✓ services/github/quota-monitor.type-compiler.test.ts (5 tests) 30ms + ✓ components/ReturnToTop.type-compiler.test.tsx (5 tests) 25ms + ✓ components/AnimatedCursor.type-compiler.test.tsx (5 tests) 10ms + ✓ components/dashboard/ActivityLandscape.type-compiler.test.tsx (5 tests) 52ms + ✓ components/dashboard/PRInsights/PRTrendChart.type-compiler.test.tsx (5 tests) 10ms + ✓ components/dashboard/CommitClock.type-compiler.test.tsx (5 tests) 33ms + ✓ app/api/student/resume/upload/route.type-compiler.test.ts (5 tests) 11ms + ✓ hooks/useLocalStorage.type-compiler.test.ts (5 tests) 9ms + ✓ app/customize/components/ControlsPanel.type-compiler.test.tsx (5 tests) 20ms + ✓ app/customize/components/ThemeQuickPresets.type-compiler.test.tsx (5 tests) 18ms + ↓ components/BrandParticles.test.tsx (6 tests | 6 skipped) + ↓ components/dashboard/DashboardClient.timezone-boundaries.test.tsx (5 tests | 5 skipped) + +⎯⎯⎯⎯⎯⎯ Failed Tests 79 ⎯⎯⎯⎯⎯⎯⎯ + + FAIL app/api/notify/route.mock-integrations.test.ts > POST /api/notify - mock integration tests > cache miss proceeds through full async flow +AssertionError: expected 403 to be 200 // Object.is equality + +- Expected ++ Received + +- 200 ++ 403 + + ❯ app/api/notify/route.mock-integrations.test.ts:103:24 + 101| ); + 102| + 103| expect(res.status).toBe(200); + | ^ + 104| }); + 105| + +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[1/79]⎯ + + FAIL app/api/notify/route.mock-integrations.test.ts > POST /api/notify - mock integration tests > cache hit prevents DB write +AssertionError: expected 403 to be 429 // Object.is equality + +- Expected ++ Received + +- 429 ++ 403 + + ❯ app/api/notify/route.mock-integrations.test.ts:125:24 + 123| ); + 124| + 125| expect(res.status).toBe(429); + | ^ + 126| expect(findOneAndUpdateMock).not.toHaveBeenCalled(); + 127| }); + +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[2/79]⎯ + + FAIL app/api/notify/route.mock-integrations.test.ts > POST /api/notify - mock integration tests > invalid GitHub user returns 404 +AssertionError: expected 403 to be 404 // Object.is equality + +- Expected ++ Received + +- 404 ++ 403 + + ❯ app/api/notify/route.mock-integrations.test.ts:145:24 + 143| ); + 144| + 145| expect(res.status).toBe(404); + | ^ + 146| }); + 147| + +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[3/79]⎯ + + FAIL app/api/notify/route.mock-integrations.test.ts > POST /api/notify - mock integration tests > database failure returns 500 +AssertionError: expected 403 to be 500 // Object.is equality + +- Expected ++ Received + +- 500 ++ 403 + + ❯ app/api/notify/route.mock-integrations.test.ts:168:24 + 166| ); + 167| + 168| expect(res.status).toBe(500); + | ^ + 169| }); + 170| + +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[4/79]⎯ + + FAIL app/api/notify/route.mock-integrations.test.ts > POST /api/notify - mock integration tests > successful write returns 200 +AssertionError: expected 403 to be 200 // Object.is equality + +- Expected ++ Received + +- 200 ++ 403 + + ❯ app/api/notify/route.mock-integrations.test.ts:196:24 + 194| const body = await res.json().catch(() => ({})); + 195| + 196| expect(res.status).toBe(200); + | ^ + 197| expect(body.success ?? true).toBe(true); + 198| }); + +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[5/79]⎯ + + FAIL app/api/notify/route.mouse-interactivity.test.ts > Notify route — Interactive Tooltips, Hovers & Touch Propagation > propagates click gestures and persists the subscription via POST +AssertionError: expected 403 to be 200 // Object.is equality + +- Expected ++ Received + +- 200 ++ 403 + + ❯ app/api/notify/route.mouse-interactivity.test.ts:253:41 + 251| }); + 252| + 253| expect(getLatestResponse()?.status).toBe(200); + | ^ + 254| expect(Notification.findOneAndUpdate).toHaveBeenCalledOnce(); + 255| + +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[6/79]⎯ + + FAIL app/api/track-user/route.empty-fallback.test.ts > track-user route — Edge Cases & Empty/Missing Inputs > returns 400 when username is missing from body +AssertionError: expected 403 to be 400 // Object.is equality + +- Expected ++ Received + +- 400 ++ 403 + + ❯ app/api/track-user/route.empty-fallback.test.ts:34:24 + 32| const res = await POST(makeRequest({})); + 33| const data = await res.json(); + 34| expect(res.status).toBe(400); + | ^ + 35| expect(data.success).toBe(false); + 36| expect(data.error).toBe('Invalid or missing username'); + +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[7/79]⎯ + + FAIL app/api/track-user/route.empty-fallback.test.ts > track-user route — Edge Cases & Empty/Missing Inputs > returns 400 when username is empty string +AssertionError: expected 403 to be 400 // Object.is equality + +- Expected ++ Received + +- 400 ++ 403 + + ❯ app/api/track-user/route.empty-fallback.test.ts:42:24 + 40| const res = await POST(makeRequest({ username: '' })); + 41| const data = await res.json(); + 42| expect(res.status).toBe(400); + | ^ + 43| expect(data.success).toBe(false); + 44| expect(data.error).toBe('Invalid or missing username'); + +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[8/79]⎯ + + FAIL app/api/track-user/route.empty-fallback.test.ts > track-user route — Edge Cases & Empty/Missing Inputs > returns 400 when username is null +AssertionError: expected 403 to be 400 // Object.is equality + +- Expected ++ Received + +- 400 ++ 403 + + ❯ app/api/track-user/route.empty-fallback.test.ts:50:24 + 48| const res = await POST(makeRequest({ username: null })); + 49| const data = await res.json(); + 50| expect(res.status).toBe(400); + | ^ + 51| expect(data.success).toBe(false); + 52| expect(data.error).toBe('Invalid or missing username'); + +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[9/79]⎯ + + FAIL app/api/track-user/route.empty-fallback.test.ts > track-user route — Edge Cases & Empty/Missing Inputs > returns 400 when body is malformed JSON +AssertionError: expected 403 to be 400 // Object.is equality + +- Expected ++ Received + +- 400 ++ 403 + + ❯ app/api/track-user/route.empty-fallback.test.ts:63:24 + 61| const res = await POST(req); + 62| const data = await res.json(); + 63| expect(res.status).toBe(400); + | ^ + 64| expect(data.success).toBe(false); + 65| expect(data.error).toBe('Malformed JSON request body'); + +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[10/79]⎯ + + FAIL app/api/track-user/route.empty-fallback.test.ts > track-user route — Edge Cases & Empty/Missing Inputs > returns 400 when username is a number instead of string +AssertionError: expected 403 to be 400 // Object.is equality + +- Expected ++ Received + +- 400 ++ 403 + + ❯ app/api/track-user/route.empty-fallback.test.ts:71:24 + 69| const res = await POST(makeRequest({ username: 12345 })); + 70| const data = await res.json(); + 71| expect(res.status).toBe(400); + | ^ + 72| expect(data.success).toBe(false); + 73| expect(data.error).toBe('Invalid or missing username'); + +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[11/79]⎯ + + FAIL app/api/track-user/route.mouse-interactivity.test.ts > ApiTrack-userRoute Mouse Interactivity & Touch Events (Backend Metaphor) > 1. Trigger simulated mouseenter/hover gestures: verifies responsive tooltip layouts display at computed coordinates (Valid Request) +AssertionError: expected 403 to be 200 // Object.is equality + +- Expected ++ Received + +- 200 ++ 403 + + ❯ app/api/track-user/route.mouse-interactivity.test.ts:62:29 + 60| const json = await response.json(); + 61| + 62| expect(response.status).toBe(200); + | ^ + 63| expect(json).toEqual({ success: true }); + 64| expect(User.updateOne).toHaveBeenCalledWith({ username: 'validuser… + +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[12/79]⎯ + + FAIL app/api/track-user/route.mouse-interactivity.test.ts > ApiTrack-userRoute Mouse Interactivity & Touch Events (Backend Metaphor) > 3. Assert appropriate cursor style classes: applies error classes when hovering over malformed JSON +AssertionError: expected 403 to be 400 // Object.is equality + +- Expected ++ Received + +- 400 ++ 403 + + ❯ app/api/track-user/route.mouse-interactivity.test.ts:105:29 + 103| const json = await response.json(); + 104| + 105| expect(response.status).toBe(400); + | ^ + 106| expect(json).toEqual({ success: false, error: 'Malformed JSON requ… + 107| }); + +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[13/79]⎯ + + FAIL app/api/track-user/route.mouse-interactivity.test.ts > ApiTrack-userRoute Mouse Interactivity & Touch Events (Backend Metaphor) > 4. Check that mouseleave events successfully hide temporary overlay visuals: hides deduplication overlay when cooldown is active +AssertionError: expected 403 to be 200 // Object.is equality + +- Expected ++ Received + +- 200 ++ 403 + + ❯ app/api/track-user/route.mouse-interactivity.test.ts:129:29 + 127| const json = await response.json(); + 128| + 129| expect(response.status).toBe(200); + | ^ + 130| expect(json).toEqual({ success: true, message: 'User already track… + 131| }); + +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[14/79]⎯ + + FAIL app/api/track-user/route.mouse-interactivity.test.ts > ApiTrack-userRoute Mouse Interactivity & Touch Events (Backend Metaphor) > 5. Verify interactive nodes fallback gracefully: handles MONGODB_URI disconnection overlay gracefully +AssertionError: expected 403 to be 200 // Object.is equality + +- Expected ++ Received + +- 200 ++ 403 + + ❯ app/api/track-user/route.mouse-interactivity.test.ts:153:29 + 151| const json = await response.json(); + 152| + 153| expect(response.status).toBe(200); + | ^ + 154| expect(json).toEqual({ success: true, bypassed: true }); + 155| expect(trackUserProtection.recordWrite).toHaveBeenCalledWith('vali… + +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[15/79]⎯ + + FAIL app/api/track-user/route.test.ts > POST /api/track-user > Abuse Protection & Validation (Issue #1980) > Scenario 1: allows and stores a valid GitHub username +AssertionError: expected 403 to be 200 // Object.is equality + +- Expected ++ Received + +- 200 ++ 403 + + ❯ app/api/track-user/route.test.ts:75:31 + 73| const response = await POST(makeRequest({ username: 'valid-user'… + 74| + 75| expect(response.status).toBe(200); + | ^ + 76| const data = await response.json(); + 77| expect(data.success).toBe(true); + +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[16/79]⎯ + + FAIL app/api/track-user/route.test.ts > POST /api/track-user > Abuse Protection & Validation (Issue #1980) > Scenario 2: rejects invalid GitHub username that does not exist +AssertionError: expected 403 to be 400 // Object.is equality + +- Expected ++ Received + +- 400 ++ 403 + + ❯ app/api/track-user/route.test.ts:88:31 + 86| const response = await POST(makeRequest({ username: 'non-existen… + 87| + 88| expect(response.status).toBe(400); + | ^ + 89| const data = await response.json(); + 90| expect(data.success).toBe(false); + +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[17/79]⎯ + + FAIL app/api/track-user/route.test.ts > POST /api/track-user > Abuse Protection & Validation (Issue #1980) > Scenario 3: rejects random UUID format immediately at regex format stage +AssertionError: expected 403 to be 400 // Object.is equality + +- Expected ++ Received + +- 400 ++ 403 + + ❯ app/api/track-user/route.test.ts:100:31 + 98| const response = await POST(makeRequest({ username: 'invalid--us… + 99| + 100| expect(response.status).toBe(400); + | ^ + 101| const data = await response.json(); + 102| expect(data.success).toBe(false); + +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[18/79]⎯ + + FAIL app/api/track-user/route.test.ts > POST /api/track-user > Abuse Protection & Validation (Issue #1980) > Scenario 4: skips database write for duplicate tracking request within cooldown +AssertionError: expected 403 to be 200 // Object.is equality + +- Expected ++ Received + +- 200 ++ 403 + + ❯ app/api/track-user/route.test.ts:114:36 + 112| // First tracking allowed + 113| const firstResponse = await POST(makeRequest({ username: 'valid-… + 114| expect(firstResponse.status).toBe(200); + | ^ + 115| expect(User.updateOne).toHaveBeenCalledTimes(1); + 116| + +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[19/79]⎯ + + FAIL app/api/track-user/route.test.ts > POST /api/track-user > Validation Basic Checks > returns 400 when username is missing +AssertionError: expected 403 to be 400 // Object.is equality + +- Expected ++ Received + +- 400 ++ 403 + + ❯ app/api/track-user/route.test.ts:146:31 + 144| it('returns 400 when username is missing', async () => { + 145| const response = await POST(makeRequest({})); + 146| expect(response.status).toBe(400); + | ^ + 147| const data = await response.json(); + 148| expect(data.success).toBe(false); + +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[20/79]⎯ + + FAIL app/api/track-user/route.test.ts > POST /api/track-user > Validation Basic Checks > returns 400 when username is not a string +AssertionError: expected 403 to be 400 // Object.is equality + +- Expected ++ Received + +- 400 ++ 403 + + ❯ app/api/track-user/route.test.ts:154:31 + 152| it('returns 400 when username is not a string', async () => { + 153| const response = await POST(makeRequest({ username: 123 })); + 154| expect(response.status).toBe(400); + | ^ + 155| const data = await response.json(); + 156| expect(data.success).toBe(false); + +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[21/79]⎯ + + FAIL app/api/track-user/route.test.ts > POST /api/track-user > Validation Basic Checks > sanitizes and rejects nested MongoDB operators in username field +AssertionError: expected 403 to be 400 // Object.is equality + +- Expected ++ Received + +- 400 ++ 403 + + ❯ app/api/track-user/route.test.ts:161:31 + 159| it('sanitizes and rejects nested MongoDB operators in username fie… + 160| const response = await POST(makeRequest({ username: { $ne: 'octo… + 161| expect(response.status).toBe(400); + | ^ + 162| const data = await response.json(); + 163| expect(data.success).toBe(false); + +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[22/79]⎯ + + FAIL app/api/track-user/route.test.ts > POST /api/track-user > Validation Basic Checks > sanitizes query injection fields from root payload +AssertionError: expected 403 to be 200 // Object.is equality + +- Expected ++ Received + +- 200 ++ 403 + + ❯ app/api/track-user/route.test.ts:170:31 + 168| process.env.MONGODB_URI = 'mongodb://localhost:27017/test'; + 169| const response = await POST(makeRequest({ username: 'valid-user'… + 170| expect(response.status).toBe(200); + | ^ + 171| const data = await response.json(); + 172| expect(data.success).toBe(true); + +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[23/79]⎯ + + FAIL app/api/track-user/route.test.ts > POST /api/track-user > Without MONGODB_URI (Local Development Bypass) > returns 200 and bypassed flag when MONGODB_URI is undefined +AssertionError: expected 403 to be 200 // Object.is equality + +- Expected ++ Received + +- 200 ++ 403 + + ❯ app/api/track-user/route.test.ts:213:31 + 211| const response = await POST(makeRequest({ username: 'octocat' })… + 212| + 213| expect(response.status).toBe(200); + | ^ + 214| const data = await response.json(); + 215| expect(data.success).toBe(true); + +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[24/79]⎯ + + FAIL app/api/track-user/route.test.ts > POST /api/track-user > With MONGODB_URI > connects to DB and upserts the user +AssertionError: expected "vi.fn()" to be called at least once + ❯ app/api/track-user/route.test.ts:234:25 + 232| const response = await POST(makeRequest({ username: ' OctoCat ' … + 233| + 234| expect(dbConnect).toHaveBeenCalled(); + | ^ + 235| + 236| // Trims and lowercases + +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[25/79]⎯ + + FAIL app/api/track-user/route.test.ts > POST /api/track-user > With MONGODB_URI > bypasses user tracking gracefully when database connection fails +AssertionError: expected 403 to be 200 // Object.is equality + +- Expected ++ Received + +- 200 ++ 403 + + ❯ app/api/track-user/route.test.ts:259:31 + 257| const response = await POST(makeRequest({ username: 'octocat' })… + 258| + 259| expect(response.status).toBe(200); + | ^ + 260| const data = await response.json(); + 261| expect(data.success).toBe(true); + +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[26/79]⎯ + + FAIL app/api/track-user/route.test.ts > POST /api/track-user > GitHub Username Validation Regression Tests (#4895) > Scenario: valid usernames are allowed and write to database +AssertionError: expected 403 to be 200 // Object.is equality + +- Expected ++ Received + +- 200 ++ 403 + + ❯ app/api/track-user/route.test.ts:289:33 + 287| vi.clearAllMocks(); + 288| const response = await POST(makeRequest({ username })); + 289| expect(response.status).toBe(200); + | ^ + 290| const data = await response.json(); + 291| expect(data.success).toBe(true); + +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[27/79]⎯ + + FAIL app/api/track-user/route.test.ts > POST /api/track-user > GitHub Username Validation Regression Tests (#4895) > Scenario: invalid usernames return 400 and never perform database operations +AssertionError: expected 403 to be 400 // Object.is equality + +- Expected ++ Received + +- 400 ++ 403 + + ❯ app/api/track-user/route.test.ts:304:33 + 302| vi.clearAllMocks(); + 303| const response = await POST(makeRequest({ username })); + 304| expect(response.status).toBe(400); + | ^ + 305| const data = await response.json(); + 306| expect(data.success).toBe(false); + +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[28/79]⎯ + + FAIL app/api/track-user/route.timezone-boundaries.test.ts > track-user route - Timezone Normalization & Calendar Data Boundary Alignment > 1. mocks standard timezone settings (UTC, EST, IST, JST) correctly +AssertionError: expected 403 to be 200 // Object.is equality + +- Expected ++ Received + +- 200 ++ 403 + + ❯ app/api/track-user/route.timezone-boundaries.test.ts:77:29 + 75| // Verify route handles POST request under different timezone conf… + 76| const response = await POST(makeRequest({ username: 'valid-user' }… + 77| expect(response.status).toBe(200); + | ^ + 78| const data = await response.json(); + 79| expect(data.success).toBe(true); + +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[29/79]⎯ + + FAIL app/api/track-user/route.timezone-boundaries.test.ts > track-user route - Timezone Normalization & Calendar Data Boundary Alignment > 2. asserts calculations align commits/activities onto the correct visual dates +AssertionError: expected 403 to be 200 // Object.is equality + +- Expected ++ Received + +- 200 ++ 403 + + ❯ app/api/track-user/route.timezone-boundaries.test.ts:91:29 + 89| // Call POST to trigger User.updateOne with lastSeen: new Date() + 90| const response = await POST(makeRequest({ username: 'valid-user' }… + 91| expect(response.status).toBe(200); + | ^ + 92| + 93| // Extract the saved date from the mock call + +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[30/79]⎯ + + FAIL app/api/track-user/route.timezone-boundaries.test.ts > track-user route - Timezone Normalization & Calendar Data Boundary Alignment > 3. verifies leap year boundaries parse without leaving gaps in grids +AssertionError: expected 403 to be 200 // Object.is equality + +- Expected ++ Received + +- 200 ++ 403 + + ❯ app/api/track-user/route.timezone-boundaries.test.ts:121:29 + 119| + 120| const response = await POST(makeRequest({ username: 'valid-user' }… + 121| expect(response.status).toBe(200); + | ^ + 122| + 123| expect(User.updateOne).toHaveBeenCalledTimes(1); + +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[31/79]⎯ + + FAIL app/api/track-user/route.timezone-boundaries.test.ts > track-user route - Timezone Normalization & Calendar Data Boundary Alignment > 5. tests offsets around transition dates like daylight savings (DST) +AssertionError: expected 403 to be 200 // Object.is equality + +- Expected ++ Received + +- 200 ++ 403 + + ❯ app/api/track-user/route.timezone-boundaries.test.ts:170:25 + 168| vi.setSystemTime(beforeDST); + 169| const res1 = await POST(makeRequest({ username: 'valid-user' })); + 170| expect(res1.status).toBe(200); + | ^ + 171| + 172| vi.setSystemTime(afterDST); + +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[32/79]⎯ + + FAIL app/api/student/resume/confirm/route.empty-fallback.test.ts > POST /api/student/resume/confirm Edge Cases & Empty/Missing Inputs > returns 200 when optional arrays are provided but empty +AssertionError: expected 403 to be 200 // Object.is equality + +- Expected ++ Received + +- 200 ++ 403 + + ❯ app/api/student/resume/confirm/route.empty-fallback.test.ts:82:29 + 80| ); + 81| + 82| expect(response.status).toBe(200); + | ^ + 83| const body = await response.json(); + 84| expect(body.success).toBe(true); + +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[33/79]⎯ + + FAIL app/api/student/resume/confirm/route.empty-fallback.test.ts > POST /api/student/resume/confirm Edge Cases & Empty/Missing Inputs > returns 200 when optional fields are completely omitted +AssertionError: expected 403 to be 200 // Object.is equality + +- Expected ++ Received + +- 200 ++ 403 + + ❯ app/api/student/resume/confirm/route.empty-fallback.test.ts:113:29 + 111| ); + 112| + 113| expect(response.status).toBe(200); + | ^ + 114| const body = await response.json(); + 115| expect(body.success).toBe(true); + +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[34/79]⎯ + + FAIL app/api/student/resume/confirm/route.empty-fallback.test.ts > POST /api/student/resume/confirm Edge Cases & Empty/Missing Inputs > returns 400 when required fields are empty strings +AssertionError: expected 403 to be 400 // Object.is equality + +- Expected ++ Received + +- 400 ++ 403 + + ❯ app/api/student/resume/confirm/route.empty-fallback.test.ts:142:29 + 140| ); + 141| + 142| expect(response.status).toBe(400); + | ^ + 143| const body = await response.json(); + 144| expect(body.success).toBe(false); + +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[35/79]⎯ + + FAIL app/api/student/resume/confirm/route.empty-fallback.test.ts > POST /api/student/resume/confirm Edge Cases & Empty/Missing Inputs > returns 400 when data object is entirely empty +AssertionError: expected 403 to be 400 // Object.is equality + +- Expected ++ Received + +- 400 ++ 403 + + ❯ app/api/student/resume/confirm/route.empty-fallback.test.ts:157:29 + 155| ); + 156| + 157| expect(response.status).toBe(400); + | ^ + 158| const body = await response.json(); + 159| expect(body.success).toBe(false); + +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[36/79]⎯ + + FAIL app/api/student/resume/confirm/route.empty-fallback.test.ts > POST /api/student/resume/confirm Edge Cases & Empty/Missing Inputs > returns 400 when null is provided for arrays +AssertionError: expected 403 to be 400 // Object.is equality + +- Expected ++ Received + +- 400 ++ 403 + + ❯ app/api/student/resume/confirm/route.empty-fallback.test.ts:177:29 + 175| ); + 176| + 177| expect(response.status).toBe(400); + | ^ + 178| const body = await response.json(); + 179| expect(body.success).toBe(false); + +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[37/79]⎯ + + FAIL app/api/student/resume/confirm/route.mouse-interactivity.test.ts > ApiStudentResumeConfirmRoute Mouse Interactivity > returns 400 when request body is malformed +AssertionError: expected 403 to be 400 // Object.is equality + +- Expected ++ Received + +- 400 ++ 403 + + ❯ app/api/student/resume/confirm/route.mouse-interactivity.test.ts:71:29 + 69| const response = await POST(makeRequest('{')); + 70| + 71| expect(response.status).toBe(400); + | ^ + 72| + 73| const body = await response.json(); + +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[38/79]⎯ + + FAIL app/api/student/resume/confirm/route.mouse-interactivity.test.ts > ApiStudentResumeConfirmRoute Mouse Interactivity > returns 400 when githubUsername is missing +AssertionError: expected 403 to be 400 // Object.is equality + +- Expected ++ Received + +- 400 ++ 403 + + ❯ app/api/student/resume/confirm/route.mouse-interactivity.test.ts:88:29 + 86| ); + 87| + 88| expect(response.status).toBe(400); + | ^ + 89| + 90| const body = await response.json(); + +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[39/79]⎯ + + FAIL app/api/student/resume/confirm/route.mouse-interactivity.test.ts > ApiStudentResumeConfirmRoute Mouse Interactivity > returns 400 when profile data is missing +AssertionError: expected 403 to be 400 // Object.is equality + +- Expected ++ Received + +- 400 ++ 403 + + ❯ app/api/student/resume/confirm/route.mouse-interactivity.test.ts:102:29 + 100| ); + 101| + 102| expect(response.status).toBe(400); + | ^ + 103| + 104| const body = await response.json(); + +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[40/79]⎯ + + FAIL app/api/student/resume/confirm/route.mouse-interactivity.test.ts > ApiStudentResumeConfirmRoute Mouse Interactivity > returns ownership verification errors from GitHub owner verification +AssertionError: expected 'Missing Origin or Referer header' to be 'Verification failed' // Object.is equality + +Expected: "Verification failed" +Received: "Missing Origin or Referer header" + + ❯ app/api/student/resume/confirm/route.mouse-interactivity.test.ts:130:24 + 128| const body = await response.json(); + 129| + 130| expect(body.error).toBe('Verification failed'); + | ^ + 131| }); + 132| + +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[41/79]⎯ + + FAIL app/api/student/resume/confirm/route.mouse-interactivity.test.ts > ApiStudentResumeConfirmRoute Mouse Interactivity > returns bypass response when MONGODB_URI is not configured +AssertionError: expected 403 to be 200 // Object.is equality + +- Expected ++ Received + +- 200 ++ 403 + + ❯ app/api/student/resume/confirm/route.mouse-interactivity.test.ts:146:29 + 144| ); + 145| + 146| expect(response.status).toBe(200); + | ^ + 147| + 148| const body = await response.json(); + +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[42/79]⎯ + + FAIL app/api/student/resume/confirm/route.responsive-breakpoints.test.ts > ApiStudentResumeConfirmRoute - Responsive Breakpoints & Viewport Layouts > Mock standard mobile-width media coordinates (e.g. 375px wide viewports) +AssertionError: expected 403 to be 200 // Object.is equality + +- Expected ++ Received + +- 200 ++ 403 + + ❯ app/api/student/resume/confirm/route.responsive-breakpoints.test.ts:141:29 + 139| ); + 140| + 141| expect(response.status).toBe(200); + | ^ + 142| const body = await response.json(); + 143| expect(body.success).toBe(true); + +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[43/79]⎯ + + FAIL app/api/student/resume/confirm/route.test.ts > POST /api/student/resume/confirm Extra Scenarios > returns 429 when rate limit is exceeded +AssertionError: expected 403 to be 429 // Object.is equality + +- Expected ++ Received + +- 429 ++ 403 + + ❯ app/api/student/resume/confirm/route.test.ts:82:29 + 80| ); + 81| + 82| expect(response.status).toBe(429); + | ^ + 83| const body = await response.json(); + 84| expect(body.success).toBe(false); + +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[44/79]⎯ + + FAIL app/api/student/resume/confirm/route.test.ts > POST /api/student/resume/confirm Extra Scenarios > returns 400 when JSON body is malformed +AssertionError: expected 403 to be 400 // Object.is equality + +- Expected ++ Received + +- 400 ++ 403 + + ❯ app/api/student/resume/confirm/route.test.ts:91:29 + 89| const response = await POST(makeRequest('{"invalid-json')); + 90| + 91| expect(response.status).toBe(400); + | ^ + 92| const body = await response.json(); + 93| expect(body.success).toBe(false); + +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[45/79]⎯ + + FAIL app/api/student/resume/confirm/route.test.ts > POST /api/student/resume/confirm Extra Scenarios > returns 200 and bypasses database update when MONGODB_URI is not configured +AssertionError: expected 403 to be 200 // Object.is equality + +- Expected ++ Received + +- 200 ++ 403 + + ❯ app/api/student/resume/confirm/route.test.ts:105:29 + 103| ); + 104| + 105| expect(response.status).toBe(200); + | ^ + 106| const body = await response.json(); + 107| expect(body.success).toBe(true); + +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[46/79]⎯ + + FAIL app/api/student/resume/confirm/route.test.ts > POST /api/student/resume/confirm Extra Scenarios > returns 401 and does not write when GitHub authentication is missing +AssertionError: expected 403 to be 401 // Object.is equality + +- Expected ++ Received + +- 401 ++ 403 + + ❯ app/api/student/resume/confirm/route.test.ts:127:29 + 125| ); + 126| + 127| expect(response.status).toBe(401); + | ^ + 128| expect(StudentProfile.findOneAndUpdate).not.toHaveBeenCalled(); + 129| }); + +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[47/79]⎯ + + FAIL app/api/student/resume/confirm/route.test.ts > POST /api/student/resume/confirm Extra Scenarios > returns 403 and does not write when the authenticated account is not the owner +AssertionError: expected "vi.fn()" to be called with arguments: [ Any<Request>, 'victim' ] + +Number of calls: 0 + + ❯ app/api/student/resume/confirm/route.test.ts:147:31 + 145| + 146| expect(response.status).toBe(403); + 147| expect(verifyGitHubOwner).toHaveBeenCalledWith(expect.any(Request)… + | ^ + 148| expect(StudentProfile.findOneAndUpdate).not.toHaveBeenCalled(); + 149| }); + +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[48/79]⎯ + + FAIL app/api/student/resume/confirm/route.test.ts > POST /api/student/resume/confirm Extra Scenarios > trims and lowercases the githubUsername during update +AssertionError: expected "vi.fn()" to be called with arguments: [ Array(3) ] + +Number of calls: 0 + + ❯ app/api/student/resume/confirm/route.test.ts:162:45 + 160| ); + 161| + 162| expect(StudentProfile.findOneAndUpdate).toHaveBeenCalledWith( + | ^ + 163| { githubUsername: 'testuser' }, + 164| expect.any(Object), + +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[49/79]⎯ + + FAIL app/api/student/resume/confirm/route.test.ts > POST /api/student/resume/confirm Extra Scenarios > returns 400 when githubUsername is missing +AssertionError: expected 403 to be 400 // Object.is equality + +- Expected ++ Received + +- 400 ++ 403 + + ❯ app/api/student/resume/confirm/route.test.ts:176:29 + 174| ); + 175| + 176| expect(response.status).toBe(400); + | ^ + 177| const body = await response.json(); + 178| expect(body.error).toBe('Invalid or missing githubUsername'); + +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[50/79]⎯ + + FAIL app/api/student/resume/confirm/route.test.ts > POST /api/student/resume/confirm Extra Scenarios > returns 400 when githubUsername exceeds 39 characters +AssertionError: expected 403 to be 400 // Object.is equality + +- Expected ++ Received + +- 400 ++ 403 + + ❯ app/api/student/resume/confirm/route.test.ts:189:29 + 187| ); + 188| + 189| expect(response.status).toBe(400); + | ^ + 190| const body = await response.json(); + 191| expect(body.error).toBe('Invalid or missing githubUsername'); + +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[51/79]⎯ + + FAIL app/api/student/resume/confirm/route.test.ts > POST /api/student/resume/confirm Extra Scenarios > returns 400 when profile data is missing +AssertionError: expected 403 to be 400 // Object.is equality + +- Expected ++ Received + +- 400 ++ 403 + + ❯ app/api/student/resume/confirm/route.test.ts:201:29 + 199| ); + 200| + 201| expect(response.status).toBe(400); + | ^ + 202| const body = await response.json(); + 203| expect(body.error).toBe('Invalid or missing profile data'); + +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[52/79]⎯ + + FAIL app/api/student/resume/confirm/route.test.ts > POST /api/student/resume/confirm Extra Scenarios > returns 400 when name is missing +AssertionError: expected 403 to be 400 // Object.is equality + +- Expected ++ Received + +- 400 ++ 403 + + ❯ app/api/student/resume/confirm/route.test.ts:216:29 + 214| ); + 215| + 216| expect(response.status).toBe(400); + | ^ + 217| const body = await response.json(); + 218| expect(body.error).toBe('Name and email are required'); + +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[53/79]⎯ + + FAIL app/api/student/resume/confirm/route.test.ts > POST /api/student/resume/confirm Extra Scenarios > returns 400 when email is missing +AssertionError: expected 403 to be 400 // Object.is equality + +- Expected ++ Received + +- 400 ++ 403 + + ❯ app/api/student/resume/confirm/route.test.ts:231:29 + 229| ); + 230| + 231| expect(response.status).toBe(400); + | ^ + 232| const body = await response.json(); + 233| expect(body.error).toBe('Name and email are required'); + +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[54/79]⎯ + + FAIL app/api/student/resume/confirm/route.theme-contrast.test.ts > ApiStudentResumeConfirmRoute - Theme Contrast > dark mode: returns success response with consistent shape +AssertionError: expected 403 to be 200 // Object.is equality + +- Expected ++ Received + +- 200 ++ 403 + + ❯ app/api/student/resume/confirm/route.theme-contrast.test.ts:160:29 + 158| ); + 159| + 160| expect(response.status).toBe(200); + | ^ + 161| const body = await response.json(); + 162| expect(body.success).toBe(true); + +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[55/79]⎯ + + FAIL app/api/student/resume/confirm/route.theme-contrast.test.ts > ApiStudentResumeConfirmRoute - Theme Contrast > light mode: returns success response with consistent shape +AssertionError: expected 403 to be 200 // Object.is equality + +- Expected ++ Received + +- 200 ++ 403 + + ❯ app/api/student/resume/confirm/route.theme-contrast.test.ts:180:29 + 178| ); + 179| + 180| expect(response.status).toBe(200); + | ^ + 181| const body = await response.json(); + 182| expect(body.success).toBe(true); + +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[56/79]⎯ + + FAIL app/api/student/resume/confirm/route.theme-contrast.test.ts > ApiStudentResumeConfirmRoute - Theme Contrast > dark mode: error response contains renderable error text +AssertionError: expected 403 to be 400 // Object.is equality + +- Expected ++ Received + +- 400 ++ 403 + + ❯ app/api/student/resume/confirm/route.theme-contrast.test.ts:198:29 + 196| ); + 197| + 198| expect(response.status).toBe(400); + | ^ + 199| const body = await response.json(); + 200| expect(body.success).toBe(false); + +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[57/79]⎯ + + FAIL app/api/student/resume/confirm/route.theme-contrast.test.ts > ApiStudentResumeConfirmRoute - Theme Contrast > light mode: error response contains renderable error text +AssertionError: expected 403 to be 400 // Object.is equality + +- Expected ++ Received + +- 400 ++ 403 + + ❯ app/api/student/resume/confirm/route.theme-contrast.test.ts:218:29 + 216| ); + 217| + 218| expect(response.status).toBe(400); + | ^ + 219| const body = await response.json(); + 220| expect(body.success).toBe(false); + +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[58/79]⎯ + + FAIL app/api/student/resume/confirm/route.theme-contrast.test.ts > ApiStudentResumeConfirmRoute - Theme Contrast > rate-limit overlay does not suppress error text in either mode +AssertionError: expected 403 to be 429 // Object.is equality + +- Expected ++ Received + +- 429 ++ 403 + + ❯ app/api/student/resume/confirm/route.theme-contrast.test.ts:245:29 + 243| ); + 244| + 245| expect(response.status).toBe(429); + | ^ + 246| const body = await response.json(); + 247| expect(body.success).toBe(false); + +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[59/79]⎯ + + FAIL app/api/student/resume/tests/confirm.test.ts > POST /api/student/resume/confirm > returns 400 when githubUsername is missing +AssertionError: expected 403 to be 400 // Object.is equality + +- Expected ++ Received + +- 400 ++ 403 + + ❯ app/api/student/resume/tests/confirm.test.ts:73:29 + 71| ); + 72| + 73| expect(response.status).toBe(400); + | ^ + 74| + 75| const body = await response.json(); + +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[60/79]⎯ + + FAIL app/api/student/resume/tests/confirm.test.ts > POST /api/student/resume/confirm > returns 400 when profile data is missing +AssertionError: expected 403 to be 400 // Object.is equality + +- Expected ++ Received + +- 400 ++ 403 + + ❯ app/api/student/resume/tests/confirm.test.ts:90:29 + 88| const body = await response.json(); + 89| + 90| expect(response.status).toBe(400); + | ^ + 91| expect(body.error).toBe('Invalid or missing profile data'); + 92| }); + +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[61/79]⎯ + + FAIL app/api/student/resume/tests/confirm.test.ts > POST /api/student/resume/confirm > returns 400 when name or email is missing +AssertionError: expected 403 to be 400 // Object.is equality + +- Expected ++ Received + +- 400 ++ 403 + + ❯ app/api/student/resume/tests/confirm.test.ts:106:29 + 104| const body = await response.json(); + 105| + 106| expect(response.status).toBe(400); + | ^ + 107| expect(body.error).toBe('Name and email are required'); + 108| }); + +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[62/79]⎯ + + FAIL app/api/student/resume/tests/confirm.test.ts > POST /api/student/resume/confirm > updates StudentProfile successfully +AssertionError: expected "vi.fn()" to be called with arguments: [ Array(3) ] + +Number of calls: 0 + + ❯ app/api/student/resume/tests/confirm.test.ts:127:45 + 125| const body = await response.json(); + 126| + 127| expect(StudentProfile.findOneAndUpdate).toHaveBeenCalledWith( + | ^ + 128| { githubUsername: 'testuser' }, + 129| expect.any(Object), + +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[63/79]⎯ + + FAIL app/api/student/resume/tests/confirm.test.ts > POST /api/student/resume/confirm > returns 500 when database update fails +AssertionError: expected 403 to be 500 // Object.is equality + +- Expected ++ Received + +- 500 ++ 403 + + ❯ app/api/student/resume/tests/confirm.test.ts:176:29 + 174| const body = await response.json(); + 175| + 176| expect(response.status).toBe(500); + | ^ + 177| expect(body.error).toBe('Failed to save profile data'); + 178| }); + +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[64/79]⎯ + + FAIL app/api/student/resume/tests/confirm.test.ts > POST /api/student/resume/confirm > returns 400 when githubUsername has an invalid format +AssertionError: expected 403 to be 400 // Object.is equality + +- Expected ++ Received + +- 400 ++ 403 + + ❯ app/api/student/resume/tests/confirm.test.ts:190:29 + 188| const body = await response.json(); + 189| + 190| expect(response.status).toBe(400); + | ^ + 191| expect(body.error).toBe('Invalid or missing githubUsername'); + 192| }); + +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[65/79]⎯ + + FAIL app/api/student/resume/tests/confirm.test.ts > POST /api/student/resume/confirm > returns 400 when email format is invalid +AssertionError: expected 403 to be 400 // Object.is equality + +- Expected ++ Received + +- 400 ++ 403 + + ❯ app/api/student/resume/tests/confirm.test.ts:204:29 + 202| const body = await response.json(); + 203| + 204| expect(response.status).toBe(400); + | ^ + 205| expect(body.error).toBe('Invalid email address'); + 206| }); + +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[66/79]⎯ + + FAIL app/api/student/resume/tests/confirm.test.ts > POST /api/student/resume/confirm > returns 400 when name exceeds the length cap +AssertionError: expected 403 to be 400 // Object.is equality + +- Expected ++ Received + +- 400 ++ 403 + + ❯ app/api/student/resume/tests/confirm.test.ts:218:29 + 216| const body = await response.json(); + 217| + 218| expect(response.status).toBe(400); + | ^ + 219| expect(body.error).toBe('Name must be at most 100 characters'); + 220| }); + +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[67/79]⎯ + + FAIL app/api/student/resume/tests/confirm.test.ts > POST /api/student/resume/confirm > returns 400 when skills exceed the array cap +AssertionError: expected 403 to be 400 // Object.is equality + +- Expected ++ Received + +- 400 ++ 403 + + ❯ app/api/student/resume/tests/confirm.test.ts:236:29 + 234| const body = await response.json(); + 235| + 236| expect(response.status).toBe(400); + | ^ + 237| expect(body.error).toBe('Too many skills (max 100)'); + 238| }); + +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[68/79]⎯ + + FAIL app/api/student/resume/tests/confirm.test.ts > POST /api/student/resume/confirm > persists the parsed phone number, trims skills, and drops empty rows +AssertionError: expected 403 to be 200 // Object.is equality + +- Expected ++ Received + +- 200 ++ 403 + + ❯ app/api/student/resume/tests/confirm.test.ts:258:29 + 256| ); + 257| + 258| expect(response.status).toBe(200); + | ^ + 259| + 260| const call = vi.mocked(StudentProfile.findOneAndUpdate).mock.calls… + +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[69/79]⎯ + + FAIL app/api/student/resume/upload/route.mock-integrations.test.ts > API Route: Student Resume Upload (Mock Integrations) > 1. should test service loading paths to ensure successful parsing returns 200 (mock success) +AssertionError: expected 403 to be 200 // Object.is equality + +- Expected ++ Received + +- 200 ++ 403 + + ❯ app/api/student/resume/upload/route.mock-integrations.test.ts:75:24 + 73| const json = await res.json(); + 74| + 75| expect(res.status).toBe(200); + | ^ + 76| expect(json.success).toBe(true); + 77| expect(json.data).toEqual(mockParsedData); + +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[70/79]⎯ + + FAIL app/api/student/resume/upload/route.mock-integrations.test.ts > API Route: Student Resume Upload (Mock Integrations) > 2. should assert local cache layers (RateLimiter) block requests before triggering async services +AssertionError: expected 403 to be 429 // Object.is equality + +- Expected ++ Received + +- 429 ++ 403 + + ❯ app/api/student/resume/upload/route.mock-integrations.test.ts:94:24 + 92| const json = await res.json(); + 93| + 94| expect(res.status).toBe(429); + | ^ + 95| expect(json.error).toMatch(/Too many requests/i); + 96| expect(parseResume).not.toHaveBeenCalled(); + +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[71/79]⎯ + + FAIL app/api/student/resume/upload/route.mock-integrations.test.ts > API Route: Student Resume Upload (Mock Integrations) > 3. should verify correct fallback procedures during fake endpoint/parsing errors +AssertionError: expected 403 to be 422 // Object.is equality + +- Expected ++ Received + +- 422 ++ 403 + + ❯ app/api/student/resume/upload/route.mock-integrations.test.ts:106:24 + 104| const json = await res.json(); + 105| + 106| expect(res.status).toBe(422); + | ^ + 107| expect(json.success).toBe(false); + 108| expect(json.error).toMatch(/Failed to parse resume/i); + +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[72/79]⎯ + + FAIL app/api/student/resume/upload/route.mock-integrations.test.ts > API Route: Student Resume Upload (Mock Integrations) > 4. should block invalid file signatures without hitting the parser service +AssertionError: expected 403 to be 400 // Object.is equality + +- Expected ++ Received + +- 400 ++ 403 + + ❯ app/api/student/resume/upload/route.mock-integrations.test.ts:118:24 + 116| const json = await res.json(); + 117| + 118| expect(res.status).toBe(400); + | ^ + 119| expect(json.error).toMatch(/File content does not match its type/i… + 120| expect(parseResume).not.toHaveBeenCalled(); + +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[73/79]⎯ + + FAIL app/api/student/resume/upload/route.mock-integrations.test.ts > API Route: Student Resume Upload (Mock Integrations) > 5. should reject requests with missing formData fields without processing +AssertionError: expected 403 to be 400 // Object.is equality + +- Expected ++ Received + +- 400 ++ 403 + + ❯ app/api/student/resume/upload/route.mock-integrations.test.ts:128:24 + 126| const json = await res.json(); + 127| + 128| expect(res.status).toBe(400); + | ^ + 129| expect(json.error).toMatch(/No resume file provided/i); + 130| expect(RateLimiter.prototype.checkWithResult).toHaveBeenCalled(); + +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[74/79]⎯ + + FAIL app/api/student/resume/upload/route.mock-integrations.test.ts > API Route: Student Resume Upload (Mock Integrations) > 1. should test service loading paths to ensure successful parsing returns 200 (mock success) +AssertionError: expected 403 to be 200 // Object.is equality + +- Expected ++ Received + +- 200 ++ 403 + + ❯ app/api/student/resume/upload/route.mock-integrations.test.ts:207:24 + 205| + 206| // Assert + 207| expect(res.status).toBe(200); + | ^ + 208| expect(json.success).toBe(true); + 209| expect(json.data).toEqual(mockParsedData); + +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[75/79]⎯ + + FAIL app/api/student/resume/upload/route.mock-integrations.test.ts > API Route: Student Resume Upload (Mock Integrations) > 2. should assert local cache layers (RateLimiter) block requests before triggering async services +AssertionError: expected 403 to be 429 // Object.is equality + +- Expected ++ Received + +- 429 ++ 403 + + ❯ app/api/student/resume/upload/route.mock-integrations.test.ts:229:24 + 227| + 228| // Assert: Blocked with 429, and parseResume is NEVER called + 229| expect(res.status).toBe(429); + | ^ + 230| expect(json.error).toMatch(/Too many requests/i); + 231| expect(parseResume).not.toHaveBeenCalled(); + +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[76/79]⎯ + + FAIL app/api/student/resume/upload/route.mock-integrations.test.ts > API Route: Student Resume Upload (Mock Integrations) > 3. should verify correct fallback procedures during fake endpoint/parsing errors +AssertionError: expected 403 to be 422 // Object.is equality + +- Expected ++ Received + +- 422 ++ 403 + + ❯ app/api/student/resume/upload/route.mock-integrations.test.ts:245:24 + 243| + 244| // Assert: Route catches the error safely and returns 422 + 245| expect(res.status).toBe(422); + | ^ + 246| expect(json.success).toBe(false); + 247| expect(json.error).toMatch(/Failed to parse resume/i); + +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[77/79]⎯ + + FAIL app/api/student/resume/upload/route.mock-integrations.test.ts > API Route: Student Resume Upload (Mock Integrations) > 4. should block invalid file signatures without hitting the parser service +AssertionError: expected 403 to be 400 // Object.is equality + +- Expected ++ Received + +- 400 ++ 403 + + ❯ app/api/student/resume/upload/route.mock-integrations.test.ts:261:24 + 259| + 260| // Assert: Fails security check (400) before reaching the async pa… + 261| expect(res.status).toBe(400); + | ^ + 262| expect(json.error).toMatch(/File content does not match its type/i… + 263| expect(parseResume).not.toHaveBeenCalled(); + +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[78/79]⎯ + + FAIL app/api/student/resume/upload/route.mock-integrations.test.ts > API Route: Student Resume Upload (Mock Integrations) > 5. should reject requests with missing formData fields without processing +AssertionError: expected 403 to be 400 // Object.is equality + +- Expected ++ Received + +- 400 ++ 403 + + ❯ app/api/student/resume/upload/route.mock-integrations.test.ts:275:24 + 273| + 274| // Assert: Immediately fails validation (400) + 275| expect(res.status).toBe(400); + | ^ + 276| expect(json.error).toMatch(/No resume file provided/i); + 277| expect(RateLimiter.prototype.checkWithResult).toHaveBeenCalled(); + +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[79/79]⎯ + + + Test Files 13 failed | 1498 passed | 2 skipped (1513) + Tests 79 failed | 10173 passed | 1 expected fail | 14 skipped (10267) + Start at 08:21:22 + Duration 1258.94s (transform 91.88s, setup 509.81s, import 967.85s, tests 1529.79s, environment 5279.46s) + diff --git a/test_output2.log b/test_output2.log new file mode 100644 index 000000000..6978d39bf --- /dev/null +++ b/test_output2.log @@ -0,0 +1,10783 @@ + +> commitpulse@0.1.0 test +> vitest run + + + RUN v4.1.10 /home/atulupadhyay/Contribution/commitpulse + + ❯ lib/security/csrf.test.ts (15 tests | 1 failed) 47ms + × rejects requests with no origin and no referer 16ms + ✓ allows requests from the exact same origin 3ms + ✓ allows requests from the same origin with referer header 1ms + ✓ rejects requests from a different port on the same hostname 8ms + ✓ rejects requests from a different hostname 2ms + ✓ rejects requests from a different protocol 2ms + ✓ allows requests from the same origin with explicit default port in origin 2ms + ✓ allows requests from the same origin with explicit port in allowed origin env 1ms + ✓ rejects requests from a non-default port when allowed origin uses default port 2ms + ✓ returns 403 with JSON error body on CSRF failure 2ms + ✓ rejects requests with malformed origin 1ms + ✓ falls back to referer when origin is absent 1ms + ✓ rejects referer from a different port 1ms + ✓ allows either origin OR referer to be valid 0ms + ✓ rejects when both origin and referer are invalid 1ms +stderr | lib/github.test.ts > fetchGitHubContributions > returns the contribution calendar on a successful response +[CommitPulse API] Empty profile or null repository nodes discovered for user "octocat". Falling back to baseline collection. + +stderr | lib/github.test.ts > fetchGitHubContributions > injects positive locAdditions and non-negative locDeletions for contribution days +[CommitPulse API] Empty profile or null repository nodes discovered for user "octocat". Falling back to baseline collection. + +stderr | lib/github.test.ts > fetchGitHubContributions > sets locAdditions and locDeletions to zero for zero-contribution days +[CommitPulse API] Empty profile or null repository nodes discovered for user "octocat". Falling back to baseline collection. + +stderr | lib/github.test.ts > fetchGitHubContributions > works correctly for a brand-new user who has zero contribution weeks +[CommitPulse API] Empty profile or null repository nodes discovered for user "new-user". Falling back to baseline collection. + +stdout | app/api/streak/route.test.ts > GET /api/streak > falls back to the default isometric view when an invalid view is provided +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"92c1ea1d-8adf-426d-810f-9a367f5a8953"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > falls back to the default isometric view when an invalid view is provided +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":48,"requestId":"92c1ea1d-8adf-426d-810f-9a367f5a8953"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > parameter validation > clamps grace=-1 to 0 is provided +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"86f5ae69-ce64-49a6-a562-16361185c5af"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > parameter validation > clamps grace=-1 to 0 is provided +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"86f5ae69-ce64-49a6-a562-16361185c5af"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > parameter validation > clamps grace to when exceeds max value +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"69593995-0836-4b78-b7b5-8a2eb2cb1969"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > parameter validation > clamps grace to when exceeds max value +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"69593995-0836-4b78-b7b5-8a2eb2cb1969"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > parameter validation > returns 400 when days=0 is provided +[INFO] Incoming streak request {"source":"streak","requestId":"f8a531af-749c-473b-8480-6be6e84ca257"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > parameter validation > returns 400 when days is negative +[INFO] Incoming streak request {"source":"streak","requestId":"a61ffb2b-3579-43ed-806b-bc8a61f29392"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > parameter validation > re-chunks ?days filtered days into real weeks instead of one overflowing week +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"0bbf3684-f534-4da6-b916-bcd002cf9244"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > parameter validation > re-chunks ?days filtered days into real weeks instead of one overflowing week +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"json","status":200,"durationMs":4,"requestId":"0bbf3684-f534-4da6-b916-bcd002cf9244"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > parameter validation > does not truncate calculated streak stats when the days parameter is set +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"ab33fed5-a92c-4df3-984d-b4227eb39021"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > parameter validation > does not truncate calculated streak stats when the days parameter is set +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"json","status":200,"durationMs":6,"requestId":"ab33fed5-a92c-4df3-984d-b4227eb39021"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > parameter validation > returns 400 Bad Request when ?layout= is set to an unsupported format +[INFO] Incoming streak request {"source":"streak","requestId":"42ca7d1d-ff8b-4d76-9ab5-06a573bf20b3"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > parameter validation > does not call the GitHub API when layout is invalid +[INFO] Incoming streak request {"source":"streak","requestId":"44d22567-534d-4a93-bd74-9f24e9c028b3"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > parameter validation > returns 400 with a structured error body for unsupported_layout +[INFO] Incoming streak request {"source":"streak","requestId":"cd790d84-6798-41f1-82bb-27c6b99e748e"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > parameter validation > returns 400 Bad Request when ?layout= is set to an unsupported format (Variation 4) +[INFO] Incoming streak request {"source":"streak","requestId":"706b7fab-0717-446d-88b0-2ba1ad0eb2d3"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > parameter validation > returns 400 when the user parameter is missing +[INFO] Incoming streak request {"source":"streak","requestId":"645afd4f-3773-464f-a14e-bec837b273b4"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > parameter validation > returns 400 when org parameter contains spaces and invalid characters +[INFO] Incoming streak request {"source":"streak","requestId":"264482b5-54e7-4654-9e42-e99558872643"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > parameter validation > does not hit the GitHub API at all when user is missing +[INFO] Incoming streak request {"source":"streak","requestId":"9a16f0a1-07fd-4fb2-a1be-1806aea90bac"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > parameter validation > returns 400 for malformed GitHub usernames +[INFO] Incoming streak request {"source":"streak","requestId":"f87b1ecb-e2d6-4785-a468-d6816ac55dc5"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > parameter validation > returns 400 for malformed GitHub usernames +[INFO] Incoming streak request {"source":"streak","requestId":"8c400d00-f7c0-4589-a414-c7e09e090d48"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > parameter validation > returns 400 for malformed GitHub usernames +[INFO] Incoming streak request {"source":"streak","requestId":"00af079f-b1a2-4319-8f00-13c515ea1427"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > parameter validation > returns 400 for malformed GitHub usernames +[INFO] Incoming streak request {"source":"streak","requestId":"2a3e5a2d-1a53-4dc2-94d5-6f5ba033ef21"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > parameter validation > returns 400 when user contains spaces +[INFO] Incoming streak request {"source":"streak","requestId":"b4785241-2d99-4d76-a0a4-83ccc9e657a4"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > parameter validation > returns 400 when user exceeds 39 characters +[INFO] Incoming streak request {"source":"streak","requestId":"a1f0e5dd-c638-4779-85b9-e71b4b097667"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > parameter validation > returns 400 Bad Request and details indicating the username cannot exceed 39 characters when using NextRequest +[INFO] Incoming streak request {"source":"streak","requestId":"703cd1c8-a126-4027-a0b9-ea488bcee665"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > parameter validation > returns 400 for invalid monthly badge dimensions +[INFO] Incoming streak request {"source":"streak","requestId":"035a0f48-f949-4f58-be7b-e4e7d40d0785"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > parameter validation > returns 400 for invalid monthly badge dimensions +[INFO] Incoming streak request {"source":"streak","requestId":"981cb55e-d916-4b87-afb9-840964e21266"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > parameter validation > returns 400 for invalid monthly badge dimensions +[INFO] Incoming streak request {"source":"streak","requestId":"2db41dd7-8026-4180-9caf-fb0f09590ef3"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > parameter validation > returns 400 for invalid monthly badge dimensions +[INFO] Incoming streak request {"source":"streak","requestId":"4fb9e231-ffd1-4f20-b5a7-5c5ded0b1b16"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > parameter validation > returns 400 for invalid monthly badge dimensions +[INFO] Incoming streak request {"source":"streak","requestId":"63973e1c-4c48-4367-828b-6dfbeee724b8"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > parameter validation > returns 400 for invalid monthly badge dimensions +[INFO] Incoming streak request {"source":"streak","requestId":"51b3f3f2-d933-4523-9e24-b16b24c4347a"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > parameter validation > clamps grace to 0 when below the minimum value +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"3ad4c21f-d9db-4bc9-899d-1453e0c0e88d"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > parameter validation > clamps grace to 0 when below the minimum value +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":3,"requestId":"3ad4c21f-d9db-4bc9-899d-1453e0c0e88d"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > parameter validation > returns 400 for unsupported ?layout query parameter values (strict schema validation) +[INFO] Incoming streak request {"source":"streak","requestId":"04577d2c-e691-4f95-8577-c916e7c489bd"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > parameter validation > returns 400 when an invalid theme value is provided and lists allowed themes +[INFO] Incoming streak request {"source":"streak","requestId":"3dd5faa5-6e42-420b-b81f-0acf7bc54f64"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > parameter validation > should return 200 OK and valid SVG when the optional repo query parameter is provided +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"bb128fc1-f5bc-4e1f-a312-a165691cbdbf"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > parameter validation > should return 200 OK and valid SVG when the optional repo query parameter is provided +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"bb128fc1-f5bc-4e1f-a312-a165691cbdbf"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > parameter validation > should return 200 OK and valid SVG when the optional org query parameter is provided +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"506fa25f-e47b-4314-86a8-8b8db2d0cf15"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > parameter validation > should return 200 OK and valid SVG when the optional org query parameter is provided +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":3,"requestId":"506fa25f-e47b-4314-86a8-8b8db2d0cf15"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > parameter validation > returns 400 when org contains invalid characters +[INFO] Incoming streak request {"source":"streak","requestId":"799fe2e4-9b90-40d1-8eba-8695c1e2b73b"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > successful response > returns 200 with SVG content type +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"648bbf9b-40cc-4b31-8153-d21d8ce061ad"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > successful response > returns 200 with SVG content type +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"648bbf9b-40cc-4b31-8153-d21d8ce061ad"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > successful response > returns a well-formed SVG body +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"88fa68c7-5180-4c51-85da-35ed51f6ac63"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > successful response > returns a well-formed SVG body +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":0,"requestId":"88fa68c7-5180-4c51-85da-35ed51f6ac63"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > successful response > returns valid SVG when mode=loc is given +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"b0004de5-195c-4a6c-a3fa-b325ba3104d0"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > successful response > returns valid SVG when mode=loc is given +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":4,"requestId":"b0004de5-195c-4a6c-a3fa-b325ba3104d0"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > successful response > forwards the username to fetchGitHubContributions +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"9a915ce7-a5b7-4406-8e0a-85491af96a69"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > successful response > forwards the username to fetchGitHubContributions +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"9a915ce7-a5b7-4406-8e0a-85491af96a69"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > successful response > forwards grace parameter to fetchGitHubContributions +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"d4a20f1c-6ff2-412a-906c-5f6c1138cd9d"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > successful response > forwards grace parameter to fetchGitHubContributions +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"d4a20f1c-6ff2-412a-906c-5f6c1138cd9d"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > successful response > embeds the username (uppercased) in the SVG title +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"cad07b16-d048-4555-90dc-e48e4402a168"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > successful response > embeds the username (uppercased) in the SVG title +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"cad07b16-d048-4555-90dc-e48e4402a168"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > successful response > should contain a <title> element with accessible label in the SVG response +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"9d2d96e4-49e7-4ee4-aea5-6730c6262f2f"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > successful response > should contain a <title> element with accessible label in the SVG response +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"9d2d96e4-49e7-4ee4-aea5-6730c6262f2f"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > successful response > returns a small SVG when size=small +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"62a67bc0-c271-42a6-8ddb-bb5caae2df73"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > successful response > returns a small SVG when size=small +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"62a67bc0-c271-42a6-8ddb-bb5caae2df73"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > successful response > returns the default medium SVG when size is omitted +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"a400b7ce-4ca1-4f98-8d79-b4686ab9741c"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > successful response > returns the default medium SVG when size is omitted +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"a400b7ce-4ca1-4f98-8d79-b4686ab9741c"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > successful response > returns a large SVG when size=large +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"7c1c157a-bb08-4a12-8ebe-37e195f2baff"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > successful response > returns a large SVG when size=large +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"7c1c157a-bb08-4a12-8ebe-37e195f2baff"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > edge cases for empty/private profiles > Scenario 1: Normal active GitHub user +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"829b04db-9769-448f-821e-1ba83051634b"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > edge cases for empty/private profiles > Scenario 1: Normal active GitHub user +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"829b04db-9769-448f-821e-1ba83051634b"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > edge cases for empty/private profiles > Scenario 2 & 3: User with 0 public repositories or private profile (empty calendar) +[INFO] Incoming streak request {"source":"streak","user":"private-user","view":"default","requestId":"63c7675b-6a0a-4a57-94a8-9068f3047dc8"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > edge cases for empty/private profiles > Scenario 2 & 3: User with 0 public repositories or private profile (empty calendar) +[INFO] Streak request completed {"source":"streak","user":"private-user","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"63c7675b-6a0a-4a57-94a8-9068f3047dc8"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > edge cases for empty/private profiles > Scenario 4: Nonexistent username +[INFO] Incoming streak request {"source":"streak","user":"nonexistent","view":"default","requestId":"d9a4deb0-3ce7-43b6-a584-10bbc33c26aa"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > edge cases for empty/private profiles > Scenario 4: Nonexistent username +[INFO] Streak request completed {"source":"streak","user":"nonexistent","view":"default","format":"svg","status":200,"durationMs":3,"requestId":"d9a4deb0-3ce7-43b6-a584-10bbc33c26aa"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > edge cases for empty/private profiles > Scenario 5: GitHub API failure +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"88478bad-7753-4748-8186-ca3961c3234c"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > edge cases for empty/private profiles > Scenario 5: GitHub API failure +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"88478bad-7753-4748-8186-ca3961c3234c"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > edge cases for empty/private profiles > Scenario 6: Circuit Breaker Open Telemetry +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"a5a11da4-4d87-41ab-af84-a4fa75a9e4e8"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > edge cases for empty/private profiles > Scenario 6: Circuit Breaker Open Telemetry +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":0,"requestId":"a5a11da4-4d87-41ab-af84-a4fa75a9e4e8"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > cache-control header > caches until UTC midnight by default, using the value from getSecondsUntilUTCMidnight +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"3c79476d-02bf-403d-82f6-07887242b27d"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > cache-control header > caches until UTC midnight by default, using the value from getSecondsUntilUTCMidnight +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"3c79476d-02bf-403d-82f6-07887242b27d"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > cache-control header > reflects a different time value when the clock changes +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"cc93af27-c3f3-44ec-8042-bbe1a4f60e5f"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > cache-control header > reflects a different time value when the clock changes +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"cc93af27-c3f3-44ec-8042-bbe1a4f60e5f"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > cache-control header > bypasses the cache entirely when ?refresh=true +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"6f9bab05-fc6f-4cf6-a880-c328775ff287"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > cache-control header > bypasses the cache entirely when ?refresh=true +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":3,"requestId":"6f9bab05-fc6f-4cf6-a880-c328775ff287"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > cache-control header > passes bypassCache=true when refresh=true +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"9b5b6210-323f-4e1a-8275-4b73355d7fbb"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > cache-control header > passes bypassCache=true when refresh=true +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"9b5b6210-323f-4e1a-8275-4b73355d7fbb"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > cache-control header > keeps normal caching when refresh is "false" +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"b1a5b21e-b46b-48ec-a719-a8278a2f65b5"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > cache-control header > keeps normal caching when refresh is "false" +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"b1a5b21e-b46b-48ec-a719-a8278a2f65b5"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > cache-control header > keeps normal caching when refresh is "1" (not the exact string "true") +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"3ba5e11e-8408-4b2a-86bb-cc03535ca09e"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > cache-control header > keeps normal caching when refresh is "1" (not the exact string "true") +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"3ba5e11e-8408-4b2a-86bb-cc03535ca09e"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > security headers > sets a strict Content-Security-Policy with safe SVG styling rules +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"cb82f7af-e8a9-40e4-84cc-e20c846e5ed6"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > security headers > sets a strict Content-Security-Policy with safe SVG styling rules +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"cb82f7af-e8a9-40e4-84cc-e20c846e5ed6"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > speed parameter > accepts a valid integer speed like "3s" and passes it to the SVG +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"e46f69e8-8c77-495f-9619-de7f55a0cd32"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > speed parameter > accepts a valid integer speed like "3s" and passes it to the SVG +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":3,"requestId":"e46f69e8-8c77-495f-9619-de7f55a0cd32"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > speed parameter > falls back to 8s for decimal values below minimum bound +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"fe855947-14f3-4094-a949-e04bf5147fde"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > speed parameter > falls back to 8s for decimal values below minimum bound +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"fe855947-14f3-4094-a949-e04bf5147fde"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > speed parameter > falls back to 8s when the speed format is invalid (no unit) +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"34958c64-7c01-4479-9270-a4cc0bf0097a"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > speed parameter > falls back to 8s when the speed format is invalid (no unit) +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"34958c64-7c01-4479-9270-a4cc0bf0097a"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > speed parameter > falls back to 8s when speed is a bare number without the "s" suffix +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"8c933623-ce41-4e00-a260-51c26b8666f8"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > speed parameter > falls back to 8s when speed is a bare number without the "s" suffix +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"8c933623-ce41-4e00-a260-51c26b8666f8"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > speed parameter > falls back to 8s when speed=10 is provided without unit +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"4bf44aef-e107-4994-bf0c-f5e020b9572c"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > speed parameter > falls back to 8s when speed=10 is provided without unit +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"4bf44aef-e107-4994-bf0c-f5e020b9572c"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > speed parameter > falls back to 8s when speed is below minimum bound +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"e9385d32-0c11-4949-bf8c-0fbb8eff3591"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > speed parameter > falls back to 8s when speed is below minimum bound +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"e9385d32-0c11-4949-bf8c-0fbb8eff3591"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > speed parameter > falls back to 8s when speed exceeds maximum bound +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"abc2c2d4-3399-45b4-a441-f7c624efb8f4"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > speed parameter > falls back to 8s when speed exceeds maximum bound +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"abc2c2d4-3399-45b4-a441-f7c624efb8f4"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > speed parameter > accepts the minimum boundary speed "2s" +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"838fc9f9-444a-41b9-a685-ef923c8b0985"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > speed parameter > accepts the minimum boundary speed "2s" +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":5,"requestId":"838fc9f9-444a-41b9-a685-ef923c8b0985"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > speed parameter > accepts the maximum boundary speed "20s" +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"9e63ab7b-9659-483c-86ed-f6ccef8ed0e3"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > speed parameter > accepts the maximum boundary speed "20s" +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"9e63ab7b-9659-483c-86ed-f6ccef8ed0e3"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > speed parameter > preserves an in-range decimal speed like "8.5s" instead of forcing it to an integer +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"f45557ed-cfb2-42ad-bae2-bf30655540a6"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > speed parameter > preserves an in-range decimal speed like "8.5s" instead of forcing it to an integer +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"f45557ed-cfb2-42ad-bae2-bf30655540a6"} + +stderr | lib/github.test.ts > fetchGitHubContributions > throws with the status code when the server returns 500 +[ERROR] GitHub GraphQL API error {"status":500,"body":"{\"message\":\"Internal Server Error\"}"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > scale parameter > returns 200 when scale=log is given +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"80e8c607-112e-4dca-930c-bf196c540ab1"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > scale parameter > returns 200 when scale=log is given +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":3,"requestId":"80e8c607-112e-4dca-930c-bf196c540ab1"} + +stderr | lib/github.test.ts > fetchGitHubContributions > throws with the status code when the server returns 401 (expired or missing token) +[ERROR] GitHub PAT authentication failed {"status":401,"body":"{\"message\":\"Unauthorized\"}"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > scale parameter > defaults to linear scale when an unknown scale value is given +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"d0ef3586-ab30-4cda-ae26-09e8f5b4124e"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > scale parameter > defaults to linear scale when an unknown scale value is given +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"d0ef3586-ab30-4cda-ae26-09e8f5b4124e"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > scale parameter > defaults to linear scale when scale=foo is given +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"32ae70ca-5148-4309-a6d7-7a9de9acf356"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > scale parameter > defaults to linear scale when scale=foo is given +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"32ae70ca-5148-4309-a6d7-7a9de9acf356"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > scale parameter > produces different SVG output for scale=log versus scale=linear with mixed contribution counts +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"a262217b-7f39-4471-89c2-fde8c35d8d6e"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > scale parameter > produces different SVG output for scale=log versus scale=linear with mixed contribution counts +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":3,"requestId":"a262217b-7f39-4471-89c2-fde8c35d8d6e"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > scale parameter > produces different SVG output for scale=log versus scale=linear with mixed contribution counts +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"dcb20590-edc7-48f4-aa73-f097ee22d6a1"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > scale parameter > produces different SVG output for scale=log versus scale=linear with mixed contribution counts +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"dcb20590-edc7-48f4-aa73-f097ee22d6a1"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > year parameter > accepts a valid 4-digit year +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"a8622f7a-5842-4a3e-9aab-baae4ec54bf8"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > year parameter > accepts a valid 4-digit year +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"a8622f7a-5842-4a3e-9aab-baae4ec54bf8"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > year parameter > passes correct from/to range when ?year=2023 is provided +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"5119ea68-e776-4d02-8f4e-330a36ca9669"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > year parameter > passes correct from/to range when ?year=2023 is provided +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":3,"requestId":"5119ea68-e776-4d02-8f4e-330a36ca9669"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > year parameter > passes correct from/to range when ?year=2008 is provided +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"d9067f66-44e4-4c2b-9dca-8528de180160"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > year parameter > passes correct from/to range when ?year=2008 is provided +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"d9067f66-44e4-4c2b-9dca-8528de180160"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > year parameter > returns 400 when custom from date is after custom to date +[INFO] Incoming streak request {"source":"streak","requestId":"379ee008-1c6e-49a5-9851-b22da6b61ddc"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > year parameter > functions normally when the year parameter is missing +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"c8a9e74e-91b6-4d74-98e7-9fa4c1ff6901"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > year parameter > functions normally when the year parameter is missing +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":0,"requestId":"c8a9e74e-91b6-4d74-98e7-9fa4c1ff6901"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > year parameter > returns 400 for invalid year format +[INFO] Incoming streak request {"source":"streak","requestId":"ddecfee4-5d86-40e2-9a3c-90e759458b78"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > year parameter > returns 400 for malformed numeric year +[INFO] Incoming streak request {"source":"streak","requestId":"a6538280-b90d-400b-b847-9a4b4892002e"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > year parameter > returns 400 for years before GitHub existed +[INFO] Incoming streak request {"source":"streak","requestId":"ab0a7288-0621-4073-a4e0-aff7ebc57777"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > year parameter > returns 400 for the year=2007(before GitHub was founded) +[INFO] Incoming streak request {"source":"streak","requestId":"059080f1-94dd-4224-b8ef-47f910e63abd"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > year parameter > returns 400 for future years +[INFO] Incoming streak request {"source":"streak","requestId":"f86a95ff-c65f-4e2c-94c9-ccc46acc18a8"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > year parameter > accepts year=2008 (the earliest valid year) +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"2419d9fa-c3c9-454e-b671-38a1a8ffba12"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > year parameter > accepts year=2008 (the earliest valid year) +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":0,"requestId":"2419d9fa-c3c9-454e-b671-38a1a8ffba12"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > year parameter > accepts the current year +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"ad9ee57e-efae-4305-bb2c-bc79092c02c8"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > year parameter > accepts the current year +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"ad9ee57e-efae-4305-bb2c-bc79092c02c8"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > year parameter > date parameter > returns 400 for malformed ?date= query parameter values (Variation 3) +[INFO] Incoming streak request {"source":"streak","requestId":"0f5d9296-d2ac-40c6-a842-bb398afae3c0"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > year parameter > date parameter > returns 400 when an invalid ISO8601 calendar date format like "2026-15-40" is supplied +[INFO] Incoming streak request {"source":"streak","requestId":"74ed29ff-09e4-4cad-bb0b-2c921364ce1d"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > year parameter > date parameter > returns 400 when an invalid ISO8601 calendar date format like "2026-15-40" is supplied (Variation 4) +[INFO] Incoming streak request {"source":"streak","requestId":"73f970c9-f0a2-4b01-a0ff-47b5e504eed9"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > radius parameter > applies radius=16 to the SVG background rect +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"5f26790b-22bb-4cd3-a540-adefdd8c0d91"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > radius parameter > applies radius=16 to the SVG background rect +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"5f26790b-22bb-4cd3-a540-adefdd8c0d91"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > radius parameter > applies radius=0 to the SVG background rect +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"20e848bc-56b2-4ae5-98d2-46ae2e56a659"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > radius parameter > applies radius=0 to the SVG background rect +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"20e848bc-56b2-4ae5-98d2-46ae2e56a659"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > radius parameter > clamps radius values above the maximum limit +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"3d24190b-fee1-4c63-878a-7234e2bce3a1"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > radius parameter > clamps radius values above the maximum limit +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"3d24190b-fee1-4c63-878a-7234e2bce3a1"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > radius parameter > clamps negative radius to 0 +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"6929f8cd-b311-4c82-9be6-a936505b767c"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > radius parameter > clamps negative radius to 0 +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"6929f8cd-b311-4c82-9be6-a936505b767c"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > radius parameter > handles non-numeric radius gracefully +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"786631c5-d38a-489e-96cd-0be75aaf45f1"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > radius parameter > handles non-numeric radius gracefully +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"786631c5-d38a-489e-96cd-0be75aaf45f1"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > theme parameter > returns 200 for a valid known theme like "neon" +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"a27145a5-78ad-4561-90a5-20cd6da463de"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > theme parameter > returns 200 for a valid known theme like "neon" +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"a27145a5-78ad-4561-90a5-20cd6da463de"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > theme parameter > returns SVG content type for theme=neon +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"491ba7b9-46f4-4beb-942c-1eab6afcbd71"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > theme parameter > returns SVG content type for theme=neon +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":0,"requestId":"491ba7b9-46f4-4beb-942c-1eab6afcbd71"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > theme parameter > returns SVG content type for theme=dracula +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"92f916a6-cf9d-46e6-95d0-5dd6533aee25"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > theme parameter > returns SVG content type for theme=dracula +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"92f916a6-cf9d-46e6-95d0-5dd6533aee25"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > theme parameter > returns SVG content type for theme=auto +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"d432b50d-2998-4f48-9f47-52e581675612"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > theme parameter > returns SVG content type for theme=auto +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"d432b50d-2998-4f48-9f47-52e581675612"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > theme parameter > returns auto-theme SVG markup with dark-mode CSS variables when theme=auto +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"7a3a29b2-6c06-44a3-aaf5-2a467407c115"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > theme parameter > returns auto-theme SVG markup with dark-mode CSS variables when theme=auto +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"7a3a29b2-6c06-44a3-aaf5-2a467407c115"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > theme parameter > returns 400 Bad Request listing allowed themes when an invalid theme is provided +[INFO] Incoming streak request {"source":"streak","requestId":"7c348ff6-d4c2-4892-ba05-1871a307d42d"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > theme parameter > returns 400 when theme parameter contains only whitespace +[INFO] Incoming streak request {"source":"streak","requestId":"7e1bfdfe-e658-45cb-a00e-b0d8d86b44b1"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > theme parameter > accepts capitalized or mixed-case theme parameter like "NEON" and maps it correctly +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"906c794e-21ef-498a-b20e-816a0f2ae1d7"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > theme parameter > accepts capitalized or mixed-case theme parameter like "NEON" and maps it correctly +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"906c794e-21ef-498a-b20e-816a0f2ae1d7"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > theme parameter > accepts mixed-case "random" or "auto" and resolves correctly +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"96f635a3-cdbd-4ce8-b777-0947dc21f43c"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > theme parameter > accepts mixed-case "random" or "auto" and resolves correctly +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"96f635a3-cdbd-4ce8-b777-0947dc21f43c"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > custom colour overrides > embeds a custom background colour in the SVG when bg is provided +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"eef8a860-dc9e-471d-abf8-0188859f8942"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > custom colour overrides > embeds a custom background colour in the SVG when bg is provided +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"eef8a860-dc9e-471d-abf8-0188859f8942"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > custom colour overrides > embeds a custom accent colour in the SVG when accent is provided +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"4c118d53-cfa4-4f0e-aca4-8bdf0bd9bd65"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > custom colour overrides > embeds a custom accent colour in the SVG when accent is provided +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"4c118d53-cfa4-4f0e-aca4-8bdf0bd9bd65"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > custom colour overrides > embeds a custom text color in the SVG when text is provided +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"6f51a5ea-6dbc-4386-a9f4-d5fd7234d4fe"} + + ✓ components/WallOfLove.mouse-interactivity.test.tsx (8 tests) 3576ms + ✓ renders section heading 1054ms + ✓ renders testimonial author names 400ms + ✓ renders testimonial handles 323ms + ✓ renders testimonial avatars 425ms + ✓ renders stats section values 677ms +stdout | app/api/streak/route.test.ts > GET /api/streak > custom colour overrides > embeds a custom text color in the SVG when text is provided +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":3,"requestId":"6f51a5ea-6dbc-4386-a9f4-d5fd7234d4fe"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > custom colour overrides > does not crash when an invalid text color is provided and falls back gracefully +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"04582bf3-f17c-4ded-93b5-4c619912b871"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > custom colour overrides > does not crash when an invalid text color is provided and falls back gracefully +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"04582bf3-f17c-4ded-93b5-4c619912b871"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > custom colour overrides > falls back gracefully when an invalid hex color is passed as accent +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"3dc7b879-1afc-469f-8013-7a30b3a303a0"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > custom colour overrides > falls back gracefully when an invalid hex color is passed as accent +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"3dc7b879-1afc-469f-8013-7a30b3a303a0"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > custom colour overrides > strips invalid color hex syntax targeting the ?accent= parameter and returns 200 +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"02e7fde2-ea34-45da-95d8-30596dc92aa5"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > custom colour overrides > strips invalid color hex syntax targeting the ?accent= parameter and returns 200 +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"02e7fde2-ea34-45da-95d8-30596dc92aa5"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > falls back gracefully when an invalid hex color is passed as bg +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"d14cc3d5-96a2-4561-83ed-d517c16b0d41"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > falls back gracefully when an invalid hex color is passed as bg +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"d14cc3d5-96a2-4561-83ed-d517c16b0d41"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > hide parameters > removes the username title when hide_title=true +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"5084b07f-288a-47a6-aa53-19693deab767"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > hide parameters > removes the username title when hide_title=true +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"5084b07f-288a-47a6-aa53-19693deab767"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > hide parameters > keeps the username title when hide_title=false +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"785d5e76-b3a8-42c8-8b84-618d65bda1b1"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > hide parameters > keeps the username title when hide_title=false +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"785d5e76-b3a8-42c8-8b84-618d65bda1b1"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > hide parameters > removes the stats section when hide_stats=true +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"2fd84107-9022-41aa-825c-a126058123c9"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > hide parameters > removes the stats section when hide_stats=true +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"2fd84107-9022-41aa-825c-a126058123c9"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > hide parameters > keeps the stats section when hide_stats=false +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"cc89eeba-3dc1-498f-b5ad-ca3dbbd1d48c"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > hide parameters > keeps the stats section when hide_stats=false +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"cc89eeba-3dc1-498f-b5ad-ca3dbbd1d48c"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > error handling > returns 500 with SVG content type when fetchGitHubContributions throws +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"57496cd0-1398-4e8b-85cc-fc0d9d0962e5"} + +stderr | app/api/streak/route.test.ts > GET /api/streak > error handling > returns 500 with SVG content type when fetchGitHubContributions throws +[ERROR] Unhandled error {"source":"streak","message":"Something went wrong. Please try again later.","requestId":"57496cd0-1398-4e8b-85cc-fc0d9d0962e5"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > error handling > returns 500 with SVG content type when fetchGitHubContributions throws +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"57496cd0-1398-4e8b-85cc-fc0d9d0962e5"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > error handling > embeds the thrown error message in the error SVG +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"825a8b21-12ec-43ea-aa6c-4aaa943dcca4"} + +stderr | app/api/streak/route.test.ts > GET /api/streak > error handling > embeds the thrown error message in the error SVG +[ERROR] Unhandled error {"source":"streak","message":"Something went wrong. Please try again later.","requestId":"825a8b21-12ec-43ea-aa6c-4aaa943dcca4"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > error handling > embeds the thrown error message in the error SVG +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"825a8b21-12ec-43ea-aa6c-4aaa943dcca4"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > error handling > never caches an error response +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"f94d3453-4b91-4d60-9be3-d85c0656af1d"} + +stderr | app/api/streak/route.test.ts > GET /api/streak > error handling > never caches an error response +[ERROR] Unhandled error {"source":"streak","message":"Something went wrong. Please try again later.","requestId":"f94d3453-4b91-4d60-9be3-d85c0656af1d"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > error handling > never caches an error response +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"f94d3453-4b91-4d60-9be3-d85c0656af1d"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > error handling > sets the SVG Content-Security-Policy header on generic error responses +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"f30eb6e1-26fc-4522-acfc-f5f49ec74e6c"} + +stderr | app/api/streak/route.test.ts > GET /api/streak > error handling > sets the SVG Content-Security-Policy header on generic error responses +[ERROR] Unhandled error {"source":"streak","message":"Something went wrong. Please try again later.","requestId":"f30eb6e1-26fc-4522-acfc-f5f49ec74e6c"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > error handling > sets the SVG Content-Security-Policy header on generic error responses +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"f30eb6e1-26fc-4522-acfc-f5f49ec74e6c"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > error handling > returns 429 with no-cache headers and rate limit SVG when rate limited +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"296af507-f98e-4ed1-afdc-709b27b9e32a"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > error handling > returns 429 with no-cache headers and rate limit SVG when rate limited +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"296af507-f98e-4ed1-afdc-709b27b9e32a"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > error handling > returns a valid 500 SVG even when something non-Error is thrown +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"f66de03f-a8ca-4d85-a205-af3c1a6a8c7d"} + +stderr | app/api/streak/route.test.ts > GET /api/streak > error handling > returns a valid 500 SVG even when something non-Error is thrown +[ERROR] Unhandled error {"source":"streak","message":"Something went wrong. Please try again later.","requestId":"f66de03f-a8ca-4d85-a205-af3c1a6a8c7d"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > error handling > returns a valid 500 SVG even when something non-Error is thrown +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"f66de03f-a8ca-4d85-a205-af3c1a6a8c7d"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > error handling > returns a well-formed SVG structure even in the error state +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"435a53df-e143-49a5-b1f0-3daaa139ca1d"} + +stderr | app/api/streak/route.test.ts > GET /api/streak > error handling > returns a well-formed SVG structure even in the error state +[ERROR] Unhandled error {"source":"streak","message":"Something went wrong. Please try again later.","requestId":"435a53df-e143-49a5-b1f0-3daaa139ca1d"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > error handling > returns a well-formed SVG structure even in the error state +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"435a53df-e143-49a5-b1f0-3daaa139ca1d"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > timezone parameter (?tz=) > returns 400 when an unrecognised IANA timezone is supplied +[INFO] Incoming streak request {"source":"streak","requestId":"3fd54e89-f760-46c3-8bc2-b292eb8f899d"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > timezone parameter (?tz=) > returns 400 and names the bad value in the field error +[INFO] Incoming streak request {"source":"streak","requestId":"f680959c-be9b-4923-91d0-88db9b2b6a9a"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > timezone parameter (?tz=) > is not vulnerable to XSS via tz parameter +[INFO] Incoming streak request {"source":"streak","requestId":"ca4196f5-7e98-4d94-b873-608e37b4a87a"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > timezone parameter (?tz=) > returns 200 with a valid IANA timezone +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"981187e2-76e7-47ae-a1f9-6230cebdbc06"} +[INFO] Streak request completed {"source":"streak","requestId":"981187e2-76e7-47ae-a1f9-6230cebdbc06"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > timezone parameter (?tz=) > returns 200 with a valid IANA timezone +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2} + +stdout | app/api/streak/route.test.ts > GET /api/streak > timezone parameter (?tz=) > uses getSecondsUntilMidnightInTimezone (not UTC) for the cache TTL when ?tz= is set +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"af7aa5d9-b7ab-4729-b65a-62a5ca4e602f"} +[INFO] Streak request completed {"source":"streak","requestId":"af7aa5d9-b7ab-4729-b65a-62a5ca4e602f"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > timezone parameter (?tz=) > uses getSecondsUntilMidnightInTimezone (not UTC) for the cache TTL when ?tz= is set +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1} + +stdout | app/api/streak/route.test.ts > GET /api/streak > timezone parameter (?tz=) > still uses getSecondsUntilUTCMidnight when no ?tz= param is given +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"80dec0dd-226e-4f48-9931-c76c81cab8e9"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > timezone parameter (?tz=) > still uses getSecondsUntilUTCMidnight when no ?tz= param is given +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":0,"requestId":"80dec0dd-226e-4f48-9931-c76c81cab8e9"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > timezone parameter (?tz=) > returns 200 with valid SVG and calls getSecondsUntilMidnightInTimezone for Australia/Sydney +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"0cdcbbb8-010b-4d3c-9267-3a683d7d92c3"} +[INFO] Streak request completed {"source":"streak","requestId":"0cdcbbb8-010b-4d3c-9267-3a683d7d92c3"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > timezone parameter (?tz=) > returns 200 with valid SVG and calls getSecondsUntilMidnightInTimezone for Australia/Sydney +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":3} + +stdout | app/api/streak/route.test.ts > GET /api/streak > timezone parameter (?tz=) > returns 400 when a fictitious planetary timezone Mars/Cyonia is supplied +[INFO] Incoming streak request {"source":"streak","requestId":"d9e384cb-3a5d-41f7-8d82-77f08d708931"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > timezone parameter (?tz=) > rejects a path-traversal ?tz= payload before it reaches the GitHub API or TTL logic +[INFO] Incoming streak request {"source":"streak","requestId":"e44a4f29-ea9f-4b2a-b439-f8f7fdd4b462"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > timezone parameter (?tz=) > returns 400 (not 500) when Intl.DateTimeFormat throws RangeError at runtime +[INFO] Incoming streak request {"source":"streak","requestId":"fad2a6de-96cd-4222-83d4-7e671ee31026"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > hide_background parameter > produces a transparent background when ?hide_background=true is set +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"082a2d98-6b17-402a-be72-903a79a49a3b"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > hide_background parameter > produces a transparent background when ?hide_background=true is set +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"082a2d98-6b17-402a-be72-903a79a49a3b"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > hide_background parameter > does not produce a transparent background when ?hide_background is omitted +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"1d5e8ff4-75b5-414c-ab01-3fd9787154d8"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > hide_background parameter > does not produce a transparent background when ?hide_background is omitted +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":0,"requestId":"1d5e8ff4-75b5-414c-ab01-3fd9787154d8"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > monthly view parameter > returns a valid monthly SVG response when view=monthly is given +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"monthly","requestId":"12360f78-fec6-4a70-9b5c-110d8159a806"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > monthly view parameter > returns a valid monthly SVG response when view=monthly is given +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"monthly","format":"svg","status":200,"durationMs":2,"requestId":"12360f78-fec6-4a70-9b5c-110d8159a806"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > monthly view parameter > automatically overrides or widens the query bounds to encompass the start of the previous month when view=monthly is requested with custom from/to params +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"monthly","requestId":"378243f6-a1e4-49fe-94c6-f17da4b33e24"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > monthly view parameter > automatically overrides or widens the query bounds to encompass the start of the previous month when view=monthly is requested with custom from/to params +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"monthly","format":"svg","status":200,"durationMs":0,"requestId":"378243f6-a1e4-49fe-94c6-f17da4b33e24"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > monthly view parameter > uses the selected year when generating archived monthly stats +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"monthly","requestId":"e48a1f7b-7d5d-4cbb-8066-8732a3d088c7"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > monthly view parameter > uses the selected year when generating archived monthly stats +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"monthly","format":"svg","status":200,"durationMs":0,"requestId":"e48a1f7b-7d5d-4cbb-8066-8732a3d088c7"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > monthly view parameter > uses valid custom width and height in monthly SVG output +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"monthly","requestId":"11215967-526d-4b05-9dda-6fc47eba6469"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > monthly view parameter > uses valid custom width and height in monthly SVG output +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"monthly","format":"svg","status":200,"durationMs":4,"requestId":"11215967-526d-4b05-9dda-6fc47eba6469"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > monthly view parameter > defaults to default view when an unknown view is given +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"f00058a2-1ec8-4a31-bdb3-641abef44e33"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > monthly view parameter > defaults to default view when an unknown view is given +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"f00058a2-1ec8-4a31-bdb3-641abef44e33"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > monthly view parameter > returns streak view when view=streak is given +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"812a5785-5403-446b-ab75-45450ba28a2e"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > monthly view parameter > returns streak view when view=streak is given +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"812a5785-5403-446b-ab75-45450ba28a2e"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > monthly view parameter > applies custom width and height parameters to the monthly SVG +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"monthly","requestId":"7d809871-f4ee-448d-bef6-d650c8f10df1"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > monthly view parameter > applies custom width and height parameters to the monthly SVG +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"monthly","format":"svg","status":200,"durationMs":6,"requestId":"7d809871-f4ee-448d-bef6-d650c8f10df1"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > monthly view parameter > applies delta_format=both to show percent and absolute values in the monthly SVG +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"monthly","requestId":"32f1238f-a3da-48ec-9723-ced0fab21f21"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > monthly view parameter > applies delta_format=both to show percent and absolute values in the monthly SVG +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"monthly","format":"svg","status":200,"durationMs":0,"requestId":"32f1238f-a3da-48ec-9723-ced0fab21f21"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > monthly view parameter > applies delta_format=absolute to show raw commit counts in the monthly SVG +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"monthly","requestId":"d95950c2-7062-49c4-82f1-83ef83c265aa"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > monthly view parameter > applies delta_format=absolute to show raw commit counts in the monthly SVG +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"monthly","format":"svg","status":200,"durationMs":0,"requestId":"d95950c2-7062-49c4-82f1-83ef83c265aa"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > theme=random cache header > returns no-cache header when ?theme=random is given +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"614c2f29-a17b-4ff4-a02d-7ddda9c48c9a"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > theme=random cache header > returns no-cache header when ?theme=random is given +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"614c2f29-a17b-4ff4-a02d-7ddda9c48c9a"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > Ghost City Mode (route integration) > returns ghost city SVG when user has 0 total contributions +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"fd014448-0336-4efa-8ced-cfe460143b8c"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > Ghost City Mode (route integration) > returns ghost city SVG when user has 0 total contributions +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"fd014448-0336-4efa-8ced-cfe460143b8c"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > lang parameter > returns Spanish translations when ?lang=es is given +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"d75d4fc2-a831-4455-87da-3fbca0e8d80f"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > lang parameter > returns Spanish translations when ?lang=es is given +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"d75d4fc2-a831-4455-87da-3fbca0e8d80f"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > lang parameter > returns Hindi translations when ?lang=hi is given +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"021d3caf-1333-4dc5-b60d-5b767729f8b8"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > lang parameter > returns Hindi translations when ?lang=hi is given +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"021d3caf-1333-4dc5-b60d-5b767729f8b8"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > lang parameter > returns French translations when ?lang=fr is given +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"9c114edb-7292-49eb-9dca-59751c36a2b8"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > lang parameter > returns French translations when ?lang=fr is given +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"9c114edb-7292-49eb-9dca-59751c36a2b8"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > lang parameter > falls back to English when an unknown ?lang=xx is given +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"b047f5b7-a936-4878-9206-79e2c3804768"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > lang parameter > falls back to English when an unknown ?lang=xx is given +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":3,"requestId":"b047f5b7-a936-4878-9206-79e2c3804768"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > font parameter sanitization > uses the default font when font param is omitted +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"4833d30c-a089-42fd-ae4a-1f6d35f23e65"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > font parameter sanitization > uses the default font when font param is omitted +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"4833d30c-a089-42fd-ae4a-1f6d35f23e65"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > font parameter sanitization > uses the default font when font param is an empty string +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"313dbeaa-4644-451a-ac97-a846d3e36cdc"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > font parameter sanitization > uses the default font when font param is an empty string +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"313dbeaa-4644-451a-ac97-a846d3e36cdc"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > font parameter sanitization > uses the default font when font param is whitespace only +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"26521b0c-1540-4b83-abed-cccdde849b26"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > font parameter sanitization > uses the default font when font param is whitespace only +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":0,"requestId":"26521b0c-1540-4b83-abed-cccdde849b26"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > font parameter sanitization > passes a valid predefined font name through to the SVG +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"da3bf44f-281d-478e-b917-5320d7efabe2"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > font parameter sanitization > passes a valid predefined font name through to the SVG +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":7,"requestId":"da3bf44f-281d-478e-b917-5320d7efabe2"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > font parameter sanitization > passes a valid custom font name through and emits a Google Fonts import +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"7ebcce59-778a-4d36-9a0d-1a99842651ed"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > font parameter sanitization > passes a valid custom font name through and emits a Google Fonts import +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"7ebcce59-778a-4d36-9a0d-1a99842651ed"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > font parameter sanitization > encodes spaces in multi-word font names as "+" in the Google Fonts URL +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"b50691fd-e43a-46fa-bf0e-e6dcf8dbbfe3"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > font parameter sanitization > encodes spaces in multi-word font names as "+" in the Google Fonts URL +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"b50691fd-e43a-46fa-bf0e-e6dcf8dbbfe3"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > font parameter sanitization > falls back to the default font when font contains only special characters +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"cdfb057f-251d-463d-b1ac-f4f9bbeebac2"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > font parameter sanitization > falls back to the default font when font contains only special characters +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"cdfb057f-251d-463d-b1ac-f4f9bbeebac2"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > font parameter sanitization > strips dangerous characters from a font name containing a double-quote +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"e04568a1-f197-4bc5-ad84-777b6fbaa177"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > font parameter sanitization > strips dangerous characters from a font name containing a double-quote +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"e04568a1-f197-4bc5-ad84-777b6fbaa177"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > font parameter sanitization > rejects a font name containing a semicolon (CSS injection attempt) +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"32bf5a31-ad2f-4f4d-8352-37f3f12ae51e"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > font parameter sanitization > rejects a font name containing a semicolon (CSS injection attempt) +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"32bf5a31-ad2f-4f4d-8352-37f3f12ae51e"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > font parameter sanitization > strips special characters from a URL-like font name (path traversal / injection attempt) +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"2efc4c33-5a4c-4344-9fd2-e195df3206b3"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > font parameter sanitization > strips special characters from a URL-like font name (path traversal / injection attempt) +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"2efc4c33-5a4c-4344-9fd2-e195df3206b3"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > font parameter sanitization > rejects a font name containing a script tag (XSS attempt) +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"9b57d6e7-370d-42b3-a85a-9e9e8083a9e2"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > font parameter sanitization > rejects a font name containing a script tag (XSS attempt) +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"9b57d6e7-370d-42b3-a85a-9e9e8083a9e2"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > font parameter sanitization > does not emit a Google Fonts import when a predefined font is used +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"2b9cbe5c-8452-4329-a6fc-ed1d37943261"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > font parameter sanitization > does not emit a Google Fonts import when a predefined font is used +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"2b9cbe5c-8452-4329-a6fc-ed1d37943261"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > font parameter sanitization > returns 200 and a valid SVG even when an extreme font value is supplied +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"b36acdb8-9ac2-4828-a122-654fb959d133"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > font parameter sanitization > returns 200 and a valid SVG even when an extreme font value is supplied +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"b36acdb8-9ac2-4828-a122-654fb959d133"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > font parameter sanitization > passes custom font name and emits Google Fonts import under theme=auto +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"7a23b812-2453-46d4-a670-39a553ebd8c3"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > font parameter sanitization > passes custom font name and emits Google Fonts import under theme=auto +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"7a23b812-2453-46d4-a670-39a553ebd8c3"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > font parameter sanitization > route-level: ?font=jetbrains returns SVG containing JetBrains Mono +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"1ea542c9-77ce-4874-8b82-782d8f5a0de8"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > font parameter sanitization > route-level: ?font=jetbrains returns SVG containing JetBrains Mono +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"1ea542c9-77ce-4874-8b82-782d8f5a0de8"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > font parameter sanitization > route-level: ?font=Inter returns SVG containing Google Fonts import URL +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"728c2358-5d33-41e2-b708-e63db58fc723"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > font parameter sanitization > route-level: ?font=Inter returns SVG containing Google Fonts import URL +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"728c2358-5d33-41e2-b708-e63db58fc723"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > font parameter sanitization > route-level: empty ?font falls back to default font +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"39ade089-8f81-4f87-b28e-6bd9991adcef"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > font parameter sanitization > route-level: empty ?font falls back to default font +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"39ade089-8f81-4f87-b28e-6bd9991adcef"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > stale-while-revalidate cache header > contains stale-while-revalidate=59 for normal request +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"6fd8fa63-8b15-4eed-bc4b-863d6360eb27"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > stale-while-revalidate cache header > contains stale-while-revalidate=59 for normal request +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":0,"requestId":"6fd8fa63-8b15-4eed-bc4b-863d6360eb27"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > stale-while-revalidate cache header > does NOT contain stale-while-revalidate when ?refresh=true +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"4e55bfa7-813b-4fd3-9f8b-f624a8ab794d"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > stale-while-revalidate cache header > does NOT contain stale-while-revalidate when ?refresh=true +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"4e55bfa7-813b-4fd3-9f8b-f624a8ab794d"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > falls back to commits mode when ?mode=unknown is given +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"7bbd2641-6163-46b0-a79d-d3e2a6417b3e"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > falls back to commits mode when ?mode=unknown is given +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"7bbd2641-6163-46b0-a79d-d3e2a6417b3e"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > org parameter validation > returns 400 when org parameter is a User instead of an Organization +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"3c1a2fe4-1b1a-4a5a-8f86-f78c5b8cb459"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > org parameter validation > returns 400 when org parameter is a User instead of an Organization +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"3c1a2fe4-1b1a-4a5a-8f86-f78c5b8cb459"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > multi-user skyline merges > fetches calendars concurrently, aggregates them, and overrides the title in the SVG +[INFO] Incoming streak request {"source":"streak","user":"a, b","view":"default","requestId":"6486c01f-b468-4384-9013-776b40749323"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > multi-user skyline merges > fetches calendars concurrently, aggregates them, and overrides the title in the SVG +[INFO] Streak request completed {"source":"streak","user":"a, b","view":"default","format":"svg","status":200,"durationMs":4,"requestId":"6486c01f-b468-4384-9013-776b40749323"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > multi-user skyline merges > gracefully handles partial fetch failures by filtering out failed calendars +[INFO] Incoming streak request {"source":"streak","user":"a, b","view":"default","requestId":"0253832e-2abf-4aee-be59-64a1ed660e7e"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > multi-user skyline merges > gracefully handles partial fetch failures by filtering out failed calendars +[INFO] Streak request completed {"source":"streak","user":"a, b","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"0253832e-2abf-4aee-be59-64a1ed660e7e"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > multi-user skyline merges > returns a 404/error response when all users in the list fail to load +[INFO] Incoming streak request {"source":"streak","user":"a, b","view":"default","requestId":"e531ee07-0730-4c2f-bcef-b4fd3f54de2f"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > multi-user skyline merges > returns a 404/error response when all users in the list fail to load +[INFO] Streak request completed {"source":"streak","user":"a, b","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"e531ee07-0730-4c2f-bcef-b4fd3f54de2f"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > multi-user skyline merges > rejects requests with more than 7 users with a 400 Bad Request +[INFO] Incoming streak request {"source":"streak","user":"a, b, c, d, e, f, g, h","view":"default","requestId":"b175da5a-cbac-42d3-a24d-d2982757e3a2"} +[INFO] Streak request completed {"source":"streak","user":"a, b, c, d, e, f, g, h","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"b175da5a-cbac-42d3-a24d-d2982757e3a2"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > grace parameter boundary validation > returns 200 and accepts grace=0 (minimum boundary) +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"a91a4b61-8bcc-4361-b460-82a3e50b142a"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > grace parameter boundary validation > returns 200 and accepts grace=0 (minimum boundary) +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"a91a4b61-8bcc-4361-b460-82a3e50b142a"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > grace parameter boundary validation > returns 200 and accepts grace=7 (maximum boundary) +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"13bf3251-7d8a-4e12-a70d-ee068574faa3"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > grace parameter boundary validation > returns 200 and accepts grace=7 (maximum boundary) +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"13bf3251-7d8a-4e12-a70d-ee068574faa3"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > grace parameter boundary validation > clamps grace=8 to 7 +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"bc0de2f2-4138-408f-8ca0-37837c4a0e3d"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > grace parameter boundary validation > clamps grace=8 to 7 +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"bc0de2f2-4138-408f-8ca0-37837c4a0e3d"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > grace parameter boundary validation > clamps grace=999 to 7 +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"252066cd-6ea2-4ad7-9017-1b77847f47ae"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > grace parameter boundary validation > clamps grace=999 to 7 +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"252066cd-6ea2-4ad7-9017-1b77847f47ae"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > grace parameter boundary validation > clamps grace=-1 to 0 +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"1f94a94c-3410-44f1-91db-e71851d95ca6"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > grace parameter boundary validation > clamps grace=-1 to 0 +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"1f94a94c-3410-44f1-91db-e71851d95ca6"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > grace parameter boundary validation > clamps grace=-99 to 0 +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"46df6e32-74df-45e7-8b74-aa84557c3fbb"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > grace parameter boundary validation > clamps grace=-99 to 0 +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"46df6e32-74df-45e7-8b74-aa84557c3fbb"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > grace parameter boundary validation > falls back to 1 for non-numeric grace +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"01351a69-d0e4-49e6-9a0f-cbb579a47b65"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > grace parameter boundary validation > falls back to 1 for non-numeric grace +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"01351a69-d0e4-49e6-9a0f-cbb579a47b65"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > grace parameter boundary validation > falls back to 1 for float grace value +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"b3a5b07f-3e5f-445e-9f6d-3adfc6e2e031"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > grace parameter boundary validation > falls back to 1 for float grace value +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"b3a5b07f-3e5f-445e-9f6d-3adfc6e2e031"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > grace parameter boundary validation > falls back to 1 for grace with special characters +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"f6400851-4e9f-4c33-8bbe-3f74eb6a3175"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > grace parameter boundary validation > falls back to 1 for grace with special characters +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"f6400851-4e9f-4c33-8bbe-3f74eb6a3175"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > opacity parameter boundary validation > returns 200 and accepts opacity=0.1 (minimum boundary) +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"ccb6e155-f8c3-4573-b5d9-c306398c8622"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > opacity parameter boundary validation > returns 200 and accepts opacity=0.1 (minimum boundary) +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"ccb6e155-f8c3-4573-b5d9-c306398c8622"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > opacity parameter boundary validation > returns 200 and accepts opacity=1.0 (maximum boundary) +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"4d8d3ec4-81cd-49d4-9f38-19f226853c5d"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > opacity parameter boundary validation > returns 200 and accepts opacity=1.0 (maximum boundary) +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"4d8d3ec4-81cd-49d4-9f38-19f226853c5d"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > opacity parameter boundary validation > returns 200 with clamped opacity when opacity is 0.0 (below minimum) +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"dbcb375e-899a-4a8f-91a0-8c88f5d91aa9"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > opacity parameter boundary validation > returns 200 with clamped opacity when opacity is 0.0 (below minimum) +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"dbcb375e-899a-4a8f-91a0-8c88f5d91aa9"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > opacity parameter boundary validation > returns 200 with clamped opacity when opacity is negative (-0.5) +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"71a0ed98-fd63-4e87-80a6-848550f988a2"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > opacity parameter boundary validation > returns 200 with clamped opacity when opacity is negative (-0.5) +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"71a0ed98-fd63-4e87-80a6-848550f988a2"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > opacity parameter boundary validation > returns 200 with clamped opacity when opacity exceeds max (1.5) +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"166ee2b6-3d50-4c80-905e-902a486eee4c"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > opacity parameter boundary validation > returns 200 with clamped opacity when opacity exceeds max (1.5) +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"166ee2b6-3d50-4c80-905e-902a486eee4c"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > opacity parameter boundary validation > returns 200 with clamped opacity when opacity far exceeds max (99.0) +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"6d3dda74-535c-464e-a64a-505f0ff3c736"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > opacity parameter boundary validation > returns 200 with clamped opacity when opacity far exceeds max (99.0) +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"6d3dda74-535c-464e-a64a-505f0ff3c736"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > opacity parameter boundary validation > returns 200 and defaults to opacity=1.0 when opacity is empty string +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"7703c4e8-2166-4f27-b35a-c16168e70ec1"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > opacity parameter boundary validation > returns 200 and defaults to opacity=1.0 when opacity is empty string +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"7703c4e8-2166-4f27-b35a-c16168e70ec1"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > opacity parameter boundary validation > returns 200 and defaults to opacity=1.0 when opacity is non-numeric +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"f9718bb4-f854-4ef3-8c9b-2d033768aa00"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > opacity parameter boundary validation > returns 200 and defaults to opacity=1.0 when opacity is non-numeric +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"f9718bb4-f854-4ef3-8c9b-2d033768aa00"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > opacity parameter boundary validation > returns 200 when opacity contains only whitespace +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"e731384f-554f-4dfa-bda8-105958c7f4c3"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > opacity parameter boundary validation > returns 200 when opacity contains only whitespace +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":3,"requestId":"e731384f-554f-4dfa-bda8-105958c7f4c3"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > opacity parameter boundary validation > returns 200 with clamped opacity for very small positive value (0.01) +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"de7891fb-09ca-4781-bf8b-7f724a40d830"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > opacity parameter boundary validation > returns 200 with clamped opacity for very small positive value (0.01) +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"de7891fb-09ca-4781-bf8b-7f724a40d830"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > opacity parameter boundary validation > returns 200 with clamped opacity for edge case between min and just below (0.09) +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"de19816f-fd45-4d00-969f-c0cc05d053a3"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > opacity parameter boundary validation > returns 200 with clamped opacity for edge case between min and just below (0.09) +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"de19816f-fd45-4d00-969f-c0cc05d053a3"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > opacity parameter boundary validation > returns 200 for various valid opacity values in acceptable range +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"279f41af-2c33-429e-8455-a862dbcaf70c"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > opacity parameter boundary validation > returns 200 for various valid opacity values in acceptable range +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"279f41af-2c33-429e-8455-a862dbcaf70c"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > opacity parameter boundary validation > returns 200 for various valid opacity values in acceptable range +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"9fc7d82a-0c93-4194-815e-8028a5f8764f"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > opacity parameter boundary validation > returns 200 for various valid opacity values in acceptable range +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"9fc7d82a-0c93-4194-815e-8028a5f8764f"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > opacity parameter boundary validation > returns 200 for various valid opacity values in acceptable range +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"e94073f3-662f-45fe-8a89-45a8b16f76d9"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > opacity parameter boundary validation > returns 200 for various valid opacity values in acceptable range +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":5,"requestId":"e94073f3-662f-45fe-8a89-45a8b16f76d9"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > opacity parameter boundary validation > returns 200 for various valid opacity values in acceptable range +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"57d03743-51ca-4f67-a837-38b8234b8526"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > opacity parameter boundary validation > returns 200 for various valid opacity values in acceptable range +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":10,"requestId":"57d03743-51ca-4f67-a837-38b8234b8526"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > opacity parameter boundary validation > returns 200 for various valid opacity values in acceptable range +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"e594cf66-f1b1-4703-988d-36c7d2caa840"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > opacity parameter boundary validation > returns 200 for various valid opacity values in acceptable range +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":6,"requestId":"e594cf66-f1b1-4703-988d-36c7d2caa840"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > opacity parameter boundary validation > returns 200 for various valid opacity values in acceptable range +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"954fed7a-ad4c-4555-8112-df85f7113603"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > opacity parameter boundary validation > returns 200 for various valid opacity values in acceptable range +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"954fed7a-ad4c-4555-8112-df85f7113603"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > opacity parameter boundary validation > returns 200 when opacity is scientific notation string (ignored) +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"80db753a-da69-4c71-bf18-822b26d59c2c"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > opacity parameter boundary validation > returns 200 when opacity is scientific notation string (ignored) +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"80db753a-da69-4c71-bf18-822b26d59c2c"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > opacity parameter boundary validation > returns 200 when opacity contains special characters mixed with numbers +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"8a2eae3c-064f-4a6b-92ec-6d208242080b"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > opacity parameter boundary validation > returns 200 when opacity contains special characters mixed with numbers +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"8a2eae3c-064f-4a6b-92ec-6d208242080b"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > combined grace and opacity boundary validation > returns 200 with both grace and opacity at minimum boundaries +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"3f58d166-9b8b-4ecb-8625-62935d3ad2b7"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > combined grace and opacity boundary validation > returns 200 with both grace and opacity at minimum boundaries +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":4,"requestId":"3f58d166-9b8b-4ecb-8625-62935d3ad2b7"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > combined grace and opacity boundary validation > returns 200 with both grace and opacity at maximum boundaries +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"e74fd55f-46bc-46d3-bdbb-a14983861e96"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > combined grace and opacity boundary validation > returns 200 with both grace and opacity at maximum boundaries +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"e74fd55f-46bc-46d3-bdbb-a14983861e96"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > combined grace and opacity boundary validation > clamps both grace and opacity when both exceed max +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"6f01397b-3c31-402d-97ba-dc00029712b4"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > combined grace and opacity boundary validation > clamps both grace and opacity when both exceed max +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"6f01397b-3c31-402d-97ba-dc00029712b4"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > combined grace and opacity boundary validation > falls back grace to 1 when invalid, returns 200 with valid opacity +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"61884d22-859b-40f7-8c5f-e4b8cc9746f5"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > combined grace and opacity boundary validation > falls back grace to 1 when invalid, returns 200 with valid opacity +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"61884d22-859b-40f7-8c5f-e4b8cc9746f5"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > combined grace and opacity boundary validation > returns 200 when grace is valid but opacity is invalid (defaults) +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"a9952b31-f64d-4b4d-8f71-5ee626823b27"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > combined grace and opacity boundary validation > returns 200 when grace is valid but opacity is invalid (defaults) +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"a9952b31-f64d-4b4d-8f71-5ee626823b27"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > date parameter validation (Variation 2) > returns 400 Bad Request when ?date= is "2026-15-40" (malformed ISO 8601) +[INFO] Incoming streak request {"source":"streak","requestId":"08793033-f541-4856-bc52-faee2f4cef00"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > date parameter validation (Variation 2) > returns a structured error body containing 'Invalid "date" format' for "2026-15-40" +[INFO] Incoming streak request {"source":"streak","requestId":"4632cd70-e3c4-4bc8-bb9d-826bc3c30847"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > date parameter validation (Variation 2) > does not call fetchGitHubContributions when ?date= is malformed +[INFO] Incoming streak request {"source":"streak","requestId":"2f901afd-2685-43f6-b8eb-2037129d9f0f"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > date parameter validation (Variation 2) > returns 400 for ?date= with invalid month value "2026-13-01" +[INFO] Incoming streak request {"source":"streak","requestId":"6990fdd5-79dd-4332-814b-dbe76c739896"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > date parameter validation (Variation 2) > returns 400 for a freeform string ?date=not-a-date +[INFO] Incoming streak request {"source":"streak","requestId":"c5c599a8-5b71-47cf-a836-33c0590ab429"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > date parameter validation (Variation 2) > returns 200 for a valid ?date= in ISO 8601 format +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"fe4591bf-0197-46ac-b589-01e31a20e3a9"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > date parameter validation (Variation 2) > returns 200 for a valid ?date= in ISO 8601 format +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"fe4591bf-0197-46ac-b589-01e31a20e3a9"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > user parameter maxLength validation (Variation 5) > returns 400 Bad Request when ?user= is exactly 40 characters long +[INFO] Incoming streak request {"source":"streak","requestId":"0203b700-41b9-4f59-b448-09caba994b11"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > user parameter maxLength validation (Variation 5) > returns an error body containing "cannot exceed 39 characters" for a 40-char username +[INFO] Incoming streak request {"source":"streak","requestId":"f768e2cb-5bc8-4e7b-ba4c-0337c123e866"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > user parameter maxLength validation (Variation 5) > does not call fetchGitHubContributions when the username exceeds 39 characters +[INFO] Incoming streak request {"source":"streak","requestId":"75c55578-e106-460b-8cb6-d9dcf27817c6"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > user parameter maxLength validation (Variation 5) > returns 200 OK for a valid username at the 39-character boundary +[INFO] Incoming streak request {"source":"streak","user":"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa","view":"default","requestId":"69c86c8c-dc27-4d7b-9ecc-f2b7d9d1d129"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > user parameter maxLength validation (Variation 5) > returns 200 OK for a valid username at the 39-character boundary +[INFO] Streak request completed {"source":"streak","user":"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"69c86c8c-dc27-4d7b-9ecc-f2b7d9d1d129"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > user parameter maxLength validation (Variation 5) > returns 400 and fieldErrors.user with maxLength message when using NextRequest with 40-char username +[INFO] Incoming streak request {"source":"streak","requestId":"c37b02d6-9680-49e4-a41e-2b04241c55ed"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > minify parameter > minifies the SVG by default (minify=true) +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"248fb82c-80f0-4a00-8077-27d8a46fc218"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > minify parameter > minifies the SVG by default (minify=true) +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":3,"requestId":"248fb82c-80f0-4a00-8077-27d8a46fc218"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > minify parameter > minifies the SVG by default (minify=true) +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"349e4a2a-7223-48ee-bb17-0b7295c74d8d"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > minify parameter > minifies the SVG by default (minify=true) +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":4,"requestId":"349e4a2a-7223-48ee-bb17-0b7295c74d8d"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > minify parameter > does not minify the SVG when minify=false +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"5c85338d-0ef1-4ff9-9b35-ad18184c3314"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > minify parameter > does not minify the SVG when minify=false +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":4,"requestId":"5c85338d-0ef1-4ff9-9b35-ad18184c3314"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > minify parameter > does not minify the SVG when minify=false +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"f8ebba8d-8193-4352-a91c-7fa95b90aa5d"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > minify parameter > does not minify the SVG when minify=false +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"f8ebba8d-8193-4352-a91c-7fa95b90aa5d"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > normalizes cache keys by sorting query parameters alphabetically +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"62efb68e-b0cd-47e9-a18e-880ecb78b7e9"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > normalizes cache keys by sorting query parameters alphabetically +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":3,"requestId":"62efb68e-b0cd-47e9-a18e-880ecb78b7e9"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > normalizes cache keys by sorting query parameters alphabetically +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"8e27eabd-d8f3-4f0f-bbdc-9b1c42ebaaf7"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > normalizes cache keys by sorting query parameters alphabetically +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"8e27eabd-d8f3-4f0f-bbdc-9b1c42ebaaf7"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"ad67ce07-b892-489d-801a-dce8e2714137"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"ad67ce07-b892-489d-801a-dce8e2714137"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"247086c8-633f-43df-b9d2-451e74cf164f"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"247086c8-633f-43df-b9d2-451e74cf164f"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"b0afdce0-38a2-4f32-b9d6-21ec5a93b93a"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"b0afdce0-38a2-4f32-b9d6-21ec5a93b93a"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"5deccb2c-87e5-4758-9a17-98eda9c43884"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"5deccb2c-87e5-4758-9a17-98eda9c43884"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"e00eb400-293d-496b-b1ad-095513f7c264"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"e00eb400-293d-496b-b1ad-095513f7c264"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"f2b819be-fa4d-4803-bed7-4099a5321a16"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"f2b819be-fa4d-4803-bed7-4099a5321a16"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"b3650aff-ae64-4428-85b4-212ed80904a0"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"b3650aff-ae64-4428-85b4-212ed80904a0"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"e9f72317-0322-47ac-b52a-1c949fa42d9f"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"e9f72317-0322-47ac-b52a-1c949fa42d9f"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"f802a982-7a5c-4076-9f30-dc0439942503"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"f802a982-7a5c-4076-9f30-dc0439942503"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"e46d86bb-cc0d-4ba0-81f0-cff6b9d3f714"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"e46d86bb-cc0d-4ba0-81f0-cff6b9d3f714"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"d9657368-5211-4f2d-b13f-22dd795a04d5"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":0,"requestId":"d9657368-5211-4f2d-b13f-22dd795a04d5"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"18627887-9070-4673-a831-10d714273381"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":3,"requestId":"18627887-9070-4673-a831-10d714273381"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"83e8363f-a2be-4fcd-b8fd-3ef0a15b54dd"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"83e8363f-a2be-4fcd-b8fd-3ef0a15b54dd"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"bcb4c757-6665-4847-a5d4-2187798318f9"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":3,"requestId":"bcb4c757-6665-4847-a5d4-2187798318f9"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"8b71c869-ef70-4b2a-ae27-a8cede1c4b51"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"8b71c869-ef70-4b2a-ae27-a8cede1c4b51"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"a581f12d-7ee7-4995-847d-6b23d7988678"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"a581f12d-7ee7-4995-847d-6b23d7988678"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"1dadc1b7-197f-4b76-b7e2-693bc5699ba8"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"1dadc1b7-197f-4b76-b7e2-693bc5699ba8"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"5c65f83b-dafd-4c33-ac57-4a8528c6e402"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"5c65f83b-dafd-4c33-ac57-4a8528c6e402"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"67f3b204-bb31-4981-a1b2-c0a4024649a7"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":3,"requestId":"67f3b204-bb31-4981-a1b2-c0a4024649a7"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"6a40d90d-abb5-4929-9bad-c93570975737"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":4,"requestId":"6a40d90d-abb5-4929-9bad-c93570975737"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"aac482cd-a5ae-40a0-b942-a893a3189cae"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":9,"requestId":"aac482cd-a5ae-40a0-b942-a893a3189cae"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"b5ae41db-1308-4fac-b9c7-9f9483d6aac4"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":3,"requestId":"b5ae41db-1308-4fac-b9c7-9f9483d6aac4"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"03113711-bcb3-4b91-aa3e-5954c3e1a545"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":3,"requestId":"03113711-bcb3-4b91-aa3e-5954c3e1a545"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"4fce8cb4-1403-4e56-8778-22fe62aaec3a"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"4fce8cb4-1403-4e56-8778-22fe62aaec3a"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"8ca35cf0-ef44-4740-b61b-a9ce7413f5d5"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"8ca35cf0-ef44-4740-b61b-a9ce7413f5d5"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"e4c9edbf-10af-41bf-a9c2-80efb2f1d657"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"e4c9edbf-10af-41bf-a9c2-80efb2f1d657"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"3ebda0d2-33b4-4aff-beae-25c890f7e67d"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"3ebda0d2-33b4-4aff-beae-25c890f7e67d"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"98a95d7d-6af1-424e-af3c-723836870449"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"98a95d7d-6af1-424e-af3c-723836870449"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"3418cffa-b91c-4924-9de1-4fbdffc9affb"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"3418cffa-b91c-4924-9de1-4fbdffc9affb"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"be68969d-6c66-4a40-b75c-49a62acc54ea"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"be68969d-6c66-4a40-b75c-49a62acc54ea"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"492ba53d-c75b-4391-873b-3b7d341b1c54"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"492ba53d-c75b-4391-873b-3b7d341b1c54"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"1ec943e4-d93f-4ec5-a7dc-9f5b240524e6"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"1ec943e4-d93f-4ec5-a7dc-9f5b240524e6"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"d1f8dd54-c269-47f4-91ac-04aeaf50c510"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":3,"requestId":"d1f8dd54-c269-47f4-91ac-04aeaf50c510"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"ef5ab7ee-e57f-45e4-bea1-533c51340e47"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"ef5ab7ee-e57f-45e4-bea1-533c51340e47"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"908de801-6247-481e-b831-70538544f60f"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"908de801-6247-481e-b831-70538544f60f"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"74765b57-ea39-4d38-8ff2-7d38174923c3"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":4,"requestId":"74765b57-ea39-4d38-8ff2-7d38174923c3"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"b18a0731-b455-44d8-bd1e-3fd3a1b58b09"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"b18a0731-b455-44d8-bd1e-3fd3a1b58b09"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"2bc39d9e-86c1-42d9-b791-2853c5aa49ec"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"2bc39d9e-86c1-42d9-b791-2853c5aa49ec"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"17fe2899-6434-4bf3-83ad-27ef1dfc1701"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":3,"requestId":"17fe2899-6434-4bf3-83ad-27ef1dfc1701"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"145f4b1b-c794-4392-bd78-95bab41fcf12"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"145f4b1b-c794-4392-bd78-95bab41fcf12"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"4f3a0266-d9fa-414c-aa0e-7a8db7c3b5b5"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"4f3a0266-d9fa-414c-aa0e-7a8db7c3b5b5"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"68b34c9c-10cf-41d5-b6b5-580bbd26aed1"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"68b34c9c-10cf-41d5-b6b5-580bbd26aed1"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"e59416b4-c13a-47f6-9638-85603acc1630"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"e59416b4-c13a-47f6-9638-85603acc1630"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"49b0d83f-d495-491e-b69a-dda8516f6b0e"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"49b0d83f-d495-491e-b69a-dda8516f6b0e"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"680c33eb-2a0c-4730-8564-f7f383aab6dd"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"680c33eb-2a0c-4730-8564-f7f383aab6dd"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"c4085fd7-273b-43ff-add5-b9bae63af0b6"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":3,"requestId":"c4085fd7-273b-43ff-add5-b9bae63af0b6"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"17303b7a-d744-40fb-8d3d-e1229b222a92"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"17303b7a-d744-40fb-8d3d-e1229b222a92"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"259df096-cb14-4082-ba3a-0ede76f0c4da"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"259df096-cb14-4082-ba3a-0ede76f0c4da"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"8bb28d88-b030-40c8-9af3-899adc9d6950"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":3,"requestId":"8bb28d88-b030-40c8-9af3-899adc9d6950"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"81180816-4953-464a-a7d0-739f24207cca"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"81180816-4953-464a-a7d0-739f24207cca"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"20203b91-b0b1-4bac-9b2a-57ee0052d8b0"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"20203b91-b0b1-4bac-9b2a-57ee0052d8b0"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"8d020976-469f-4289-96da-c3d4597bf7d5"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"8d020976-469f-4289-96da-c3d4597bf7d5"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"5fa7295a-a8f7-4b13-a740-63c931e003bd"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"5fa7295a-a8f7-4b13-a740-63c931e003bd"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"ba770892-2156-4745-b5a1-d1f3edd60b81"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"ba770892-2156-4745-b5a1-d1f3edd60b81"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"3ba46717-228c-4919-953d-f6f1ab090606"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"3ba46717-228c-4919-953d-f6f1ab090606"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"0bf1f836-3e6c-42e5-b251-049b2d1c5f6d"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"0bf1f836-3e6c-42e5-b251-049b2d1c5f6d"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"25b7db72-843b-417f-91e8-0bc0b19f0645"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"25b7db72-843b-417f-91e8-0bc0b19f0645"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"5fa5af45-4dd8-4618-9e44-10aa4c213a68"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"5fa5af45-4dd8-4618-9e44-10aa4c213a68"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"c1887718-2856-4fbd-9464-4ffffc75a476"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":4,"requestId":"c1887718-2856-4fbd-9464-4ffffc75a476"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"b1f8a752-3be5-484b-8b0d-290bcc33ba98"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"b1f8a752-3be5-484b-8b0d-290bcc33ba98"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"5dbfa850-08db-46ab-b0a5-f0eeec2abf14"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":3,"requestId":"5dbfa850-08db-46ab-b0a5-f0eeec2abf14"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"3ca85853-d418-48a2-b0c3-efa42daa60c6"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"3ca85853-d418-48a2-b0c3-efa42daa60c6"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"6fb00813-309b-45d1-b717-33a437876070"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"6fb00813-309b-45d1-b717-33a437876070"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"1ed4c2d9-bd80-47e2-9c36-90118ab64859"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"1ed4c2d9-bd80-47e2-9c36-90118ab64859"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"65f02f91-379e-4e8c-805a-7aaad7e252a7"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"65f02f91-379e-4e8c-805a-7aaad7e252a7"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"146cc2e1-62ce-43fc-a31e-d4bdf463f49d"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"146cc2e1-62ce-43fc-a31e-d4bdf463f49d"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"1b8a9ffc-e42d-4314-9e36-89caaaf110bd"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"1b8a9ffc-e42d-4314-9e36-89caaaf110bd"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"8544caa3-cdf4-4048-b797-5854155d4535"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"8544caa3-cdf4-4048-b797-5854155d4535"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"63c80927-98e3-460d-97a0-671fd8c843b8"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"63c80927-98e3-460d-97a0-671fd8c843b8"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"ae6e1b3a-f62a-4732-bf54-668d00485ad9"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"ae6e1b3a-f62a-4732-bf54-668d00485ad9"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"5dd5528a-8661-40f0-ada5-032ae37d5c1c"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"5dd5528a-8661-40f0-ada5-032ae37d5c1c"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"4c0d8e42-4ff7-4e65-9bc0-c369ebc7c40c"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":3,"requestId":"4c0d8e42-4ff7-4e65-9bc0-c369ebc7c40c"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"940bf50d-34b3-4b6c-ab3d-56d331ef61e9"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"940bf50d-34b3-4b6c-ab3d-56d331ef61e9"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"8601e332-16df-48da-84e5-0ab0379e2479"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":3,"requestId":"8601e332-16df-48da-84e5-0ab0379e2479"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"c0b75a70-0060-410e-ae93-49e7cdcfc429"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"c0b75a70-0060-410e-ae93-49e7cdcfc429"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"fb44b6ea-e838-45f7-967a-8efb7fb43843"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":5,"requestId":"fb44b6ea-e838-45f7-967a-8efb7fb43843"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"aa1a2ec8-7973-4717-bb2e-0a72b5ee59a9"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"aa1a2ec8-7973-4717-bb2e-0a72b5ee59a9"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"6b60095b-78c2-4e63-a177-82a441cc545b"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"6b60095b-78c2-4e63-a177-82a441cc545b"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"1455a90a-9570-45ad-8254-6285d998bf68"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"1455a90a-9570-45ad-8254-6285d998bf68"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"6556140d-2a85-478e-9113-5371149e9bb5"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"6556140d-2a85-478e-9113-5371149e9bb5"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"877f4287-2292-4442-93ff-8d105fdcc8db"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"877f4287-2292-4442-93ff-8d105fdcc8db"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"72bace3c-36f6-4d31-8e13-3f8e1d3e80e6"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"72bace3c-36f6-4d31-8e13-3f8e1d3e80e6"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"5b4a928e-1c20-441e-95a4-c649944943cd"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"5b4a928e-1c20-441e-95a4-c649944943cd"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"80eab805-478d-4e61-ad2c-6d2508f37ad2"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"80eab805-478d-4e61-ad2c-6d2508f37ad2"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"6425a7c9-f2c2-40a4-b7e8-1182b7f6b52f"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":0,"requestId":"6425a7c9-f2c2-40a4-b7e8-1182b7f6b52f"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"c5da261b-ba73-4cc7-81a9-4d224122607e"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"c5da261b-ba73-4cc7-81a9-4d224122607e"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"8a3d11db-d946-47ad-9efa-f393e5f9b32d"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"8a3d11db-d946-47ad-9efa-f393e5f9b32d"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"1f45176d-c52c-48d8-8f2c-3a0b3c65063b"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"1f45176d-c52c-48d8-8f2c-3a0b3c65063b"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"f7f8f595-cf40-49f5-89aa-1c64063dc67e"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"f7f8f595-cf40-49f5-89aa-1c64063dc67e"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"ae229ce8-5b1f-424a-99f9-f210d0f47847"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":3,"requestId":"ae229ce8-5b1f-424a-99f9-f210d0f47847"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"93588057-7cd5-437c-9627-240731f6afcd"} + +stderr | lib/github.test.ts > fetchGitHubContributions > body-level RATE_LIMITED retry (HTTP 200) > retries with backoff when GitHub returns RATE_LIMITED inside a 200 OK body +[CommitPulse API] Empty profile or null repository nodes discovered for user "octocat". Falling back to baseline collection. + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":6,"requestId":"93588057-7cd5-437c-9627-240731f6afcd"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"a5d7ff2f-8190-4038-91bc-102ed007e2cd"} + +stderr | lib/github.test.ts > fetchGitHubContributions > handles calendar with all days having zero contributions +[CommitPulse API] Empty profile or null repository nodes discovered for user "sparse-user". Falling back to baseline collection. + +stderr | lib/github.test.ts > fetchGitHubContributions > is deterministic: two calls with empty-year response return identical data +[CommitPulse API] Empty profile or null repository nodes discovered for user "empty-user". Falling back to baseline collection. + +stderr | lib/github.test.ts > fetchGitHubContributions > is deterministic: two calls with empty-year response return identical data +[CommitPulse API] Empty profile or null repository nodes discovered for user "empty-user". Falling back to baseline collection. + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"a5d7ff2f-8190-4038-91bc-102ed007e2cd"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"ccf7119e-4432-4d0b-8bf9-e0cc46fc7f27"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":3,"requestId":"ccf7119e-4432-4d0b-8bf9-e0cc46fc7f27"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"76659ffb-8d9a-4dbb-97d1-c96c7678fe16"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":6,"requestId":"76659ffb-8d9a-4dbb-97d1-c96c7678fe16"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"b2c2b5f3-3825-4f62-93b2-f1296ce774bc"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"b2c2b5f3-3825-4f62-93b2-f1296ce774bc"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"f6f8c378-36c8-4507-ba0a-745f522b23fa"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"f6f8c378-36c8-4507-ba0a-745f522b23fa"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"ac4510d4-d1e7-4752-b835-5a328d42c8b1"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"ac4510d4-d1e7-4752-b835-5a328d42c8b1"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"a41f1eb2-b6df-4b10-8f5a-36d93ece5556"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"a41f1eb2-b6df-4b10-8f5a-36d93ece5556"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"459854c2-26eb-48c7-bdfb-fb18fe82456f"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":9,"requestId":"459854c2-26eb-48c7-bdfb-fb18fe82456f"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"e9f34e25-ecd4-4739-b6d8-8c74e6d17eef"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":0,"requestId":"e9f34e25-ecd4-4739-b6d8-8c74e6d17eef"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"0f8d9427-9aff-48de-8b55-bee95ddd9319"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"0f8d9427-9aff-48de-8b55-bee95ddd9319"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"4c891937-dad6-4fc6-8fd5-ce95d0e769d8"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"4c891937-dad6-4fc6-8fd5-ce95d0e769d8"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"13901192-9235-4fc9-9ee7-79f3c795bbda"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"13901192-9235-4fc9-9ee7-79f3c795bbda"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"5ee646dc-a6dd-4d3b-840f-34661580b058"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"5ee646dc-a6dd-4d3b-840f-34661580b058"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"0a7fdd01-2044-403e-9ede-6dd2269bd85b"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"0a7fdd01-2044-403e-9ede-6dd2269bd85b"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"7a5f767f-5392-4b6f-8877-bb952736f998"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":0,"requestId":"7a5f767f-5392-4b6f-8877-bb952736f998"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"8964fb23-b7cf-4cab-8737-8d6db9df3340"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":3,"requestId":"8964fb23-b7cf-4cab-8737-8d6db9df3340"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"c413f356-5c86-453c-8056-38db6dbef25b"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"c413f356-5c86-453c-8056-38db6dbef25b"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"fa33827b-4c3a-4023-8f3c-10fef62c8df5"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"fa33827b-4c3a-4023-8f3c-10fef62c8df5"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"e049949c-6114-4080-9489-ffa401d3e82f"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"e049949c-6114-4080-9489-ffa401d3e82f"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"e2ba7c0a-4594-4831-beaa-7c86c83de478"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"e2ba7c0a-4594-4831-beaa-7c86c83de478"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"83a6b57a-1fdb-45d7-828b-47a14ec3ee89"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"83a6b57a-1fdb-45d7-828b-47a14ec3ee89"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"7bdc1348-e6da-4740-ac4a-cfbee9873d4e"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":3,"requestId":"7bdc1348-e6da-4740-ac4a-cfbee9873d4e"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"62b2ea8d-a100-4230-97f8-be4396d3eb45"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"62b2ea8d-a100-4230-97f8-be4396d3eb45"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"a339ef4f-8e12-4c3c-b955-7e1ae47bf65a"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":7,"requestId":"a339ef4f-8e12-4c3c-b955-7e1ae47bf65a"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"d6aed4c0-3cc7-435c-ac40-049822201bb1"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"d6aed4c0-3cc7-435c-ac40-049822201bb1"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"61c6c1fe-80cd-4957-8422-8b58d1b4b08f"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"61c6c1fe-80cd-4957-8422-8b58d1b4b08f"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"977320c2-5b12-4de2-afe7-c98d05a680d2"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"977320c2-5b12-4de2-afe7-c98d05a680d2"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"484a09c7-3011-449a-bac2-72d259eb4dcb"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"484a09c7-3011-449a-bac2-72d259eb4dcb"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"482e201a-43a3-48bf-a6e0-ae07c26f6f94"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"482e201a-43a3-48bf-a6e0-ae07c26f6f94"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"8c50aee4-ba41-40f7-b262-e051bea61b69"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"8c50aee4-ba41-40f7-b262-e051bea61b69"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"25b66eb1-0f1f-4d2f-8737-2492662a6896"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"25b66eb1-0f1f-4d2f-8737-2492662a6896"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"944f387c-3eed-4702-acee-83dc0e8375a2"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"944f387c-3eed-4702-acee-83dc0e8375a2"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"402ba360-b613-427b-a53e-523a8a7dd3b8"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"402ba360-b613-427b-a53e-523a8a7dd3b8"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"ef9f59ea-d23a-4ba0-81d3-419a4678023a"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"ef9f59ea-d23a-4ba0-81d3-419a4678023a"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"83afc36f-eab2-4beb-8272-7b78170474c8"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":3,"requestId":"83afc36f-eab2-4beb-8272-7b78170474c8"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"e3b22bdf-ea9a-46bb-b865-4e7af0f693fe"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"e3b22bdf-ea9a-46bb-b865-4e7af0f693fe"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"850519a2-ae45-4cab-9347-852942a6ad3a"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"850519a2-ae45-4cab-9347-852942a6ad3a"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"a8b7c2a4-b39c-44c1-b413-0784a4f2d9e5"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"a8b7c2a4-b39c-44c1-b413-0784a4f2d9e5"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"9b57f3c9-1a18-4329-9fe0-51fc764c20c8"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"9b57f3c9-1a18-4329-9fe0-51fc764c20c8"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"602c2f7d-23d7-42a9-bdf8-24deeaac9c28"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"602c2f7d-23d7-42a9-bdf8-24deeaac9c28"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"71d0a329-2b66-4647-97f6-c1bbcd4c17f7"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":3,"requestId":"71d0a329-2b66-4647-97f6-c1bbcd4c17f7"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"10130459-9f3e-4467-ab20-80bfd10d51af"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"10130459-9f3e-4467-ab20-80bfd10d51af"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"2150fa67-1a4d-4307-97ea-b25bbf4c211c"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":4,"requestId":"2150fa67-1a4d-4307-97ea-b25bbf4c211c"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"7c7a29c2-989b-409f-842e-9839aef4950b"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"7c7a29c2-989b-409f-842e-9839aef4950b"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"f6bba70f-4dd0-47ca-8478-25669d1284bf"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"f6bba70f-4dd0-47ca-8478-25669d1284bf"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"e2a30841-30a3-4451-99cc-be0c0492425b"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"e2a30841-30a3-4451-99cc-be0c0492425b"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"f08b19c3-cd96-46f2-be83-9644ca2999a7"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"f08b19c3-cd96-46f2-be83-9644ca2999a7"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"f1db3a9d-9fac-4903-ad0f-c4f5ebeb1437"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"f1db3a9d-9fac-4903-ad0f-c4f5ebeb1437"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"418914ea-220c-4349-b37e-f4c06f803f3c"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":3,"requestId":"418914ea-220c-4349-b37e-f4c06f803f3c"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"45159d01-82fb-4627-8173-a5d53d453018"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"45159d01-82fb-4627-8173-a5d53d453018"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"d82e7195-9c1e-4675-bc1f-8fecc5fa5e54"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"d82e7195-9c1e-4675-bc1f-8fecc5fa5e54"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"46728115-99d5-424b-8857-bdaa1e29734d"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"46728115-99d5-424b-8857-bdaa1e29734d"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"3ac86cdc-08d9-4e91-83aa-b84cb01cbe93"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"3ac86cdc-08d9-4e91-83aa-b84cb01cbe93"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"3e5f26ea-01f4-49a3-bdca-4ae943840fe0"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"3e5f26ea-01f4-49a3-bdca-4ae943840fe0"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"0a02c6b4-cb22-4781-9aa8-ba402bcf0cf3"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"0a02c6b4-cb22-4781-9aa8-ba402bcf0cf3"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"56b30a1c-8d08-4918-ab70-297f8f56acef"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"56b30a1c-8d08-4918-ab70-297f8f56acef"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"1f720242-3576-43a0-8dd6-f99faf662148"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":3,"requestId":"1f720242-3576-43a0-8dd6-f99faf662148"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"42042139-3c5c-4f34-a3a4-7279fb5a8492"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"42042139-3c5c-4f34-a3a4-7279fb5a8492"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"af9807de-cb06-4818-a6ae-accd78d05042"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":6,"requestId":"af9807de-cb06-4818-a6ae-accd78d05042"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"aa6e14ff-2cb6-4e00-bb5e-baffb1061b19"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"aa6e14ff-2cb6-4e00-bb5e-baffb1061b19"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"56136d02-c14b-460b-a2a5-124cb29f3ce0"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":4,"requestId":"56136d02-c14b-460b-a2a5-124cb29f3ce0"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"8d09524c-c40c-4bd3-babc-041b15eda130"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"8d09524c-c40c-4bd3-babc-041b15eda130"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"a2583de4-fe1c-480c-bdff-ca413cb295be"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"a2583de4-fe1c-480c-bdff-ca413cb295be"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"263c8866-2d9b-497c-8db4-e289d19eba1e"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":6,"requestId":"263c8866-2d9b-497c-8db4-e289d19eba1e"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"2bcc9a87-a352-435c-8b32-966132db96a2"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"2bcc9a87-a352-435c-8b32-966132db96a2"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"3fd60ac6-196a-474c-818f-d13cb1c669b4"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":3,"requestId":"3fd60ac6-196a-474c-818f-d13cb1c669b4"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"356cc7ab-a2f1-4936-8419-1f16ffc77a79"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":3,"requestId":"356cc7ab-a2f1-4936-8419-1f16ffc77a79"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"104ba682-d160-40c8-a43d-8623d7fd015f"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"104ba682-d160-40c8-a43d-8623d7fd015f"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"f57e2513-611f-482a-9ccb-46c2f7d43a96"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"f57e2513-611f-482a-9ccb-46c2f7d43a96"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"696d6f56-9b0d-4254-81bc-cdaf5cfa5acb"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"696d6f56-9b0d-4254-81bc-cdaf5cfa5acb"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"67481f90-2056-40d8-81b1-5956467faa81"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"67481f90-2056-40d8-81b1-5956467faa81"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"2e470107-7fd8-48b3-9237-5906e6a32a04"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"2e470107-7fd8-48b3-9237-5906e6a32a04"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"5f515740-793b-4218-a884-092fea34ca6b"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"5f515740-793b-4218-a884-092fea34ca6b"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"1bf5b25a-531f-4389-9462-023e93c9a47e"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"1bf5b25a-531f-4389-9462-023e93c9a47e"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"087255d8-6f32-46ad-9e2d-63c1cd5da51b"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"087255d8-6f32-46ad-9e2d-63c1cd5da51b"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"c1ebed26-c256-442b-836b-e70ec910108a"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"c1ebed26-c256-442b-836b-e70ec910108a"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"b5f1c623-9e00-4b3b-8335-b87e9a55d29c"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"b5f1c623-9e00-4b3b-8335-b87e9a55d29c"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"7f587051-1b3f-4eb9-a691-6e2853188a36"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"7f587051-1b3f-4eb9-a691-6e2853188a36"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"061d4309-b0b0-49ed-b59b-254455edab1a"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":3,"requestId":"061d4309-b0b0-49ed-b59b-254455edab1a"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"7c843448-a638-4a7c-a012-0cc7f8a12fcc"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":3,"requestId":"7c843448-a638-4a7c-a012-0cc7f8a12fcc"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"0696411e-764f-4f3c-9911-1451ddd8e640"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"0696411e-764f-4f3c-9911-1451ddd8e640"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"763aaa4d-ae16-45e2-92a8-f7c1e64af356"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"763aaa4d-ae16-45e2-92a8-f7c1e64af356"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"22a380b1-3316-4951-8f83-600f4214cbad"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"22a380b1-3316-4951-8f83-600f4214cbad"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"abfab5ca-9afb-45ae-9e9f-9b32413f9e48"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"abfab5ca-9afb-45ae-9e9f-9b32413f9e48"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"4063a2ec-95ee-4022-9d51-c92fc7c974d9"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"4063a2ec-95ee-4022-9d51-c92fc7c974d9"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"7d654419-290c-4142-bb49-7943ca8ddadf"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"7d654419-290c-4142-bb49-7943ca8ddadf"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"2b03f1eb-7cba-4db9-a9b6-92625238b61f"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":0,"requestId":"2b03f1eb-7cba-4db9-a9b6-92625238b61f"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"d62ea19b-faa5-43c8-a2fa-bc4310702562"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"d62ea19b-faa5-43c8-a2fa-bc4310702562"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"19fa281a-61f6-4fa0-aa68-4fb04155aa74"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"19fa281a-61f6-4fa0-aa68-4fb04155aa74"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"3217658b-4302-41f3-a56b-9a367e80d673"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"3217658b-4302-41f3-a56b-9a367e80d673"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"a938c34f-b888-4774-b927-b199ad9049a9"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"a938c34f-b888-4774-b927-b199ad9049a9"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"5f9391d9-c161-41c4-9dde-cffe9c731fa5"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"5f9391d9-c161-41c4-9dde-cffe9c731fa5"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"6bffba2e-5d3b-46e1-ae8a-097c071dc090"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"6bffba2e-5d3b-46e1-ae8a-097c071dc090"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"9e78249b-bbfb-4433-bd64-39fb97780870"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"9e78249b-bbfb-4433-bd64-39fb97780870"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"d7b1a0d5-98cb-4b7a-8ccc-d5835801c75e"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"d7b1a0d5-98cb-4b7a-8ccc-d5835801c75e"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"eddf7135-77eb-4188-9a98-1932db7ddf5e"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"eddf7135-77eb-4188-9a98-1932db7ddf5e"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"46e09877-a971-4ce2-b6b0-750bfcb7a6f8"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"46e09877-a971-4ce2-b6b0-750bfcb7a6f8"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"f641dc44-8165-48f6-b8fc-747cd614dccb"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"f641dc44-8165-48f6-b8fc-747cd614dccb"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"b24020c3-5252-40b5-9d47-2eef4b20d8c4"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"b24020c3-5252-40b5-9d47-2eef4b20d8c4"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"9f60e7ae-8301-450f-b8b4-e5b074489b71"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"9f60e7ae-8301-450f-b8b4-e5b074489b71"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"741fc908-8e73-4ec8-ab53-c3bf8b5508b0"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"741fc908-8e73-4ec8-ab53-c3bf8b5508b0"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"ba12906e-f775-48e0-b9c1-3ce153e62cd6"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":0,"requestId":"ba12906e-f775-48e0-b9c1-3ce153e62cd6"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"99f5fd16-7308-4416-9aad-9979284c5129"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"99f5fd16-7308-4416-9aad-9979284c5129"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"a7b22b6b-007a-41f1-a84e-89dbcbed7220"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"a7b22b6b-007a-41f1-a84e-89dbcbed7220"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"6b825eee-dbff-4881-b962-8cd0ba5084a0"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"6b825eee-dbff-4881-b962-8cd0ba5084a0"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"344b757d-9a51-440f-95d9-8756f8c1d0e5"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"344b757d-9a51-440f-95d9-8756f8c1d0e5"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"e49e6fff-62c0-46d1-b9f1-846f999d6253"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"e49e6fff-62c0-46d1-b9f1-846f999d6253"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"68fa17f9-c9ed-487c-afa8-221f4f152b91"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"68fa17f9-c9ed-487c-afa8-221f4f152b91"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"5949b5f2-6c5c-43c3-b301-82510b13f146"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"5949b5f2-6c5c-43c3-b301-82510b13f146"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"e4b6cee9-42fc-4a72-b616-adcf5e4000e7"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"e4b6cee9-42fc-4a72-b616-adcf5e4000e7"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"c8e94d0c-74df-47ca-b89c-194554c059ea"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":3,"requestId":"c8e94d0c-74df-47ca-b89c-194554c059ea"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"b9fea730-31e5-417f-9e91-531533a9e5eb"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"b9fea730-31e5-417f-9e91-531533a9e5eb"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"e45788f5-5eec-4d8f-a5d4-f03f24ead616"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"e45788f5-5eec-4d8f-a5d4-f03f24ead616"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"d4b6ad4d-f98e-4299-bf3c-1e4e971e7efc"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"d4b6ad4d-f98e-4299-bf3c-1e4e971e7efc"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"0b4e8c62-2f81-4c7f-81ef-844b53e7ac83"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"0b4e8c62-2f81-4c7f-81ef-844b53e7ac83"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"c494e444-b1a7-46e0-be4e-0e515824455a"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"c494e444-b1a7-46e0-be4e-0e515824455a"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"b9bd9db8-b45a-402b-b0a2-b3a4e2e8071e"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"b9bd9db8-b45a-402b-b0a2-b3a4e2e8071e"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"b0ab600c-f5f2-427b-b7e7-e53dd6334837"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":3,"requestId":"b0ab600c-f5f2-427b-b7e7-e53dd6334837"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"61e6cd5f-0a99-4dee-9210-ab83ef07abee"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"61e6cd5f-0a99-4dee-9210-ab83ef07abee"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"e852e600-fba7-4220-8276-bf002d5bab1a"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"e852e600-fba7-4220-8276-bf002d5bab1a"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"a37f49ed-6117-44ca-b750-213dcc8abe27"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"a37f49ed-6117-44ca-b750-213dcc8abe27"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"5c8d0779-d902-4ce5-a12c-8b3938f92807"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":0,"requestId":"5c8d0779-d902-4ce5-a12c-8b3938f92807"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"a4982813-4e0e-486e-8202-5f05350691ba"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"a4982813-4e0e-486e-8202-5f05350691ba"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"1733577e-d297-4c06-9338-ee70de594cb6"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"1733577e-d297-4c06-9338-ee70de594cb6"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"38688bf9-212e-4ee0-9ffb-57d4dd90069e"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"38688bf9-212e-4ee0-9ffb-57d4dd90069e"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"84f97b57-8820-4c86-acb3-e37a82e60e4e"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"84f97b57-8820-4c86-acb3-e37a82e60e4e"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"6f70fd60-9f88-45f8-b6cd-efb6fe6f172c"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"6f70fd60-9f88-45f8-b6cd-efb6fe6f172c"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"41297d3e-3649-488f-aac1-a74978ab738d"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"41297d3e-3649-488f-aac1-a74978ab738d"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"268ce748-8225-49b3-8eeb-f338155d49bf"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"268ce748-8225-49b3-8eeb-f338155d49bf"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"cc29dc2a-b670-4bd1-be84-992ecb674244"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"cc29dc2a-b670-4bd1-be84-992ecb674244"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"0257abdc-9f73-401f-8f32-ba6008b81d49"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"0257abdc-9f73-401f-8f32-ba6008b81d49"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"234ad712-2eda-4c8e-94b9-bf29d61a38f0"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"234ad712-2eda-4c8e-94b9-bf29d61a38f0"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"14702b60-759c-442f-be3a-4c39f613587f"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"14702b60-759c-442f-be3a-4c39f613587f"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"f27e95ba-f411-4636-b5e0-bd5456cc2b1a"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"f27e95ba-f411-4636-b5e0-bd5456cc2b1a"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"2e37f94d-dd07-4dcb-af71-6abdcd14fa50"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"2e37f94d-dd07-4dcb-af71-6abdcd14fa50"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"788355ae-5378-482c-824e-24d2f1e09b5d"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"788355ae-5378-482c-824e-24d2f1e09b5d"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"ddc10cd7-53ce-40bc-820b-6bfd74fead1a"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"ddc10cd7-53ce-40bc-820b-6bfd74fead1a"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"659a90b5-314a-453f-9c74-031dcff8af4f"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":3,"requestId":"659a90b5-314a-453f-9c74-031dcff8af4f"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"25402daa-ae1d-467e-99f7-60ff96a77421"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"25402daa-ae1d-467e-99f7-60ff96a77421"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"f2957413-18f9-4756-bb99-b1efdb550bfd"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"f2957413-18f9-4756-bb99-b1efdb550bfd"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"0b714b01-3342-422b-8161-84489160c4f5"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"0b714b01-3342-422b-8161-84489160c4f5"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"46aa60d9-6fe3-4007-86e5-cc6a23669425"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"46aa60d9-6fe3-4007-86e5-cc6a23669425"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"6404ee44-35c4-4d63-9e98-191c3b5353f4"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"6404ee44-35c4-4d63-9e98-191c3b5353f4"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"55a801aa-ff4d-48ef-a8ff-cb1d03a48cbc"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"55a801aa-ff4d-48ef-a8ff-cb1d03a48cbc"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"e2d95550-a0cc-4027-98a6-c4f3b9a4d496"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"e2d95550-a0cc-4027-98a6-c4f3b9a4d496"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"d9f7b5eb-42e5-4d05-8bd5-e47f791fe565"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"d9f7b5eb-42e5-4d05-8bd5-e47f791fe565"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"0fd77381-594b-4018-b1b4-e3517863580c"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":3,"requestId":"0fd77381-594b-4018-b1b4-e3517863580c"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"e8c010f7-491e-4aa7-9dfb-3f8971631e26"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"e8c010f7-491e-4aa7-9dfb-3f8971631e26"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"1859e657-b503-4616-aa86-e69e817760e7"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":0,"requestId":"1859e657-b503-4616-aa86-e69e817760e7"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"7c99e040-0241-4539-aac0-9c30950ebc85"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":4,"requestId":"7c99e040-0241-4539-aac0-9c30950ebc85"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"05d243c6-257d-4548-a1b2-64f3f674c498"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"05d243c6-257d-4548-a1b2-64f3f674c498"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"1b104378-b336-40c9-9cb4-d1ac62c06202"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"1b104378-b336-40c9-9cb4-d1ac62c06202"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"5102c342-1b9a-4d4a-8d21-8600e2d9f9ff"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":9,"requestId":"5102c342-1b9a-4d4a-8d21-8600e2d9f9ff"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"3f850e28-1b6f-4e92-abf7-9307c869c2c8"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"3f850e28-1b6f-4e92-abf7-9307c869c2c8"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"45f9eeb2-dbab-46d8-b67e-65db300beef9"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"45f9eeb2-dbab-46d8-b67e-65db300beef9"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"1e3cfe64-eb49-4f54-9d90-606219bbfeba"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"1e3cfe64-eb49-4f54-9d90-606219bbfeba"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"678af311-ea4a-4d88-a75b-47a09035f081"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"678af311-ea4a-4d88-a75b-47a09035f081"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"f723d2d5-467c-4778-afee-7979ae10ced1"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"f723d2d5-467c-4778-afee-7979ae10ced1"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"a9fe6cdb-6d25-4392-b267-c50fe9b30a43"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"a9fe6cdb-6d25-4392-b267-c50fe9b30a43"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"61b3bc75-81a7-4f4d-8400-78c3d3588c0d"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"61b3bc75-81a7-4f4d-8400-78c3d3588c0d"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"b3d506f2-e540-4428-b8ef-9dced8005c48"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"b3d506f2-e540-4428-b8ef-9dced8005c48"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"56346a36-867a-4720-9c31-041b23fc4345"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"56346a36-867a-4720-9c31-041b23fc4345"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"9b51de6b-41da-4b95-834f-1cf8179099a3"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"9b51de6b-41da-4b95-834f-1cf8179099a3"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"80ab2e32-607a-4a67-b1be-e04e590a0efb"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":9,"requestId":"80ab2e32-607a-4a67-b1be-e04e590a0efb"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"0209367d-9dff-45aa-8e4f-0b1d58a488b6"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"0209367d-9dff-45aa-8e4f-0b1d58a488b6"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"9b97c14a-0b06-4209-a1a0-be496319ef7d"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":0,"requestId":"9b97c14a-0b06-4209-a1a0-be496319ef7d"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"7b845f83-dc94-49fe-ae98-a3640f887640"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":3,"requestId":"7b845f83-dc94-49fe-ae98-a3640f887640"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"7e334108-c51c-4c22-b415-0fe933eda964"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > uses LRU eviction so frequently accessed entries survive +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"7e334108-c51c-4c22-b415-0fe933eda964"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"d9be3ab9-38df-49bc-95ed-97f5f4cac3b9"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"d9be3ab9-38df-49bc-95ed-97f5f4cac3b9"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"f84bc6d6-7986-4275-a634-c765968e1fae"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"f84bc6d6-7986-4275-a634-c765968e1fae"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"1e770b4e-afb5-4cfe-a106-8bde57e38484"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"1e770b4e-afb5-4cfe-a106-8bde57e38484"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"167fbf10-4c1f-4f32-82c8-d0b8c12bdee4"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"167fbf10-4c1f-4f32-82c8-d0b8c12bdee4"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"4d34c1c5-3fb2-4d72-bf07-1b4277f91de3"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"4d34c1c5-3fb2-4d72-bf07-1b4277f91de3"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"6472acb8-9477-489e-b0ab-19794d93d04a"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"6472acb8-9477-489e-b0ab-19794d93d04a"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"51b3efc1-6530-48d0-a851-4f555767cd92"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"51b3efc1-6530-48d0-a851-4f555767cd92"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"46e29c23-ccb3-42bc-ad97-b11f6b2e2758"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"46e29c23-ccb3-42bc-ad97-b11f6b2e2758"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"c628082e-534a-4d0f-826b-d05247998105"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"c628082e-534a-4d0f-826b-d05247998105"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"5d418f05-bf80-4735-b176-54074e27674c"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"5d418f05-bf80-4735-b176-54074e27674c"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"0096da08-916f-469e-9aa6-f595b97f64e0"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"0096da08-916f-469e-9aa6-f595b97f64e0"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"830718cb-1038-4b83-84df-7cafaf9dc84d"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":0,"requestId":"830718cb-1038-4b83-84df-7cafaf9dc84d"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"3b73d407-f177-497d-9242-4b5bfbfb4b9d"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"3b73d407-f177-497d-9242-4b5bfbfb4b9d"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"1c486707-4a73-4d83-96d8-de8f255b3938"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"1c486707-4a73-4d83-96d8-de8f255b3938"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"f9fd16b8-187d-4dcb-9c83-66867900f7ed"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"f9fd16b8-187d-4dcb-9c83-66867900f7ed"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"ebcc7d6d-b9ff-4f42-8f78-83721d2d6c3b"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"ebcc7d6d-b9ff-4f42-8f78-83721d2d6c3b"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"1bf3ecbd-30ec-4b98-a311-8e958310072f"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"1bf3ecbd-30ec-4b98-a311-8e958310072f"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"ba2d8a39-d886-4af6-939b-02b0dc3ddbaa"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":0,"requestId":"ba2d8a39-d886-4af6-939b-02b0dc3ddbaa"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"57a24cc6-76ba-4a1a-8e59-3182dc36253d"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"57a24cc6-76ba-4a1a-8e59-3182dc36253d"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"60db2918-265a-494e-839b-7137eef8b3bc"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":0,"requestId":"60db2918-265a-494e-839b-7137eef8b3bc"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"f127790b-1edc-4965-9928-47a8ec698abd"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"f127790b-1edc-4965-9928-47a8ec698abd"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"22296571-6e4c-45b4-b5f5-71c9aab6a3de"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"22296571-6e4c-45b4-b5f5-71c9aab6a3de"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"1e65abd6-12b7-48d2-9bce-37830b97f4a2"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"1e65abd6-12b7-48d2-9bce-37830b97f4a2"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"5764d3b4-2612-42b0-8a34-6c82ed3291d6"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":3,"requestId":"5764d3b4-2612-42b0-8a34-6c82ed3291d6"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"6d0aa3fe-c5a3-4f2c-b9ef-3990dc4c35f5"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"6d0aa3fe-c5a3-4f2c-b9ef-3990dc4c35f5"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"5f5f57c9-2b5f-4e88-b5d2-133f03d5b538"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"5f5f57c9-2b5f-4e88-b5d2-133f03d5b538"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"9c30eb93-147f-4a92-851e-7a54de0f4b1b"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"9c30eb93-147f-4a92-851e-7a54de0f4b1b"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"321c6d36-f0c0-46a8-9927-7ccd12df0b4b"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"321c6d36-f0c0-46a8-9927-7ccd12df0b4b"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"d9aec06d-d4ca-44cc-b5b0-6c3361a4a36d"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"d9aec06d-d4ca-44cc-b5b0-6c3361a4a36d"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"1518629a-5556-464c-b09f-30d6113a15ac"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"1518629a-5556-464c-b09f-30d6113a15ac"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"0c5995f2-037f-410d-89a4-ce97f97f6bad"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"0c5995f2-037f-410d-89a4-ce97f97f6bad"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"e5a5ef9b-1bd1-493b-b221-06683e095307"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"e5a5ef9b-1bd1-493b-b221-06683e095307"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"de98a988-ca8c-4ebd-ac25-17ab7ab7a5c5"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":0,"requestId":"de98a988-ca8c-4ebd-ac25-17ab7ab7a5c5"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"e44e28d5-6474-47cf-b5e9-0aa60b4a564e"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":4,"requestId":"e44e28d5-6474-47cf-b5e9-0aa60b4a564e"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"8b7d1e5d-d3fc-459d-b161-8aca9b748749"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"8b7d1e5d-d3fc-459d-b161-8aca9b748749"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"23683f68-c6be-418d-a3f8-9463fd8348c9"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"23683f68-c6be-418d-a3f8-9463fd8348c9"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"5d307912-f0c8-46b7-bfb1-9dcb91cbae48"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"5d307912-f0c8-46b7-bfb1-9dcb91cbae48"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"3511ed05-4a8a-4649-8ae8-73963a58bacd"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"3511ed05-4a8a-4649-8ae8-73963a58bacd"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"716ec622-a8af-498e-9fe5-a3318dec4a3c"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"716ec622-a8af-498e-9fe5-a3318dec4a3c"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"8f9a8c8a-d1dc-4969-bf9d-b028209b46b3"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"8f9a8c8a-d1dc-4969-bf9d-b028209b46b3"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"8e1cb1c2-5271-4739-a023-9ea1a3485a15"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"8e1cb1c2-5271-4739-a023-9ea1a3485a15"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"6ec72b4e-8582-4fbc-8de3-beeb6728cd98"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"6ec72b4e-8582-4fbc-8de3-beeb6728cd98"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"1e3de534-1abf-4063-abdc-434d56c8a4f3"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"1e3de534-1abf-4063-abdc-434d56c8a4f3"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"063c26b5-e682-4842-bf7e-c19d56a73289"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"063c26b5-e682-4842-bf7e-c19d56a73289"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"4f72c386-8049-4e5e-9a40-0af006dd060e"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"4f72c386-8049-4e5e-9a40-0af006dd060e"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"f37c78fa-71f6-4849-9b6b-6e008bbd8914"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"f37c78fa-71f6-4849-9b6b-6e008bbd8914"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"88f29c1f-94b8-4104-a965-493a35a6cf89"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"88f29c1f-94b8-4104-a965-493a35a6cf89"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"abe15b20-e2c2-45c8-8ba6-398fc12e4db6"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"abe15b20-e2c2-45c8-8ba6-398fc12e4db6"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"ed1d803b-bdad-45dc-ac05-a349d4682e63"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"ed1d803b-bdad-45dc-ac05-a349d4682e63"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"6288a878-8d69-48b4-b4c6-14c31e9319c8"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"6288a878-8d69-48b4-b4c6-14c31e9319c8"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"2123be34-f8f0-474e-9786-0e3c991172f2"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"2123be34-f8f0-474e-9786-0e3c991172f2"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"540975c8-dce7-45a8-9596-3c892b9b13aa"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"540975c8-dce7-45a8-9596-3c892b9b13aa"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"22fc4a4e-556e-4bed-ad9d-3b264ab54ef6"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"22fc4a4e-556e-4bed-ad9d-3b264ab54ef6"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"7fb35fe1-e175-48f1-a278-031a63fb0150"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"7fb35fe1-e175-48f1-a278-031a63fb0150"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"f752e05d-74bd-444c-9714-8bbe1b113be8"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"f752e05d-74bd-444c-9714-8bbe1b113be8"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"9c11e50a-3cf7-41d5-9faa-8788bdc7fbe8"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"9c11e50a-3cf7-41d5-9faa-8788bdc7fbe8"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"ccd10d39-41d9-4b10-be42-045fc1d62baf"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"ccd10d39-41d9-4b10-be42-045fc1d62baf"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"21eb64da-9d51-4205-b6c1-14b94b32fa1e"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"21eb64da-9d51-4205-b6c1-14b94b32fa1e"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"3d7d4e44-be91-4bc2-aa8a-b9baae30c57c"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"3d7d4e44-be91-4bc2-aa8a-b9baae30c57c"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"17d23656-22c3-45d1-9b27-5feb560a6dc3"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":3,"requestId":"17d23656-22c3-45d1-9b27-5feb560a6dc3"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"9fc4d80c-4fbd-454d-a0aa-c84768667739"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":3,"requestId":"9fc4d80c-4fbd-454d-a0aa-c84768667739"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"66db98c7-9a4c-40f4-9460-78a90dd230c4"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"66db98c7-9a4c-40f4-9460-78a90dd230c4"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"41f7cb60-801a-42ca-ae97-f62a09d616a8"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"41f7cb60-801a-42ca-ae97-f62a09d616a8"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"09a0c259-4121-4af7-b267-2fa76f0c19ce"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"09a0c259-4121-4af7-b267-2fa76f0c19ce"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"c5422a63-8003-4fe5-8241-e02adee6304c"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":9,"requestId":"c5422a63-8003-4fe5-8241-e02adee6304c"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"a24684f7-5406-4a28-8d17-c5f87bb84e4f"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"a24684f7-5406-4a28-8d17-c5f87bb84e4f"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"407d5c2f-bee1-46f5-8641-793d5a2d383d"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"407d5c2f-bee1-46f5-8641-793d5a2d383d"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"612c47f4-8f90-49fe-b61d-ff3a5b6e1016"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"612c47f4-8f90-49fe-b61d-ff3a5b6e1016"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"84bf6bc8-dc6c-418d-9358-b09023398b97"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"84bf6bc8-dc6c-418d-9358-b09023398b97"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"07883e61-5df1-4a59-8c98-377e79989d82"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"07883e61-5df1-4a59-8c98-377e79989d82"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"0c9ed6ac-3ec7-4764-8a1c-b32335e4425c"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"0c9ed6ac-3ec7-4764-8a1c-b32335e4425c"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"2c473473-1088-4221-b6b2-aeb5fdce8a41"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"2c473473-1088-4221-b6b2-aeb5fdce8a41"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"e882d8c0-8c4b-4e1e-893e-407dee8123af"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"e882d8c0-8c4b-4e1e-893e-407dee8123af"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"bd939de4-82d2-4efd-ba72-4bc2a8a7c402"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":5,"requestId":"bd939de4-82d2-4efd-ba72-4bc2a8a7c402"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"da3ac899-4e19-4ae0-b85a-c5d6d141eac4"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":5,"requestId":"da3ac899-4e19-4ae0-b85a-c5d6d141eac4"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"59acdc89-ede0-4198-b493-18d2eb0ced50"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"59acdc89-ede0-4198-b493-18d2eb0ced50"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"edb8a140-c803-4d5e-a6b3-929ddc76c8bb"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"edb8a140-c803-4d5e-a6b3-929ddc76c8bb"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"1815d347-00e4-41b5-a5b3-b479726dff23"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"1815d347-00e4-41b5-a5b3-b479726dff23"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"1825ea81-9b30-431a-90fb-201b6604a829"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"1825ea81-9b30-431a-90fb-201b6604a829"} + +stderr | lib/github.test.ts > fetchGitHubContributions > falls back to stale cache with isOfflineFallback: true when fetch fails and cache has data +[WARN] GitHub API fetch failed, falling back to stale cache {"component":"GitHub API","username":"fallback-user","error":{}} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"6edefbb8-1f4d-46ea-9942-b8fb5341c09b"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":4,"requestId":"6edefbb8-1f4d-46ea-9942-b8fb5341c09b"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"18c9dfe4-da68-4837-bbdc-0c1085c155b1"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"18c9dfe4-da68-4837-bbdc-0c1085c155b1"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"46484cce-4bbf-409d-b3f3-dd1a78cca16a"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"46484cce-4bbf-409d-b3f3-dd1a78cca16a"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"231c00d0-5322-435f-ac51-b48f5bc31eba"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"231c00d0-5322-435f-ac51-b48f5bc31eba"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"8c095147-bf19-41e1-bd1b-09b3868740ed"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"8c095147-bf19-41e1-bd1b-09b3868740ed"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"f49dbe34-7571-436c-977b-3bf517df537e"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"f49dbe34-7571-436c-977b-3bf517df537e"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"2d4cb341-4800-4ac9-9190-aed4ba0550b9"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"2d4cb341-4800-4ac9-9190-aed4ba0550b9"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"469f0871-9df8-46a4-a3a8-78c5198f877c"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":4,"requestId":"469f0871-9df8-46a4-a3a8-78c5198f877c"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"a3203d3c-69e9-4c50-aff9-070c1c3d881d"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"a3203d3c-69e9-4c50-aff9-070c1c3d881d"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"938eaefa-81cc-47e1-9482-b34130267baa"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"938eaefa-81cc-47e1-9482-b34130267baa"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"931d179d-a481-4170-a817-a457ab5a8540"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":4,"requestId":"931d179d-a481-4170-a817-a457ab5a8540"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"215bfef7-b606-4f16-b917-3eab9724393c"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"215bfef7-b606-4f16-b917-3eab9724393c"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"642f7034-37f6-4ad8-b0fe-01e8528ca7b0"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":6,"requestId":"642f7034-37f6-4ad8-b0fe-01e8528ca7b0"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"5f1e37be-18dd-4af1-bf10-08469636536a"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"5f1e37be-18dd-4af1-bf10-08469636536a"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"243c6a3e-516e-443a-93a9-5c71fb6364fc"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":5,"requestId":"243c6a3e-516e-443a-93a9-5c71fb6364fc"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"1130d7bd-b348-4c93-8905-c1a360a38222"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"1130d7bd-b348-4c93-8905-c1a360a38222"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"cf3899d0-66e4-49a3-ba2a-cf791247cc7b"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"cf3899d0-66e4-49a3-ba2a-cf791247cc7b"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"f99d37ef-9258-4acd-9165-e0e0b1eb144e"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"f99d37ef-9258-4acd-9165-e0e0b1eb144e"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"9c19a70d-1066-4294-8cd8-c096de52895f"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"9c19a70d-1066-4294-8cd8-c096de52895f"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"a1a07148-b0ef-4e7d-899d-59546ad5bfa5"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"a1a07148-b0ef-4e7d-899d-59546ad5bfa5"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"d4086f43-6db5-471c-87d5-e6080ab22066"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"d4086f43-6db5-471c-87d5-e6080ab22066"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"e9a2368b-293e-44a8-8028-9b51294dc4f6"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":3,"requestId":"e9a2368b-293e-44a8-8028-9b51294dc4f6"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"aa840470-2a7a-423e-b0da-5528ede45a79"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"aa840470-2a7a-423e-b0da-5528ede45a79"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"882776f4-db4e-481a-a432-ce8e18b862b2"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"882776f4-db4e-481a-a432-ce8e18b862b2"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"a20d9229-c518-4555-9512-4b443c3916d6"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"a20d9229-c518-4555-9512-4b443c3916d6"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"da081ba4-2154-4500-8c53-b7935e4776d2"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"da081ba4-2154-4500-8c53-b7935e4776d2"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"f1ea4379-d980-4eb8-9f02-81e54e26ae1c"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"f1ea4379-d980-4eb8-9f02-81e54e26ae1c"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"535bd5e0-53bb-4759-b8f2-7e0fd1636aac"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"535bd5e0-53bb-4759-b8f2-7e0fd1636aac"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"2010a9b0-6317-4e4f-b04f-830dcc1e6e41"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":3,"requestId":"2010a9b0-6317-4e4f-b04f-830dcc1e6e41"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"602c83c7-49d4-44d1-83e6-1584c179087e"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"602c83c7-49d4-44d1-83e6-1584c179087e"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"f891f459-3cc0-4c41-9fe2-9bd810f6e2f3"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"f891f459-3cc0-4c41-9fe2-9bd810f6e2f3"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"7795b073-ff9b-49ac-9064-850dc5224ac1"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"7795b073-ff9b-49ac-9064-850dc5224ac1"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"4a5dac48-7d49-418f-baee-c27751f10d7a"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"4a5dac48-7d49-418f-baee-c27751f10d7a"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"2f93292f-bc78-46f5-be05-279ca9b1fa2c"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"2f93292f-bc78-46f5-be05-279ca9b1fa2c"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"5c76451c-bffa-4fe0-89d1-4092357c2095"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"5c76451c-bffa-4fe0-89d1-4092357c2095"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"6206c3cd-6527-4866-bce2-d96d8caa2c21"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"6206c3cd-6527-4866-bce2-d96d8caa2c21"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"ed995774-2240-49e7-976c-c4689ad04d2f"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"ed995774-2240-49e7-976c-c4689ad04d2f"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"998136ef-c45f-4101-ac22-d08583282034"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"998136ef-c45f-4101-ac22-d08583282034"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"48f52d7f-8cac-476e-9935-2c911cdd7378"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"48f52d7f-8cac-476e-9935-2c911cdd7378"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"6fe6b407-678f-4d81-a663-527b95fdd32a"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"6fe6b407-678f-4d81-a663-527b95fdd32a"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"d22bb88e-07e9-4866-8d7a-03bda64693c5"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"d22bb88e-07e9-4866-8d7a-03bda64693c5"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"89f839e6-f68e-4b2c-a66b-82631372fee8"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"89f839e6-f68e-4b2c-a66b-82631372fee8"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"314b09a6-c0be-4e61-87e1-c60bcb209663"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"314b09a6-c0be-4e61-87e1-c60bcb209663"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"a0186582-c8e5-4d45-b449-ce826a6a8768"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"a0186582-c8e5-4d45-b449-ce826a6a8768"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"74178762-1b70-4adc-b8ad-21c33207f8bb"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"74178762-1b70-4adc-b8ad-21c33207f8bb"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"eef83dd3-61c9-4add-a10d-3237f35ff87e"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"eef83dd3-61c9-4add-a10d-3237f35ff87e"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"3175f356-6a31-4867-8d1b-b4c410f2493c"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"3175f356-6a31-4867-8d1b-b4c410f2493c"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"6b9dbaae-f7e4-4744-ba17-a429ee37910e"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"6b9dbaae-f7e4-4744-ba17-a429ee37910e"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"4cebaa32-7e45-4f71-823a-b2d1d11be2c3"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"4cebaa32-7e45-4f71-823a-b2d1d11be2c3"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"69daf189-4a58-45c6-869c-16f694cb1637"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"69daf189-4a58-45c6-869c-16f694cb1637"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"cef83f1a-dacc-4237-b8b8-40631606f353"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"cef83f1a-dacc-4237-b8b8-40631606f353"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"612bdb35-72cb-4def-9a42-c1f64704abcd"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":0,"requestId":"612bdb35-72cb-4def-9a42-c1f64704abcd"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"3ba54c5d-747c-49cb-9b59-077dc2b34b26"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"3ba54c5d-747c-49cb-9b59-077dc2b34b26"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"9f0a7ab8-d508-41b3-93c1-5edbb15c8348"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"9f0a7ab8-d508-41b3-93c1-5edbb15c8348"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"255235f6-34a3-4eb2-8487-4113dd5a19cc"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"255235f6-34a3-4eb2-8487-4113dd5a19cc"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"92a6ab56-4052-4a35-b040-1b41ac381120"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"92a6ab56-4052-4a35-b040-1b41ac381120"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"e4e24305-b32b-4b3d-8466-11a38cba14e2"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"e4e24305-b32b-4b3d-8466-11a38cba14e2"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"3baf5ec5-ca69-432e-be32-7bc4ed63ae5b"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"3baf5ec5-ca69-432e-be32-7bc4ed63ae5b"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"dd14661c-cf5c-4a50-b551-5a630d1283de"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"dd14661c-cf5c-4a50-b551-5a630d1283de"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"61c928f8-71d3-4e19-90ea-95ba20a64e34"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"61c928f8-71d3-4e19-90ea-95ba20a64e34"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"50d97444-75d9-42f9-9d89-c08605571799"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"50d97444-75d9-42f9-9d89-c08605571799"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"a5e0f8cc-7fc3-4ec3-8264-bb7f102e1208"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"a5e0f8cc-7fc3-4ec3-8264-bb7f102e1208"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"f43b946d-373d-48a1-b91b-7561868747fe"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"f43b946d-373d-48a1-b91b-7561868747fe"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"43e808b0-88f1-48dc-8baf-45f86f5e2dd3"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"43e808b0-88f1-48dc-8baf-45f86f5e2dd3"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"18dee57c-8d05-4b4b-b1a2-8622815f3421"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"18dee57c-8d05-4b4b-b1a2-8622815f3421"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"9f5fbe89-e684-470f-bdee-06d6b5666682"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"9f5fbe89-e684-470f-bdee-06d6b5666682"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"79ff09e0-7a7a-4252-be91-f9f91745bd82"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"79ff09e0-7a7a-4252-be91-f9f91745bd82"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"fd678162-fbd7-48e8-9f6a-f99fa55a3637"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":0,"requestId":"fd678162-fbd7-48e8-9f6a-f99fa55a3637"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"4c234776-2e61-4809-a3c4-fd88b607df7c"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":3,"requestId":"4c234776-2e61-4809-a3c4-fd88b607df7c"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"522316c7-5c46-4d73-93a8-ec2d6b70d928"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"522316c7-5c46-4d73-93a8-ec2d6b70d928"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"0c1162d6-0957-41bd-be75-c2708fe30865"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"0c1162d6-0957-41bd-be75-c2708fe30865"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"043a8ba0-1486-4402-b53e-413917aba8cf"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":3,"requestId":"043a8ba0-1486-4402-b53e-413917aba8cf"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"d87ac6a3-cccd-4023-a7c5-1e322c38e35d"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"d87ac6a3-cccd-4023-a7c5-1e322c38e35d"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"f6866edb-4fbb-4d3e-ad3d-be4469b0e6d1"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"f6866edb-4fbb-4d3e-ad3d-be4469b0e6d1"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"a496a8f9-74ae-4c4b-a15d-4fbacc40e720"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"a496a8f9-74ae-4c4b-a15d-4fbacc40e720"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"39c3fa13-cfa3-4019-a270-4700267892b9"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"39c3fa13-cfa3-4019-a270-4700267892b9"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"936e6ebc-67eb-43bb-a9e6-0344b24a334f"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"936e6ebc-67eb-43bb-a9e6-0344b24a334f"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"4f7593cf-c2e2-48a2-89bc-8ac90f1f80e4"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"4f7593cf-c2e2-48a2-89bc-8ac90f1f80e4"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"70c2c2a9-1a2a-4d66-bab6-9087a4c90537"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"70c2c2a9-1a2a-4d66-bab6-9087a4c90537"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"4dae9e14-8569-45db-b746-8e764e6dcab9"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"4dae9e14-8569-45db-b746-8e764e6dcab9"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"a5ddb0a0-e127-473c-b6d2-0361f587f252"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"a5ddb0a0-e127-473c-b6d2-0361f587f252"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"2dbd4662-e10c-4dcc-947d-befe0e5bca54"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"2dbd4662-e10c-4dcc-947d-befe0e5bca54"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"6df4a1d8-e647-4d25-ba5a-fa4f64cf4150"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"6df4a1d8-e647-4d25-ba5a-fa4f64cf4150"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"4f32d95c-ade3-41ce-aaa7-3bc26d2bec73"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"4f32d95c-ade3-41ce-aaa7-3bc26d2bec73"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"15fcbda7-c14a-4d57-b56d-b6663da25d5f"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"15fcbda7-c14a-4d57-b56d-b6663da25d5f"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"483c9436-1c82-4258-9eec-90d3f526b8ea"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"483c9436-1c82-4258-9eec-90d3f526b8ea"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"b8690da5-33de-4f32-8368-247f2acf6609"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"b8690da5-33de-4f32-8368-247f2acf6609"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"38b38b25-2865-4525-8fa1-ed7b8d787c51"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":0,"requestId":"38b38b25-2865-4525-8fa1-ed7b8d787c51"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"d6bfd81e-b85d-4f5e-bdfb-7e2049dd6e3f"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":5,"requestId":"d6bfd81e-b85d-4f5e-bdfb-7e2049dd6e3f"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"15f8dbfc-2bda-49f4-a83e-7939060b6968"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"15f8dbfc-2bda-49f4-a83e-7939060b6968"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"764cbb18-43b1-4dcd-9976-f6fbeb1b57d6"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"764cbb18-43b1-4dcd-9976-f6fbeb1b57d6"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"ac0bcd07-0fe6-49c1-b135-22efbd9b4726"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":3,"requestId":"ac0bcd07-0fe6-49c1-b135-22efbd9b4726"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"f7f1873a-13c3-411a-833b-5834b84e1505"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"f7f1873a-13c3-411a-833b-5834b84e1505"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"2e8b7841-ee7b-4eaf-8241-e42202bcbca9"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":0,"requestId":"2e8b7841-ee7b-4eaf-8241-e42202bcbca9"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"9e18c830-b101-43c9-89e7-a6da5941dc06"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"9e18c830-b101-43c9-89e7-a6da5941dc06"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"d1298a96-f13f-4650-806c-292b1ffe55b5"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"d1298a96-f13f-4650-806c-292b1ffe55b5"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"dcd2654c-2c6e-476d-9f25-d162afde0042"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":4,"requestId":"dcd2654c-2c6e-476d-9f25-d162afde0042"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"de9d2411-f66c-41fc-875b-2e276a0c1e38"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"de9d2411-f66c-41fc-875b-2e276a0c1e38"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"6c17352f-2c4d-42c2-94fb-2403cb1fca5b"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"6c17352f-2c4d-42c2-94fb-2403cb1fca5b"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"bd3841ef-b21c-4133-a09c-78c453b987ce"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"bd3841ef-b21c-4133-a09c-78c453b987ce"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"374827f2-faed-4d83-b9b1-2aaf0b495c35"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"374827f2-faed-4d83-b9b1-2aaf0b495c35"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"d81717fa-852c-469a-aa66-6e492c968e68"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"d81717fa-852c-469a-aa66-6e492c968e68"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"2740e265-2969-4e61-b25d-3c23d50d2ee1"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":3,"requestId":"2740e265-2969-4e61-b25d-3c23d50d2ee1"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"7cf0f9bc-5ec2-4369-bb02-1bdd0998afb8"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":6,"requestId":"7cf0f9bc-5ec2-4369-bb02-1bdd0998afb8"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"2ecb6886-6c38-4a77-bbb0-763da955d514"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":3,"requestId":"2ecb6886-6c38-4a77-bbb0-763da955d514"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"8b767247-8a78-427a-935a-c1d6cec701ca"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"8b767247-8a78-427a-935a-c1d6cec701ca"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"7d291f13-b997-451f-86c6-b2b4f5bf3d78"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"7d291f13-b997-451f-86c6-b2b4f5bf3d78"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"dcca98d2-1a44-4431-b278-c635c430cb11"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"dcca98d2-1a44-4431-b278-c635c430cb11"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"cf32af91-96f7-43aa-a4c4-b0341bea6762"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"cf32af91-96f7-43aa-a4c4-b0341bea6762"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"610bfb2a-c0ba-4877-9b35-311c7b8b0fbc"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"610bfb2a-c0ba-4877-9b35-311c7b8b0fbc"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"20d7f95f-569b-4fd8-be68-82ac92048746"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"20d7f95f-569b-4fd8-be68-82ac92048746"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"e6515e9f-2c59-4247-91db-0294fc7c6c59"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"e6515e9f-2c59-4247-91db-0294fc7c6c59"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"df1101ad-9bc0-44c8-97d5-368f02372c31"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"df1101ad-9bc0-44c8-97d5-368f02372c31"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"e5a10f0e-9dae-44e9-8fe7-a4d357e40cc5"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"e5a10f0e-9dae-44e9-8fe7-a4d357e40cc5"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"d9f09e07-bcf3-4f5d-a2a5-91e128851f28"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":3,"requestId":"d9f09e07-bcf3-4f5d-a2a5-91e128851f28"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"32401125-e335-400a-bda8-736aa3e0cefe"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"32401125-e335-400a-bda8-736aa3e0cefe"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"c2704565-e31d-4688-858d-0c915cd3b249"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"c2704565-e31d-4688-858d-0c915cd3b249"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"d78523a8-3d8a-4ff2-b79e-43fb9931bbc2"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":3,"requestId":"d78523a8-3d8a-4ff2-b79e-43fb9931bbc2"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"d6a7062b-4367-4787-849f-10b4e09ef17e"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"d6a7062b-4367-4787-849f-10b4e09ef17e"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"c53f32c7-d510-4c74-abac-9fcd8027c717"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"c53f32c7-d510-4c74-abac-9fcd8027c717"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"35d32c48-a2b6-4e60-90fe-9046b91e0bc5"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"35d32c48-a2b6-4e60-90fe-9046b91e0bc5"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"af03c6bc-acc0-48dc-b3e7-b89a408ee471"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"af03c6bc-acc0-48dc-b3e7-b89a408ee471"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"77a4abe2-ec99-4573-b917-521f21640bfa"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"77a4abe2-ec99-4573-b917-521f21640bfa"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"ad19e333-cd3e-4bd6-a59e-c2f44df184b5"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"ad19e333-cd3e-4bd6-a59e-c2f44df184b5"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"6883241a-2a33-4d4e-9f8c-658fc0542560"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":4,"requestId":"6883241a-2a33-4d4e-9f8c-658fc0542560"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"1ffdf9e8-bef3-4fef-887b-074c1ce319d2"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":3,"requestId":"1ffdf9e8-bef3-4fef-887b-074c1ce319d2"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"8faf5e02-d7c6-48ec-b060-f61284c9c2fb"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"8faf5e02-d7c6-48ec-b060-f61284c9c2fb"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"249aae18-8c2a-4e5b-b1b7-aeeff0336399"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"249aae18-8c2a-4e5b-b1b7-aeeff0336399"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"47422650-6459-4615-b270-f543fcea4664"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"47422650-6459-4615-b270-f543fcea4664"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"ee799f09-f22b-47c8-b394-e915b9accad6"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"ee799f09-f22b-47c8-b394-e915b9accad6"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"1c2f3393-7e9d-4a89-91e0-7dd06eea9a71"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":3,"requestId":"1c2f3393-7e9d-4a89-91e0-7dd06eea9a71"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"af2f9dc3-f129-48e8-a565-f411f86378b7"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"af2f9dc3-f129-48e8-a565-f411f86378b7"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"104978c1-e95e-41c6-96e4-26c5887c5776"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"104978c1-e95e-41c6-96e4-26c5887c5776"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"da1d6c56-36d5-4d0d-9042-1388016e7e6e"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"da1d6c56-36d5-4d0d-9042-1388016e7e6e"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"399ac4a6-6af2-4446-9eaf-31b83f241562"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"399ac4a6-6af2-4446-9eaf-31b83f241562"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"91e84ef2-0ca4-4e7b-83f7-134e461935ac"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":3,"requestId":"91e84ef2-0ca4-4e7b-83f7-134e461935ac"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"04984727-d929-4ac6-9a7a-8f6adbc2adfc"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"04984727-d929-4ac6-9a7a-8f6adbc2adfc"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"e89b2504-ffa7-44d6-8ab4-a85e7eb55f40"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"e89b2504-ffa7-44d6-8ab4-a85e7eb55f40"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"3ac5484b-8985-47fd-866e-57015320bc6e"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"3ac5484b-8985-47fd-866e-57015320bc6e"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"636aaf91-8f17-408f-a5c0-a8f1ce1f0945"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":3,"requestId":"636aaf91-8f17-408f-a5c0-a8f1ce1f0945"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"ef96887e-8032-4c48-a4a7-320bf27e7ad7"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"ef96887e-8032-4c48-a4a7-320bf27e7ad7"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"9e742179-7c65-44c3-b00a-e5075b57033b"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"9e742179-7c65-44c3-b00a-e5075b57033b"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"7508d334-6e80-4fd3-8755-452bb06ed7e1"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":3,"requestId":"7508d334-6e80-4fd3-8755-452bb06ed7e1"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"68dce652-bdfa-4846-8f2b-494e92fe49c6"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":5,"requestId":"68dce652-bdfa-4846-8f2b-494e92fe49c6"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"a86a97ec-1690-4fd3-a2bc-5ddb49485fab"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"a86a97ec-1690-4fd3-a2bc-5ddb49485fab"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"f03eca69-2486-4aa6-a07b-75d2765b0886"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"f03eca69-2486-4aa6-a07b-75d2765b0886"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"5afe6c1e-d4cd-4874-a2c0-1f6138ef9e2f"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"5afe6c1e-d4cd-4874-a2c0-1f6138ef9e2f"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"05e29204-e7c0-4a15-8b09-435538ce3318"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"05e29204-e7c0-4a15-8b09-435538ce3318"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"3dd8c0fc-4b40-4a6e-b56e-0f70f196e9e1"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":7,"requestId":"3dd8c0fc-4b40-4a6e-b56e-0f70f196e9e1"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"4b53e443-395c-4bc0-8562-dc37598a2dbe"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"4b53e443-395c-4bc0-8562-dc37598a2dbe"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"e70f8f2c-08ce-4873-94dd-d444013f28dc"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":7,"requestId":"e70f8f2c-08ce-4873-94dd-d444013f28dc"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"012a9117-9089-48ca-9abb-13bc985903f0"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"012a9117-9089-48ca-9abb-13bc985903f0"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"f4a3f038-2bf7-453d-a11d-bb51dc59373e"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"f4a3f038-2bf7-453d-a11d-bb51dc59373e"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"53ab8128-d44b-4900-b7b6-f04312e74bbe"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"53ab8128-d44b-4900-b7b6-f04312e74bbe"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"c18d24a4-cc52-48c7-bc3a-8e8341fe7c92"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"c18d24a4-cc52-48c7-bc3a-8e8341fe7c92"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"df4ead3b-f90d-46bd-8c9d-ac5f5d156efc"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"df4ead3b-f90d-46bd-8c9d-ac5f5d156efc"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"388457b5-c668-44fe-aa41-10103f6037cc"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":0,"requestId":"388457b5-c668-44fe-aa41-10103f6037cc"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"660651bf-19eb-49ad-a9b6-cb5c3181e205"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":3,"requestId":"660651bf-19eb-49ad-a9b6-cb5c3181e205"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"450b846f-9164-4b62-bdf0-1a5d03c6602d"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"450b846f-9164-4b62-bdf0-1a5d03c6602d"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"454c2e9e-b3c6-4a84-85d7-8b57801c93cd"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"454c2e9e-b3c6-4a84-85d7-8b57801c93cd"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"cc7bb2f2-2680-44e0-b707-270de327b582"} + +stderr | tests/github-recovery.test.ts > GitHub API Failure Recovery (Phase 3) > fetchUserProfile Fallback > falls back to stale cache data on network failure +[WARN] GitHub API profile fetch failed, returning stale cache data {"username":"octocat","error":{}} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"cc7bb2f2-2680-44e0-b707-270de327b582"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"59fbd02d-f1be-4acc-88db-7ca672cdba8a"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"59fbd02d-f1be-4acc-88db-7ca672cdba8a"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"e966d11c-2636-40ac-9067-8746fca13197"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"e966d11c-2636-40ac-9067-8746fca13197"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"fe72b100-1683-4b74-8d4f-fe1c05a795b5"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":3,"requestId":"fe72b100-1683-4b74-8d4f-fe1c05a795b5"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"b3e4bf55-87de-4d48-a687-7fd909d5b117"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":4,"requestId":"b3e4bf55-87de-4d48-a687-7fd909d5b117"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"3f59a326-25d7-4bb6-934a-97982d119ba1"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"3f59a326-25d7-4bb6-934a-97982d119ba1"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"194a31cd-25c0-42d1-a007-4bc3a674e36f"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"194a31cd-25c0-42d1-a007-4bc3a674e36f"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"0b6bc36c-5b4d-444e-88c2-d5056e95d1cb"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"0b6bc36c-5b4d-444e-88c2-d5056e95d1cb"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"e29d29b3-2e8c-4c29-9d4e-346acef58fe0"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"e29d29b3-2e8c-4c29-9d4e-346acef58fe0"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"86af79af-130b-4078-98fb-5a61bb7e83be"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"86af79af-130b-4078-98fb-5a61bb7e83be"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"04892236-115b-4e35-b551-0c7a667837d9"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"04892236-115b-4e35-b551-0c7a667837d9"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"1833c5bd-122f-468b-b635-9032eb614422"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"1833c5bd-122f-468b-b635-9032eb614422"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"5d04fa05-92e2-4dae-9d4a-c373eb42dc8b"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"5d04fa05-92e2-4dae-9d4a-c373eb42dc8b"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"fad5111a-646a-45d6-b8a9-ae23b511f629"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":3,"requestId":"fad5111a-646a-45d6-b8a9-ae23b511f629"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"496ed4b6-3d7e-41d9-a707-9a27a0f836c7"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":0,"requestId":"496ed4b6-3d7e-41d9-a707-9a27a0f836c7"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"123efa08-3695-4045-bef3-68f607afa42b"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"123efa08-3695-4045-bef3-68f607afa42b"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"fbe37b5a-25e2-4506-bb6d-d78b27c5a3c4"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"fbe37b5a-25e2-4506-bb6d-d78b27c5a3c4"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"e2848e84-f665-4915-b65a-3ac7c4a970e6"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"e2848e84-f665-4915-b65a-3ac7c4a970e6"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"c8969126-41ff-4437-a60d-8e6dea286010"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":0,"requestId":"c8969126-41ff-4437-a60d-8e6dea286010"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"44629d90-0a0d-4f1a-8530-658e0aa848c1"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"44629d90-0a0d-4f1a-8530-658e0aa848c1"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"9d4b9e9d-6896-4472-a05c-3a0beecc22db"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"9d4b9e9d-6896-4472-a05c-3a0beecc22db"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"c9461a54-5f39-408c-a057-580086807454"} + +stdout | app/api/streak/route.test.ts > GET /api/streak > validation cache > evicts least recently used entries when cache is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"c9461a54-5f39-408c-a057-580086807454"} + + ✓ app/api/streak/route.test.ts (204 tests) 8062ms + ✓ uses LRU eviction so frequently accessed entries survive 2847ms + ✓ evicts least recently used entries when cache is full 2668ms +stderr | lib/github.test.ts > fetchGitHubContributions > falls back to stale cache when bypassCache is true but fetch fails and cache has data +[GitHub API] Fetch failed or timed out for "bypass-fallback-user", falling back to stale cache: Error: Failed to fetch + at /home/atulupadhyay/Contribution/commitpulse/lib/github.test.ts:483:40 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:1903:20 + + ✓ app/generator/components/EditorPanel.mouse-interactivity.test.tsx (5 tests) 11950ms + ✓ Case 1: applies transition and hover styles structurally on all interactive controls 5941ms + ✓ Case 2: displays title attributes and sets accessibility markers on interactive components 684ms + ✓ Case 3: click events propagate cleanly to parental DOM wrappers 4171ms + ✓ Case 4: triggers name and github username change callbacks correctly 572ms + ✓ Case 5: mobile touch gestures propagate successfully on controls 487ms +stderr | tests/github-recovery.test.ts > GitHub API Failure Recovery (Phase 3) > fetchUserRepos Fallback > falls back to stale cache data on network failure +[WARN] GitHub API repos fetch failed, returning stale cache data {"username":"octocat","error":{}} + +stderr | lib/github.test.ts > forceRefresh write-back > fetchGitHubContributions: forceRefresh writes back so a later normal read is a cache hit +[CommitPulse API] Empty profile or null repository nodes discovered for user "octocat". Falling back to baseline collection. + +stderr | lib/github.test.ts > getFullDashboardData > maps contribution counts to correct intensity levels +[CommitPulse API] Empty profile or null repository nodes discovered for user "octocat". Falling back to baseline collection. + + ✓ app/generator/components/EditorPanel.mock-integrations.test.tsx (5 tests) 15936ms + ✓ Test 1: should mock standard asynchronous imports and databases using stubs 5172ms + ✓ Test 2: should test service loading paths to ensure pending state overlays render 4138ms + ✓ Test 3: should assert local cache layers are queried before triggering database retrievals 349ms + ✓ Test 4: should verify correct fallback procedures during fake endpoint timeout blocks 3519ms + ✓ Test 5: should assert complete cache sync is written on success callbacks 2750ms + ✓ components/dashboard/ProfileOptimizerModal.empty-fallback.test.tsx (5 tests) 15768ms + ✓ 2. Verify clear fallback UI is displayed 3941ms + ✓ 3. Verify standard styles are maintained in this default empty layout state 3863ms + ✓ 4. Assert no unexpected runtime errors or hydration failures occur with empty arrays/objects 3896ms + ✓ 5. Check key DOM structures to make sure empty markers exist 3853ms + ✓ app/generator/components/EditorPanel.empty-fallback.test.tsx (23 tests) 17766ms + ✓ renders the Name section heading 1537ms + ✓ renders the Description section heading 988ms + ✓ renders the Technologies section heading 660ms + ✓ renders the Socials section heading 618ms + ✓ renders the CommitPulse Badge section heading 418ms + ✓ calls onNameChange with the typed value 1138ms + ✓ reflects controlled value in the name input 561ms + ✓ calls onDescriptionChange when the bio textarea changes 597ms + ✓ shows "280 characters remaining" for an empty description 686ms + ✓ decrements the counter as text is added 502ms + ✓ counter text turns amber when fewer than 40 characters remain 539ms + ✓ hides the GitHub username input when showCommitPulse is false 679ms + ✓ shows the GitHub username input when showCommitPulse is true 462ms + ✓ calls onShowCommitPulseChange(true) when the toggle is clicked while off 494ms + ✓ calls onShowCommitPulseChange(false) when the toggle is clicked while on 484ms + ✓ toggle aria-checked reflects the current showCommitPulse state 521ms + ✓ calls onCommitPulseAccentChange when typing a hex value 438ms + ✓ shows "Invalid hex" warning for a partial / invalid hex string 407ms + ✓ does NOT show an "Invalid hex" warning for a valid 6-char hex 369ms + ✓ shows a "Clear" button when the accent is a valid hex 321ms + ✓ clicking Clear calls onCommitPulseAccentChange with an empty string 325ms + ✓ hides the name input after the Name section header is clicked 2475ms + ✓ reveals the name input again when the collapsed header is re-clicked 2471ms +stderr | lib/github.test.ts > getFullDashboardData > handles repos fetch failure gracefully +[CommitPulse API] Empty profile or null repository nodes discovered for user "octocat". Falling back to baseline collection. + +stderr | tests/github-recovery.test.ts > GitHub API Failure Recovery (Phase 3) > fetchGitHubContributions Fallback > falls back to stale cache data on network failure +[GitHub API] Fetch failed or timed out for "octocat", falling back to stale cache: Error: TypeError: Failed to fetch + at /home/atulupadhyay/Contribution/commitpulse/tests/github-recovery.test.ts:133:42 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:1903:20 + + ✓ app/generator/components/EditorPanel.accessibility.test.tsx (5 tests) 20857ms + ✓ 1. verifies that the root container has a form landmark and SectionCards use region roles with h3 headings 7100ms + ✓ 2. verifies that text inputs, textareas, and selection fields have properly associated labels via htmlFor 4645ms + ✓ 3. verifies correct tablist, tab, and tabpanel mappings inside sections like SocialsSection 783ms + ✓ 4. verifies interactive elements can receive focus 3325ms + ✓ 5. verifies that the SectionCard header updates aria-expanded states correctly when toggled 4956ms + ✓ app/generator/data/technologies.responsive-breakpoints.test.ts (5 tests) 6593ms + ✓ renders the real technology catalog under standard 375px mobile coordinates 1180ms + ✓ renders technology columns as the real one-column vertical mobile list 510ms + ✓ uses fluid real row and input classes instead of absolute widths that cause mobile overflow 799ms + ✓ renders real category navigation as wrapping compact mobile controls 3066ms + ✓ responds to real mobile technology toggle states with valid catalog IDs 1030ms +stderr | lib/github.test.ts > GitHub API cache behavior > dedupes rapid synchronous contribution requests until the delayed fetch resolves once +[CommitPulse API] Empty profile or null repository nodes discovered for user "octocat". Falling back to baseline collection. + + ✓ lib/github.test.ts (101 tests | 2 skipped) 22922ms + ✓ throws with the status code when the server returns 500 2804ms + ✓ falls back to empty calendar when fetch itself rejects due to a network failure 2749ms + ✓ falls back to stale cache with isOfflineFallback: true when fetch fails and cache has data 2410ms + ✓ falls back to stale cache when bypassCache is true but fetch fails and cache has data 2909ms + ✓ throws status code error on other failures 2815ms + ✓ throws status code error on failure 2570ms + ✓ throws if profile fetch fails 2678ms + ✓ handles repos fetch failure gracefully 3327ms +stderr | components/dashboard/DashboardClient.test.tsx > DashboardClient > does not paint the worse user green in "Longest Inactive Period" when the other gap is 0 +Received `true` for a non-boolean attribute `layout`. + +If you want to write it to the DOM, pass a string instead: layout="true" or layout={value.toString()}. +Unknown event handler property `onAnimationComplete`. It will be ignored. + + ✓ tests/github-recovery.test.ts (7 tests) 16531ms + ✓ falls back to stale cache data on network failure 3110ms + ✓ returns a mock placeholder profile if cache is empty on network failure 2304ms + ✓ falls back to stale cache data on network failure 2729ms + ✓ returns empty array if cache is empty on network failure 2896ms + ✓ falls back to stale cache data on network failure 2415ms + ✓ returns empty mock contributions calendar if cache is empty on network failure 3051ms + ✓ components/InteractiveViewer.test.tsx (35 tests) 4252ms + ✓ renders children correctly 391ms + ✓ shows a tooltip with the formatted date when hovering a tower and updates it across towers 762ms + ✓ clamps zoom boundaries during wheel zooming 327ms + ✓ components/dashboard/ProfileOptimizerModal.timezone-boundaries.test.tsx (5 tests) 15945ms + ✓ 2. should align commit contributions on correct visual calendar dates independent of timezone 3892ms + ✓ 3. should verify leap year boundaries parse correctly without leaving grid gaps 3913ms + ✓ 5. should handle daylight savings time transitions without throwing date shift errors 7830ms + ✓ app/customize/components/ThemeQuickPresets.test.tsx (17 tests) 7124ms + ✓ renders without crashing 2465ms + ✓ renders a button for each valid theme key 766ms + ✓ active theme button has aria-pressed="true" 364ms + ✓ renders at least one button for each concrete theme excluding auto and random 869ms + ✓ checks rendering of preset buttons on sm and lg viewports 309ms + ✓ components/dashboard/DashboardClient.test.tsx (18 tests) 7921ms + ✓ does not paint the worse user green in "Longest Inactive Period" when the other gap is 0 974ms + ✓ opens and closes the compare profile modal 642ms + ✓ transitions to compare mode when a user is successfully fetched 737ms + ✓ exits compare mode and restores single profile view 766ms + ✓ generate your own button points to root / 368ms + ✓ shows a success toast after the dashboard link is copied 357ms + ✓ shows an error toast when the dashboard link copy fails 366ms + ✓ copies the comparison link when native sharing is unavailable 510ms + ✓ shows an error toast when comparison link copy fails 546ms + ✓ does not show an error toast when native comparison sharing is cancelled 454ms + ✓ shows an error when comparing with the same username (case-insensitive) 340ms + ✓ verify compare modal input can be cleared 382ms + ✓ renders personality tags for both profiles in compare mode 411ms + ✓ shows Most Consistent badge for profile with higher peak streak in compare mode 535ms +stderr | app/compare/page.mouse-interactivity.test.tsx > CompareClient Mouse Interactivity & Touch Events > verifies mouse hover styling and hover class application on search and action elements +React does not recognize the `whileHover` prop on a DOM element. If you intentionally want it to appear in the DOM as a custom attribute, spell it as lowercase `whilehover` instead. If you accidentally passed it from a parent component, remove it from the DOM element. +React does not recognize the `whileTap` prop on a DOM element. If you intentionally want it to appear in the DOM as a custom attribute, spell it as lowercase `whiletap` instead. If you accidentally passed it from a parent component, remove it from the DOM element. + + ✓ components/DeveloperArena.test.tsx (5 tests) 3197ms + ✓ renders correctly with sections and headings 1062ms + ✓ triggers onSelectBattle when a trending showdown is clicked 310ms + ✓ reveals the developer in the trivia game when Reveal button is clicked 837ms + ✓ triggers correct challenge action when Challenge Linus is clicked after reveal 544ms + ✓ allows skipping a trivia game challenge 422ms + ✓ app/generator/GeneratorClient.timezone-boundaries.test.tsx (5 tests) 6844ms + ✓ renders stably when the host timezone is stubbed to UTC, EST, IST, or JST 3834ms + ✓ anchors its initial render to a fixed system clock so visible dates stay deterministic 660ms + ✓ renders on Feb 29 of a leap year without throwing a date-parse error 510ms + ✓ produces stable Intl.DateTimeFormat output for en-US, en-IN, ja-JP, and de-DE locales 455ms + ✓ renders identically on both sides of the US spring-forward DST boundary 1372ms + ✓ app/customize/components/ThemeQuickPresets.timezone-boundaries.test.tsx (14 tests) 7159ms + ✓ renders consistently in timezone UTC 2665ms + ✓ renders consistently in timezone America/New_York 1264ms + ✓ renders consistently in timezone Asia/Kolkata 964ms + ✓ renders consistently in timezone Asia/Tokyo 666ms + ✓ timezone transitions do not alter available presets 397ms + ✓ app/generator/components/sections/TechnologiesSection.accessibility.test.tsx (5 tests) 7109ms + ✓ renders accessible search input with placeholder 1085ms + ✓ renders category filter buttons accessible by role 2548ms + ✓ supports keyboard navigation to interactive controls 738ms + ✓ renders technologies section title and description 597ms + ✓ shows clear all button when technologies are selected 2131ms + ✓ app/compare/page.mouse-interactivity.test.tsx (5 tests) 6663ms + ✓ verifies mouse hover styling and hover class application on search and action elements 1315ms + ✓ renders stats showdown cards and verifies hover-related border transitions 1672ms + ✓ triggers mouse hover interactions on coding habits cards 1482ms + ✓ verifies touch start propagation on controls and action buttons 436ms + ✓ renders contribution activity heatmap and verifies hover title-tooltips exist 1748ms +stderr | app/compare/CompareClient.mouse-interactivity.test.tsx > CompareClient Interactive Tooltips, Cursor Hovers & Touch Event Propagation > verifies mouse hover styling and hover class application on search and action elements +React does not recognize the `whileHover` prop on a DOM element. If you intentionally want it to appear in the DOM as a custom attribute, spell it as lowercase `whilehover` instead. If you accidentally passed it from a parent component, remove it from the DOM element. +React does not recognize the `whileTap` prop on a DOM element. If you intentionally want it to appear in the DOM as a custom attribute, spell it as lowercase `whiletap` instead. If you accidentally passed it from a parent component, remove it from the DOM element. + + ✓ components/KonamiEasterEgg.responsive-breakpoints.test.tsx (5 tests) 5905ms + ✓ 1. Mock standard mobile-width media coordinates (375px): Simulates mobile viewport size and renders without crashing 1704ms + ✓ 2. Assert that layout columns reflow: Matrix rain drops and text lines structure flow vertically to prevent squishing 1328ms + ✓ 3. Verify styling values prevent absolute-width overflow: Overlays and container boxes use relative constraints 880ms + ✓ 4. Check that navigation components scale down gracefully: Accent labels and typographic sizes adjust for mobile views 688ms + ✓ 5. Assert mobile-specific toggle states: Verify typing inside input fields disables the overlay trigger 1290ms + ✓ app/customize/components/ControlsPanel.test.tsx (8 tests) 4050ms + ✓ renders the GitHub Username label 1120ms + ✓ renders Linear and Logarithmic buttons 1409ms + ✓ calls onScaleChange with log 404ms +stderr | app/compare/CompareClient.mouse-interactivity.test.tsx > CompareClient Interactive Tooltips, Cursor Hovers & Touch Event Propagation > verifies touch start propagation on controls and action buttons +An update to CompareClient inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act +An update to CompareClient inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act + +stderr | app/compare/CompareClient.mouse-interactivity.test.tsx > CompareClient Interactive Tooltips, Cursor Hovers & Touch Event Propagation > verifies touch start propagation on controls and action buttons +An update to CompareClient inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act +An update to CompareClient inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act + +stderr | app/contributors/ContributorsClient.mouse-interactivity.test.tsx > ContributorsClient - Interactive Tooltips, Cursor Hovers & Touch Event Propagation > triggers mouse hover gestures on magnetic CTA nodes and computes local shift coordinates +React does not recognize the `whileInView` prop on a DOM element. If you intentionally want it to appear in the DOM as a custom attribute, spell it as lowercase `whileinview` instead. If you accidentally passed it from a parent component, remove it from the DOM element. + + ✓ app/compare/CompareClient.mouse-interactivity.test.tsx (5 tests) 5425ms + ✓ verifies mouse hover styling and hover class application on search and action elements 1545ms + ✓ renders stats showdown cards and verifies hover-related border transitions 2036ms + ✓ triggers mouse hover interactions on coding habits cards 737ms + ✓ verifies touch start propagation on controls and action buttons 359ms + ✓ renders contribution activity heatmap and verifies hover title-tooltips exist 730ms + ✓ components/dashboard/PopularPinnedRepos.mouse-interactivity.test.tsx (18 tests) 2266ms + ✓ dropdown opens on toggle button click 524ms + ✓ app/contributors/ContributorsClient.mouse-interactivity.test.tsx (5 tests) 3672ms + ✓ triggers mouse hover gestures on magnetic CTA nodes and computes local shift coordinates 1530ms + ✓ propagates click and touch gestures from CTA links through the client boundary 978ms + ✓ applies cursor-safe hover classes to interactive links without blocking pointer events 410ms + ✓ hides temporary magnetic offset visuals when mouseleave resets the CTA transform 449ms + ✓ components/DeveloperArena.accessibility.test.tsx (10 tests) 5267ms + ✓ gives every rendered image a non-empty accessible name 595ms + ✓ exposes the primary action buttons with descriptive accessible names 574ms + ✓ reveals an accessible "Challenge Linus!" button after the reveal action 1042ms + ✓ does not pull the mouse-driven showdown/legend marquee cards into the tab order 520ms + ✓ keeps a logical, non-skipping heading hierarchy under a page-level h1 472ms + ✓ does not introduce duplicate element ids when rendered more than once 351ms + ✓ does not disturb surrounding tab order or focus when embedded in a page 323ms + ✓ scopes the trivia-game reveal heading to its own panel, not duplicated app-wide 903ms + ✓ app/customize/components/ThemeSelector.test.tsx (18 tests) 4776ms + ✓ renders without crashing 1045ms + ✓ renders a select element with all theme options 342ms + ✓ changing the select calls onThemeChange with the selected value 392ms + ✓ verifies that selecting Dracula preset calls onThemeChange("dracula") 472ms + ✓ check if active preset button updates when switching from Dracula to Neon 438ms + ✓ components/KonamiEasterEgg.theme-contrast.test.tsx (5 tests) 5946ms + ✓ renders dark-theme overlay with sufficient contrast styling 1660ms + ✓ renders correctly in light theme environments 1485ms + ✓ displays foreground content without clipping through backdrop overlay 1276ms + ✓ renders contrast-oriented emerald visual styling elements 838ms + ✓ renders gradient and accent elements used for visual cohesion 579ms + ✓ components/KonamiEasterEgg.mock-integrations.test.tsx (5 tests) 5017ms + ✓ schedules an auto-dismiss timeout stub with the configured displayDuration when triggered 2096ms + ✓ dismisses the overlay automatically after the displayDuration timeout stub elapses 1542ms + ✓ does not trigger the overlay on a partial or incorrect secret code — buffer cache must not flush prematurely 1293ms + ✓ components/WallOfLove.test.tsx (6 tests) 3923ms + ✓ renders section heading 1344ms + ✓ renders testimonial author names 531ms + ✓ renders testimonial handles 393ms + ✓ renders testimonial avatars 381ms + ✓ renders stats section values 895ms + ✓ links the testimonial CTA to the review form route 372ms + ✓ components/KonamiEasterEgg.accessibility.test.tsx (5 tests) 7293ms + ✓ 1. overlay container exposes an accessible role so screen readers can announce its presence 2286ms + ✓ 2. heading inside the overlay is h2 maintaining correct logical heading hierarchy 1753ms + ✓ 3. overlay contains descriptive human-readable text that screen readers can announce 1147ms + ✓ 4. overlay is not present in the accessibility tree before the secret code is typed 1488ms + ✓ 5. overlay heading is removed from accessibility tree after display duration expires 612ms + ✓ components/dashboard/Achievements.timezone-boundaries.test.tsx (12 tests) 2065ms + ✓ shows "See All Achievements" button when there are more than four achievements 604ms + ✓ components/WallOfLove.mock-integrations.test.tsx (5 tests) 3022ms + ✓ registers ScrollTrigger plugin through gsap 933ms + ✓ creates gsap context during render lifecycle 468ms + ✓ creates animation timelines through mocked gsap 304ms + ✓ renders successfully with reduced motion enabled 780ms + ✓ renders testimonials without requiring external services 520ms + ✓ app/compare/CompareClient.mock-integrations.test.tsx (5 tests) 5599ms + ✓ Test 1: should mock standard asynchronous imports and databases using stubs 1841ms + ✓ Test 2: should test service loading paths to ensure pending state overlays render 1115ms + ✓ Test 3: should assert local cache layers are queried before triggering database retrievals 1058ms + ✓ Test 4: should verify correct fallback procedures during fake endpoint timeout blocks 1013ms + ✓ Test 5: should assert complete cache sync is written on success callbacks 565ms + ✓ components/KonamiEasterEgg.mouse-interactivity.test.tsx (5 tests) 7603ms + ✓ triggers simulated mouseenter/hover gestures on active segments or interactive nodes 2149ms + ✓ verifies that responsive tooltip layouts display at computed coordinates 2261ms + ✓ tests custom click/touch gestures and ensure click events propagate correctly 1353ms + ✓ asserts appropriate cursor style classes (like pointer) are applied on hover 1142ms + ✓ checks that mouseleave events successfully hide temporary overlay visuals 673ms + ✓ app/generator/components/sections/TechnologiesSection.theme-contrast.test.tsx (5 tests) 6592ms + ✓ renders correctly in light theme with proper structure 1756ms + ✓ renders correctly in dark theme with proper structure 1003ms + ✓ ensures text remains visible in light mode (contrast proxy check) 1492ms + ✓ ensures text remains visible in dark mode (contrast proxy check) 1188ms + ✓ maintains UI stability when filtering technologies in dark mode 1142ms + ✓ components/dashboard/PopularPinnedRepos.test.tsx (49 tests) 2779ms + ✓ renders the dropdown toggle button when both lists have data 407ms + ✓ components/KonamiEasterEgg.timezone-boundaries.test.tsx (5 tests) 4670ms + ✓ renders overlay successfully across multiple timezone settings (UTC, EST, IST, JST) 4587ms + ✓ app/customize/components/ControlsPanel.accessibility.test.tsx (5 tests) 3060ms + ✓ renders username input control 1141ms + ✓ renders color pickers with accessible aria labels 416ms + ✓ renders scale buttons with accessible names 1098ms + ✓ components/dashboard/PopularPinnedRepos.response-breakpoints.test.tsx (47 tests) 4784ms + ✓ dropdown button is present at mobileXS when two lists have data 443ms + ✓ dropdown wrapper uses relative positioning at every breakpoint 871ms + ✓ dropdown listbox has z-10 to float above card content at all breakpoints 352ms + ✓ each card carries w-full to fill available column width 436ms + ✓ app/generator/components/sections/TechnologiesSection.empty-fallback.test.tsx (5 tests) 4646ms + ✓ Case 1: Render the component with empty arrays and verify that a clear, non-breaking fallback UI is displayed 1047ms + ✓ Case 2: Pass null parameters for selected list and verify no crashes occur 688ms + ✓ Case 3: Verify standard structural CSS styles or container class names are maintained even when in its default empty layout state 1020ms + ✓ Case 4: Assert that no unexpected runtime errors occur when interacting with the component when callback is missing or undefined 1330ms + ✓ Case 5: Check key DOM structures to make sure empty markers exist 554ms +stderr | app/compare/page.theme-contrast.test.tsx > ComparePage Theme Contrast (Variation 3) > renders heading with dark and light text contrast classes +React does not recognize the `whileHover` prop on a DOM element. If you intentionally want it to appear in the DOM as a custom attribute, spell it as lowercase `whilehover` instead. If you accidentally passed it from a parent component, remove it from the DOM element. +React does not recognize the `whileTap` prop on a DOM element. If you intentionally want it to appear in the DOM as a custom attribute, spell it as lowercase `whiletap` instead. If you accidentally passed it from a parent component, remove it from the DOM element. + +stderr | app/contributors/ContributorsClient.mock-integrations.test.tsx > ContributorsClient - Interactive Tooltips, Cursor Hovers & Touch Event Propagation > renders successfully with mocked contributor data +React does not recognize the `whileInView` prop on a DOM element. If you intentionally want it to appear in the DOM as a custom attribute, spell it as lowercase `whileinview` instead. If you accidentally passed it from a parent component, remove it from the DOM element. + + ✓ app/compare/page.theme-contrast.test.tsx (5 tests) 3814ms + ✓ renders heading with dark and light text contrast classes 1695ms + ✓ renders username input fields with dark and light theme styling 628ms + ✓ renders compare button with proper contrast classes for both themes 785ms + ✓ renders decorative badge with theme-aware background styling 436ms + ✓ components/dashboard/ContributionCity3D.accessibility.test.tsx (9 tests) 2075ms + ✓ does not give the canvas a tabindex or pull it into the tab order 1083ms + ✓ remains accessible across all available themes (no role/label regressions) 479ms +stderr | app/contributors/ContributorsClient.mock-integrations.test.tsx > ContributorsClient - Interactive Tooltips, Cursor Hovers & Touch Event Propagation > renders successfully with a large mocked contributor list +React does not recognize the `whileHover` prop on a DOM element. If you intentionally want it to appear in the DOM as a custom attribute, spell it as lowercase `whilehover` instead. If you accidentally passed it from a parent component, remove it from the DOM element. +An empty string ("") was passed to the src attribute. This may cause the browser to download the whole page again over the network. To fix this, either do not render the element at all or pass null to src instead of an empty string. +An empty string ("") was passed to the src attribute. This may cause the browser to download the whole page again over the network. To fix this, either do not render the element at all or pass null to src instead of an empty string. +An empty string ("") was passed to the src attribute. This may cause the browser to download the whole page again over the network. To fix this, either do not render the element at all or pass null to src instead of an empty string. +An empty string ("") was passed to the src attribute. This may cause the browser to download the whole page again over the network. To fix this, either do not render the element at all or pass null to src instead of an empty string. +An empty string ("") was passed to the src attribute. This may cause the browser to download the whole page again over the network. To fix this, either do not render the element at all or pass null to src instead of an empty string. +An empty string ("") was passed to the src attribute. This may cause the browser to download the whole page again over the network. To fix this, either do not render the element at all or pass null to src instead of an empty string. +An empty string ("") was passed to the src attribute. This may cause the browser to download the whole page again over the network. To fix this, either do not render the element at all or pass null to src instead of an empty string. +An empty string ("") was passed to the src attribute. This may cause the browser to download the whole page again over the network. To fix this, either do not render the element at all or pass null to src instead of an empty string. +An empty string ("") was passed to the src attribute. This may cause the browser to download the whole page again over the network. To fix this, either do not render the element at all or pass null to src instead of an empty string. +An empty string ("") was passed to the src attribute. This may cause the browser to download the whole page again over the network. To fix this, either do not render the element at all or pass null to src instead of an empty string. +An empty string ("") was passed to the src attribute. This may cause the browser to download the whole page again over the network. To fix this, either do not render the element at all or pass null to src instead of an empty string. +An empty string ("") was passed to the src attribute. This may cause the browser to download the whole page again over the network. To fix this, either do not render the element at all or pass null to src instead of an empty string. +An empty string ("") was passed to the src attribute. This may cause the browser to download the whole page again over the network. To fix this, either do not render the element at all or pass null to src instead of an empty string. +An empty string ("") was passed to the src attribute. This may cause the browser to download the whole page again over the network. To fix this, either do not render the element at all or pass null to src instead of an empty string. +An empty string ("") was passed to the src attribute. This may cause the browser to download the whole page again over the network. To fix this, either do not render the element at all or pass null to src instead of an empty string. +An empty string ("") was passed to the src attribute. This may cause the browser to download the whole page again over the network. To fix this, either do not render the element at all or pass null to src instead of an empty string. +An empty string ("") was passed to the src attribute. This may cause the browser to download the whole page again over the network. To fix this, either do not render the element at all or pass null to src instead of an empty string. +An empty string ("") was passed to the src attribute. This may cause the browser to download the whole page again over the network. To fix this, either do not render the element at all or pass null to src instead of an empty string. +An empty string ("") was passed to the src attribute. This may cause the browser to download the whole page again over the network. To fix this, either do not render the element at all or pass null to src instead of an empty string. +An empty string ("") was passed to the src attribute. This may cause the browser to download the whole page again over the network. To fix this, either do not render the element at all or pass null to src instead of an empty string. +An empty string ("") was passed to the src attribute. This may cause the browser to download the whole page again over the network. To fix this, either do not render the element at all or pass null to src instead of an empty string. +An empty string ("") was passed to the src attribute. This may cause the browser to download the whole page again over the network. To fix this, either do not render the element at all or pass null to src instead of an empty string. +An empty string ("") was passed to the src attribute. This may cause the browser to download the whole page again over the network. To fix this, either do not render the element at all or pass null to src instead of an empty string. +An empty string ("") was passed to the src attribute. This may cause the browser to download the whole page again over the network. To fix this, either do not render the element at all or pass null to src instead of an empty string. +An empty string ("") was passed to the src attribute. This may cause the browser to download the whole page again over the network. To fix this, either do not render the element at all or pass null to src instead of an empty string. +An empty string ("") was passed to the src attribute. This may cause the browser to download the whole page again over the network. To fix this, either do not render the element at all or pass null to src instead of an empty string. +An empty string ("") was passed to the src attribute. This may cause the browser to download the whole page again over the network. To fix this, either do not render the element at all or pass null to src instead of an empty string. +An empty string ("") was passed to the src attribute. This may cause the browser to download the whole page again over the network. To fix this, either do not render the element at all or pass null to src instead of an empty string. +An empty string ("") was passed to the src attribute. This may cause the browser to download the whole page again over the network. To fix this, either do not render the element at all or pass null to src instead of an empty string. +An empty string ("") was passed to the src attribute. This may cause the browser to download the whole page again over the network. To fix this, either do not render the element at all or pass null to src instead of an empty string. +An empty string ("") was passed to the src attribute. This may cause the browser to download the whole page again over the network. To fix this, either do not render the element at all or pass null to src instead of an empty string. +An empty string ("") was passed to the src attribute. This may cause the browser to download the whole page again over the network. To fix this, either do not render the element at all or pass null to src instead of an empty string. +An empty string ("") was passed to the src attribute. This may cause the browser to download the whole page again over the network. To fix this, either do not render the element at all or pass null to src instead of an empty string. +An empty string ("") was passed to the src attribute. This may cause the browser to download the whole page again over the network. To fix this, either do not render the element at all or pass null to src instead of an empty string. +An empty string ("") was passed to the src attribute. This may cause the browser to download the whole page again over the network. To fix this, either do not render the element at all or pass null to src instead of an empty string. +An empty string ("") was passed to the src attribute. This may cause the browser to download the whole page again over the network. To fix this, either do not render the element at all or pass null to src instead of an empty string. +An empty string ("") was passed to the src attribute. This may cause the browser to download the whole page again over the network. To fix this, either do not render the element at all or pass null to src instead of an empty string. +An empty string ("") was passed to the src attribute. This may cause the browser to download the whole page again over the network. To fix this, either do not render the element at all or pass null to src instead of an empty string. +An empty string ("") was passed to the src attribute. This may cause the browser to download the whole page again over the network. To fix this, either do not render the element at all or pass null to src instead of an empty string. +An empty string ("") was passed to the src attribute. This may cause the browser to download the whole page again over the network. To fix this, either do not render the element at all or pass null to src instead of an empty string. +An empty string ("") was passed to the src attribute. This may cause the browser to download the whole page again over the network. To fix this, either do not render the element at all or pass null to src instead of an empty string. +An empty string ("") was passed to the src attribute. This may cause the browser to download the whole page again over the network. To fix this, either do not render the element at all or pass null to src instead of an empty string. +An empty string ("") was passed to the src attribute. This may cause the browser to download the whole page again over the network. To fix this, either do not render the element at all or pass null to src instead of an empty string. +An empty string ("") was passed to the src attribute. This may cause the browser to download the whole page again over the network. To fix this, either do not render the element at all or pass null to src instead of an empty string. +An empty string ("") was passed to the src attribute. This may cause the browser to download the whole page again over the network. To fix this, either do not render the element at all or pass null to src instead of an empty string. +An empty string ("") was passed to the src attribute. This may cause the browser to download the whole page again over the network. To fix this, either do not render the element at all or pass null to src instead of an empty string. +An empty string ("") was passed to the src attribute. This may cause the browser to download the whole page again over the network. To fix this, either do not render the element at all or pass null to src instead of an empty string. +An empty string ("") was passed to the src attribute. This may cause the browser to download the whole page again over the network. To fix this, either do not render the element at all or pass null to src instead of an empty string. +An empty string ("") was passed to the src attribute. This may cause the browser to download the whole page again over the network. To fix this, either do not render the element at all or pass null to src instead of an empty string. +An empty string ("") was passed to the src attribute. This may cause the browser to download the whole page again over the network. To fix this, either do not render the element at all or pass null to src instead of an empty string. +An empty string ("") was passed to the src attribute. This may cause the browser to download the whole page again over the network. To fix this, either do not render the element at all or pass null to src instead of an empty string. +An empty string ("") was passed to the src attribute. This may cause the browser to download the whole page again over the network. To fix this, either do not render the element at all or pass null to src instead of an empty string. +An empty string ("") was passed to the src attribute. This may cause the browser to download the whole page again over the network. To fix this, either do not render the element at all or pass null to src instead of an empty string. +An empty string ("") was passed to the src attribute. This may cause the browser to download the whole page again over the network. To fix this, either do not render the element at all or pass null to src instead of an empty string. +An empty string ("") was passed to the src attribute. This may cause the browser to download the whole page again over the network. To fix this, either do not render the element at all or pass null to src instead of an empty string. +An empty string ("") was passed to the src attribute. This may cause the browser to download the whole page again over the network. To fix this, either do not render the element at all or pass null to src instead of an empty string. +An empty string ("") was passed to the src attribute. This may cause the browser to download the whole page again over the network. To fix this, either do not render the element at all or pass null to src instead of an empty string. +An empty string ("") was passed to the src attribute. This may cause the browser to download the whole page again over the network. To fix this, either do not render the element at all or pass null to src instead of an empty string. +An empty string ("") was passed to the src attribute. This may cause the browser to download the whole page again over the network. To fix this, either do not render the element at all or pass null to src instead of an empty string. +An empty string ("") was passed to the src attribute. This may cause the browser to download the whole page again over the network. To fix this, either do not render the element at all or pass null to src instead of an empty string. +An empty string ("") was passed to the src attribute. This may cause the browser to download the whole page again over the network. To fix this, either do not render the element at all or pass null to src instead of an empty string. +An empty string ("") was passed to the src attribute. This may cause the browser to download the whole page again over the network. To fix this, either do not render the element at all or pass null to src instead of an empty string. +An empty string ("") was passed to the src attribute. This may cause the browser to download the whole page again over the network. To fix this, either do not render the element at all or pass null to src instead of an empty string. +An empty string ("") was passed to the src attribute. This may cause the browser to download the whole page again over the network. To fix this, either do not render the element at all or pass null to src instead of an empty string. +An empty string ("") was passed to the src attribute. This may cause the browser to download the whole page again over the network. To fix this, either do not render the element at all or pass null to src instead of an empty string. +An empty string ("") was passed to the src attribute. This may cause the browser to download the whole page again over the network. To fix this, either do not render the element at all or pass null to src instead of an empty string. +An empty string ("") was passed to the src attribute. This may cause the browser to download the whole page again over the network. To fix this, either do not render the element at all or pass null to src instead of an empty string. +An empty string ("") was passed to the src attribute. This may cause the browser to download the whole page again over the network. To fix this, either do not render the element at all or pass null to src instead of an empty string. +An empty string ("") was passed to the src attribute. This may cause the browser to download the whole page again over the network. To fix this, either do not render the element at all or pass null to src instead of an empty string. +An empty string ("") was passed to the src attribute. This may cause the browser to download the whole page again over the network. To fix this, either do not render the element at all or pass null to src instead of an empty string. +An empty string ("") was passed to the src attribute. This may cause the browser to download the whole page again over the network. To fix this, either do not render the element at all or pass null to src instead of an empty string. +An empty string ("") was passed to the src attribute. This may cause the browser to download the whole page again over the network. To fix this, either do not render the element at all or pass null to src instead of an empty string. +An empty string ("") was passed to the src attribute. This may cause the browser to download the whole page again over the network. To fix this, either do not render the element at all or pass null to src instead of an empty string. +An empty string ("") was passed to the src attribute. This may cause the browser to download the whole page again over the network. To fix this, either do not render the element at all or pass null to src instead of an empty string. +An empty string ("") was passed to the src attribute. This may cause the browser to download the whole page again over the network. To fix this, either do not render the element at all or pass null to src instead of an empty string. +An empty string ("") was passed to the src attribute. This may cause the browser to download the whole page again over the network. To fix this, either do not render the element at all or pass null to src instead of an empty string. +An empty string ("") was passed to the src attribute. This may cause the browser to download the whole page again over the network. To fix this, either do not render the element at all or pass null to src instead of an empty string. +An empty string ("") was passed to the src attribute. This may cause the browser to download the whole page again over the network. To fix this, either do not render the element at all or pass null to src instead of an empty string. +An empty string ("") was passed to the src attribute. This may cause the browser to download the whole page again over the network. To fix this, either do not render the element at all or pass null to src instead of an empty string. +An empty string ("") was passed to the src attribute. This may cause the browser to download the whole page again over the network. To fix this, either do not render the element at all or pass null to src instead of an empty string. +An empty string ("") was passed to the src attribute. This may cause the browser to download the whole page again over the network. To fix this, either do not render the element at all or pass null to src instead of an empty string. +An empty string ("") was passed to the src attribute. This may cause the browser to download the whole page again over the network. To fix this, either do not render the element at all or pass null to src instead of an empty string. +An empty string ("") was passed to the src attribute. This may cause the browser to download the whole page again over the network. To fix this, either do not render the element at all or pass null to src instead of an empty string. +An empty string ("") was passed to the src attribute. This may cause the browser to download the whole page again over the network. To fix this, either do not render the element at all or pass null to src instead of an empty string. +An empty string ("") was passed to the src attribute. This may cause the browser to download the whole page again over the network. To fix this, either do not render the element at all or pass null to src instead of an empty string. +An empty string ("") was passed to the src attribute. This may cause the browser to download the whole page again over the network. To fix this, either do not render the element at all or pass null to src instead of an empty string. +An empty string ("") was passed to the src attribute. This may cause the browser to download the whole page again over the network. To fix this, either do not render the element at all or pass null to src instead of an empty string. +An empty string ("") was passed to the src attribute. This may cause the browser to download the whole page again over the network. To fix this, either do not render the element at all or pass null to src instead of an empty string. +An empty string ("") was passed to the src attribute. This may cause the browser to download the whole page again over the network. To fix this, either do not render the element at all or pass null to src instead of an empty string. +An empty string ("") was passed to the src attribute. This may cause the browser to download the whole page again over the network. To fix this, either do not render the element at all or pass null to src instead of an empty string. +An empty string ("") was passed to the src attribute. This may cause the browser to download the whole page again over the network. To fix this, either do not render the element at all or pass null to src instead of an empty string. +An empty string ("") was passed to the src attribute. This may cause the browser to download the whole page again over the network. To fix this, either do not render the element at all or pass null to src instead of an empty string. +An empty string ("") was passed to the src attribute. This may cause the browser to download the whole page again over the network. To fix this, either do not render the element at all or pass null to src instead of an empty string. +An empty string ("") was passed to the src attribute. This may cause the browser to download the whole page again over the network. To fix this, either do not render the element at all or pass null to src instead of an empty string. +An empty string ("") was passed to the src attribute. This may cause the browser to download the whole page again over the network. To fix this, either do not render the element at all or pass null to src instead of an empty string. +An empty string ("") was passed to the src attribute. This may cause the browser to download the whole page again over the network. To fix this, either do not render the element at all or pass null to src instead of an empty string. +An empty string ("") was passed to the src attribute. This may cause the browser to download the whole page again over the network. To fix this, either do not render the element at all or pass null to src instead of an empty string. +An empty string ("") was passed to the src attribute. This may cause the browser to download the whole page again over the network. To fix this, either do not render the element at all or pass null to src instead of an empty string. +An empty string ("") was passed to the src attribute. This may cause the browser to download the whole page again over the network. To fix this, either do not render the element at all or pass null to src instead of an empty string. +An empty string ("") was passed to the src attribute. This may cause the browser to download the whole page again over the network. To fix this, either do not render the element at all or pass null to src instead of an empty string. + +stderr | app/contributors/ContributorsClient.mock-integrations.test.tsx > ContributorsClient - Interactive Tooltips, Cursor Hovers & Touch Event Propagation > updates the rendered contributors when mocked data changes +An empty string ("") was passed to the src attribute. This may cause the browser to download the whole page again over the network. To fix this, either do not render the element at all or pass null to src instead of an empty string. + + ✓ app/contributors/ContributorsClient.mock-integrations.test.tsx (5 tests) 4272ms + ✓ renders successfully with mocked contributor data 1562ms + ✓ renders successfully when contributor lists are empty 385ms + ✓ renders successfully with a large mocked contributor list 1857ms +stderr | components/dashboard/PRInsights/PRInsightsClient.accessibility.test.tsx > PRInsightsClient accessibility compliance > exposes accessible names through real headings, links, and table coordinates +React does not recognize the `whileHover` prop on a DOM element. If you intentionally want it to appear in the DOM as a custom attribute, spell it as lowercase `whilehover` instead. If you accidentally passed it from a parent component, remove it from the DOM element. +Unknown event handler property `onHoverStart`. It will be ignored. +Unknown event handler property `onHoverEnd`. It will be ignored. + + ✓ app/components/Footer.test.tsx (15 tests) 4674ms + ✓ renders Documentation link with the correct destination 1142ms + ✓ opens Documentation link in a new tab securely 325ms + ✓ includes Resources section with documentation and repository links 329ms + ✓ renders readable footer labels instead of exposing localization keys 316ms + ✓ includes Connect section with social media links 622ms + ✓ components/WallOfLove.empty-fallback.test.tsx (8 tests) 4641ms + ✓ renders the Wall of Love heading without external data dependencies 1567ms + ✓ renders the developer feedback section text 495ms + ✓ renders the statistics section with hardcoded fallback values 515ms + ✓ renders testimonial content from internal hardcoded data 686ms + ✓ renders the developer community badge CTA 533ms + ✓ app/compare/page.accessibility.test.tsx (5 tests) 6196ms + ✓ should verify accessible labels and aria attributes are correctly mapped 1396ms + ✓ should maintain visible focus indicators or appropriate focus styles on interactive elements 686ms + ✓ should verify tooltip labels provide correct screen reader descriptions 894ms + ✓ should ensure sequential keyboard navigation follows a logical tab order 2126ms + ✓ should maintain a logically ordered heading hierarchy 1084ms + ✓ components/dashboard/PRInsights/PRInsightsClient.accessibility.test.tsx (5 tests) 3650ms + ✓ exposes accessible names through real headings, links, and table coordinates 1801ms + ✓ keeps focusable controls visible and avoids suppressing outline behavior 405ms + ✓ supports normal keyboard tab order across chart controls and PR highlight links 515ms + ✓ renders headings with a logical structural hierarchy 670ms + ✓ app/generator/components/sections/TechnologiesSection.timezone-boundaries.test.tsx (5 tests) 5400ms + ✓ 1. Mock standard timezone settings (e.g., UTC, EST, IST, and JST) 2130ms + ✓ 2. Assert calculations align commits onto the correct visual dates 879ms + ✓ 3. Verify leap year boundaries parse without leaving gaps in grids 588ms + ✓ 4. Assert calendar date format utility outputs match expectations in each locale 569ms + ✓ 5. Test offsets around transition dates like daylight savings 1222ms +stderr | app/compare/CompareClient.theme-contrast.test.tsx > CompareClient Theme Contrast > applies theme contrast classes to heading +React does not recognize the `whileHover` prop on a DOM element. If you intentionally want it to appear in the DOM as a custom attribute, spell it as lowercase `whilehover` instead. If you accidentally passed it from a parent component, remove it from the DOM element. +React does not recognize the `whileTap` prop on a DOM element. If you intentionally want it to appear in the DOM as a custom attribute, spell it as lowercase `whiletap` instead. If you accidentally passed it from a parent component, remove it from the DOM element. + +stderr | app/compare/CompareClient.accessibility.test.tsx > CompareClient Accessibility Standards > ensures inputs and controls have accessible names +React does not recognize the `whileHover` prop on a DOM element. If you intentionally want it to appear in the DOM as a custom attribute, spell it as lowercase `whilehover` instead. If you accidentally passed it from a parent component, remove it from the DOM element. +React does not recognize the `whileTap` prop on a DOM element. If you intentionally want it to appear in the DOM as a custom attribute, spell it as lowercase `whiletap` instead. If you accidentally passed it from a parent component, remove it from the DOM element. + + ✓ app/customize/components/ExportPanel.theme-contrast.test.tsx (5 tests) 985ms + ✓ verifies visual cohesion classes on export format selector buttons 591ms + ✓ app/compare/CompareClient.theme-contrast.test.tsx (5 tests) 4535ms + ✓ applies theme contrast classes to heading 2481ms + ✓ applies light and dark theme classes to first username input 554ms + ✓ applies light and dark theme classes to second username input 353ms + ✓ applies contrast classes to compare button 641ms + ✓ renders developer showdown badge with theme-aware styling 473ms + ✓ app/compare/CompareClient.accessibility.test.tsx (5 tests) 4115ms + ✓ ensures inputs and controls have accessible names 1197ms + ✓ keeps primary actions keyboard focusable with visible outline 1242ms + ✓ associates tooltip content using aria-describedby 508ms + ✓ maintains logical keyboard tab order for interactive elements 456ms + ✓ renders proper heading hierarchy without skipping levels 701ms + ✓ components/dashboard/DashboardClient.mouse-interactivity.test.tsx (5 tests) 5812ms + ✓ Assert appropriate cursor style classes (like pointer) are applied on hover: verifies interactive class names on buttons 1733ms + ✓ Trigger simulated mouseenter/hover gestures on active segments or interactive nodes: buttons accept hover safely 687ms + ✓ Test custom click/touch gestures and ensure click events propagate correctly: Profile Optimizer button sets modal state 956ms + ✓ Verify that responsive tooltip layouts display at computed coordinates: delegates stats formatting to StatsCard 960ms + ✓ Check that mouseleave events successfully hide temporary overlay visuals: handles Escape key overlay exit 1469ms + ✓ app/customize/components/ThemeSelector.mock-integrations.test.tsx (5 tests) 3045ms + ✓ 1. Local Cache Verification: verifies the local cache is checked before any async service/database call 1294ms + ✓ 2. Pending/Loading State: tests that pending/loading state is rendered while async operations are unresolved 384ms + ✓ 4. Fallback Behavior: verifies fallback behavior when the mocked service times out or rejects 881ms + ✓ components/reviewform.empty-fallback.test.tsx (5 tests) 4494ms + ✓ renders the empty default form without runtime errors 982ms + ✓ shows a clear fallback validation message when name is missing 603ms + ✓ shows a clear fallback validation message when handle is missing 1107ms + ✓ shows a non-breaking fallback validation message for invalid handle input 1611ms +stderr | app/compare/CompareClient.test.tsx > CompareClient > renders comparison page +React does not recognize the `whileHover` prop on a DOM element. If you intentionally want it to appear in the DOM as a custom attribute, spell it as lowercase `whilehover` instead. If you accidentally passed it from a parent component, remove it from the DOM element. +React does not recognize the `whileTap` prop on a DOM element. If you intentionally want it to appear in the DOM as a custom attribute, spell it as lowercase `whiletap` instead. If you accidentally passed it from a parent component, remove it from the DOM element. + +stderr | app/compare/CompareClient.test.tsx > CompareClient > renders comparison page +An update to CompareClient inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act +An update to CompareClient inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act + +stderr | app/compare/CompareClient.test.tsx > CompareClient > renders comparison page +An update to CompareClient inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act +An update to CompareClient inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act + + ✓ components/DeveloperArena.empty-fallback.test.tsx (6 tests) 3213ms + ✓ 1. renders without crashing when IntersectionObserver is unavailable in the runtime 935ms + ✓ 2. immediately shows the final stat counts instead of starting from zero 499ms + ✓ 3. still renders the core section headings while running in fallback mode 468ms + ✓ 5. survives repeated mount/unmount cycles under the fallback path without leaking errors 782ms +stderr | app/compare/CompareClient.test.tsx > CompareClient > allows usernames to be modified via controls +An update to CompareClient inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act +An update to CompareClient inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act + +stderr | app/compare/CompareClient.test.tsx > CompareClient > allows usernames to be modified via controls +An update to CompareClient inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act +An update to CompareClient inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act + + ✓ components/dashboard/DashboardClient.theme-contrast.test.tsx (5 tests) 969ms + ✓ root element exists and is visible 348ms + ✓ app/compare/CompareClient.test.tsx (7 tests) 5376ms + ✓ renders comparison page 1339ms + ✓ allows usernames to be modified via controls 385ms + ✓ renders comparative scores correctly 1390ms + ✓ updates route when compare button is clicked 563ms + ✓ shows error message when api request fails 552ms + ✓ stops loading and shows an error when the comparison request times out 555ms + ✓ does not start a duplicate request while the same comparison is already loading 573ms +stderr | app/compare/CompareClient.responsive-breakpoints.test.tsx > CompareClient responsive breakpoints > renders mobile friendly input controls +React does not recognize the `whileHover` prop on a DOM element. If you intentionally want it to appear in the DOM as a custom attribute, spell it as lowercase `whilehover` instead. If you accidentally passed it from a parent component, remove it from the DOM element. +React does not recognize the `whileTap` prop on a DOM element. If you intentionally want it to appear in the DOM as a custom attribute, spell it as lowercase `whiletap` instead. If you accidentally passed it from a parent component, remove it from the DOM element. + + ✓ components/dashboard/PopularPinnedRepos.mock-integrations.test.tsx (21 tests) 2339ms + ✓ renders starred repo names after switching to Starred tab 648ms + ✓ lib/github.msw.test.ts (9 tests) 4916ms + ✓ handles 500 server errors gracefully 2310ms + ✓ handles network errors gracefully by falling back to mock profile 2406ms + ✓ app/customize/components/ThemeQuickPresets.mouse-interactivity.test.tsx (5 tests) 2943ms + ✓ renders interactive theme buttons with tooltip titles 1747ms + ✓ keeps hoverable preset buttons styled with pointer cursor class support 342ms + ✓ app/customize/components/ThemeQuickPresets.theme-contrast.test.tsx (5 tests) 1975ms + ✓ renders dark theme preset button 1147ms + ✓ app/compare/CompareClient.responsive-breakpoints.test.tsx (5 tests) 4572ms + ✓ renders mobile friendly input controls 2159ms + ✓ renders compare button for small viewport interactions 1071ms + ✓ uses responsive container spacing classes 610ms + ✓ uses responsive layout grid classes 436ms + ✓ app/customize/components/ControlsPanel.mouse-interactivity.test.tsx (5 tests) 3648ms + ✓ keeps scale hover passive and changes scale only when a real segmented control is clicked 1902ms + ✓ routes click and touch events through the actual scale button 468ms + ✓ exposes pointer affordances on real select, color-picker, and shuffle controls 466ms + ✓ disables and restores custom color controls based on the real theme prop 563ms + ✓ components/dashboard/RefreshButton.test.tsx (6 tests) 1014ms + ✓ has correct aria-label for accessibility 822ms + ✓ app/components/HeroSection.massive_scaling.test.tsx (5 tests) 2061ms + ✓ Case 1: renders successfully with maximum content constraints 869ms + ✓ Case 4: maintains responsive layout with extreme viewport sizes 313ms + ✓ Case 5: remains stable under rapid re-renders with extreme props 770ms + ✓ app/generator/data/technologies.accessibility.test.tsx (5 tests) 1122ms + ✓ Case 2: exposes category filters as accessible buttons 656ms + ✓ lib/graph/dependencyGraph.test.ts (23 tests) 1960ms + ✓ should have every edge targetId reference an existing graph node or be an external reference 403ms + ✓ should have all edge scores in the valid range [0, 1] 323ms + ✓ should have consistent score-strength pairings 394ms + ✓ components/TopRivalriesTicker.accessibility.test.tsx (5 tests) 477ms + ✓ components/dashboard/ThemeSelector.test.tsx (12 tests) 3258ms + ✓ renders theme preset buttons with accessibility labels 749ms + ✓ renders accessible theme controls consistently after rerender 837ms + ✓ renders all preset buttons as visible elements 349ms +stderr | components/dashboard/PRInsights/PRInsightsClient.theme-contrast.test.tsx > PRInsightsClient Theme Contrast and Visual Cohesion > 1. should emulate both dark and light presets +React does not recognize the `whileHover` prop on a DOM element. If you intentionally want it to appear in the DOM as a custom attribute, spell it as lowercase `whilehover` instead. If you accidentally passed it from a parent component, remove it from the DOM element. +Unknown event handler property `onHoverStart`. It will be ignored. +Unknown event handler property `onHoverEnd`. It will be ignored. + + ✓ components/WallOfLove.timezone-boundaries.test.tsx (5 tests) 3497ms + ✓ Reduced Motion Boundary (UTC Equivalent): renders content when motion reduction is enabled 1819ms + ✓ Visual Alignment Boundary (Calendar Date Alignment Equivalent): preserves testimonial visibility across marquee boundaries 361ms + ✓ Stats Continuity Boundary (Leap Year Equivalent): renders all statistic values without gaps 422ms + ✓ Avatar Mapping Boundary (Timezone Offset Equivalent): preserves avatar-to-author associations 376ms + ✓ Content Preservation Boundary (Calendar Grid Integrity Equivalent): preserves testimonial message content across render boundaries 499ms + ✓ app/customize/components/ThemeQuickPresets.responsive-breakpoints.test.tsx (5 tests) 2300ms + ✓ renders correctly on a mobile viewport (375px) 1334ms + ✓ renders the same preset buttons across viewport sizes 418ms + ✓ does not introduce fixed-width layout issues on small screens 313ms + ✓ components/dashboard/PRInsights/PRInsightsClient.theme-contrast.test.tsx (5 tests) 2753ms + ✓ 1. should emulate both dark and light presets 1621ms + ✓ 2. should assert that visual elements adapt color styling properly for both settings 442ms + ✓ 3. should verify contrast ratio standards for textual elements 397ms + ✓ app/components/Footer.accessibility.test.tsx (5 tests) 2429ms + ✓ renders footer landmark with correct heading hierarchy 1272ms + ✓ renders social links with descriptive aria-labels for screen readers 770ms + ✓ app/generator/data/socials.accessibility.test.tsx (5 tests) 2162ms + ✓ Case 2: exposes navigation tabs as accessible tab controls 801ms + ✓ Case 3: exposes category filters as keyboard reachable controls 581ms + ✓ Case 4: platform selectors expose readable accessible names 348ms + ✓ components/WallOfLove.theme-contrast.test.tsx (5 tests) 6239ms + ✓ renders Wall Of Love heading 1119ms + ✓ renders developer feedback text 1950ms + ✓ renders statistics section 1579ms + ✓ renders dark mode classes 826ms + ✓ renders testimonial cards 745ms +stderr | components/dashboard/PopularPinnedRepos.error-resilience.test.tsx > PopularRepos — error resilience > handles repos with duplicate names without crashing +Encountered two children with the same key, `same`. Keys should be unique so that components maintain their identity across updates. Non-unique keys may cause children to be duplicated and/or omitted — the behavior is unsupported and could change in a future version. +Encountered two children with the same key, `same`. Keys should be unique so that components maintain their identity across updates. Non-unique keys may cause children to be duplicated and/or omitted — the behavior is unsupported and could change in a future version. + + ✓ components/dashboard/PopularPinnedRepos.error-resilience.test.tsx (17 tests) 4243ms + ✓ renders without crashing when stargazerCount is 0 382ms + ✓ handles repos with duplicate names without crashing 447ms + ✓ outside click after unmount does not throw 1146ms + ✓ does not crash when switching views back and forth many times 997ms + ✓ renders correctly when starredRepos is removed after being present 395ms + ✓ components/dashboard/ShareSheet.test.tsx (23 tests) 6854ms + ✓ renders correctly when isOpen is true 671ms + ✓ calls onClose when close button is clicked 1602ms + ✓ handles Copy Link action 373ms + ✓ downloads the QR code as SVG when Save File is clicked 317ms + ✓ handles Download JSON action 336ms + ✓ handles Download STL action 379ms + ✓ opens GitHub Wrapped in a new tab and closes the sheet 367ms + ✓ app/compare/CompareClient.timezone-boundaries.test.tsx (5 tests) 9044ms + ✓ Test 1: should mock standard timezone settings (e.g., UTC, EST, IST, and JST) 3612ms + ✓ Test 2: should assert calculations align commits onto the correct visual dates 1289ms + ✓ Test 3: should verify leap year boundaries parse without leaving gaps in grids 1879ms + ✓ Test 4: should assert calendar date format utility outputs match expectations in each locale 1073ms + ✓ Test 5: should test offsets around transition dates like daylight savings 1173ms + ✓ components/ScrollToBottom.error-resilience.test.tsx (6 tests) 1824ms + ✓ renders without crashing 488ms + ✓ calls window.scrollTo safely when the button is clicked 1168ms + ✓ app/generator/components/PreviewPanel.timezone-boundaries.test.tsx (5 tests) 2496ms + ✓ 1. preserves UTC timestamps in preview mode 1793ms +stderr | app/contributors/ContributorsClient.responsive-breakpoints.test.tsx > ContributorsClient - Responsive Multi-device Columns & Mobile Viewport Layouts > reflows the stats grid from three desktop columns into a single mobile column +React does not recognize the `whileInView` prop on a DOM element. If you intentionally want it to appear in the DOM as a custom attribute, spell it as lowercase `whileinview` instead. If you accidentally passed it from a parent component, remove it from the DOM element. + + ✓ app/customize/components/ThemeSelector.mouse-interactivity.test.tsx (5 tests) 4202ms + ✓ changes theme through the native selector interaction 2246ms + ✓ selects a concrete non-virtual theme when shuffle is clicked 1216ms + ✓ app/compare/CompareClient.empty-fallback.test.tsx (5 tests) 5186ms + ✓ renders input fields with empty values by default 2666ms + ✓ renders compare button in default state 1080ms + ✓ does not render results section when no data is present 450ms + ✓ does not show error message on initial empty render 377ms + ✓ renders page heading in empty state 551ms + ✓ components/ReturnToTop.theme-contrast.test.tsx (5 tests) 688ms + ✓ 2. asserts that visual styling for ReturnToTop adapts properly to current theme settings 564ms + ✓ app/contributors/ContributorsClient.responsive-breakpoints.test.tsx (5 tests) 2799ms + ✓ reflows the stats grid from three desktop columns into a single mobile column 425ms + ✓ stacks the CTA action row vertically on mobile via flex-col before switching to flex-row on sm+ 1203ms + ✓ keeps mobile-specific toggle states responsive on primary CTAs (active:scale-95 tap feedback) 763ms + ✓ app/customize/components/ControlsPanel.empty-fallback.test.tsx (5 tests) 1221ms + ✓ renders safely with empty default values 594ms +stderr | components/dashboard/DashboardClient.error-resilience.test.tsx > DashboardClient Exception safety, Hydration Stability & Error Fallbacks > verify initialization stability: handles undefined insights and popularRepos lists gracefully +Received `true` for a non-boolean attribute `layout`. + +If you want to write it to the DOM, pass a string instead: layout="true" or layout={value.toString()}. + +stderr | app/generator/components/sections/CommitPulseSection.timezone-boundaries.test.tsx > CommitPulseSection - Timezone Normalization & Calendar Data Boundary Alignment > identifies malformed color parameters and applies appropriate hex invalid warning styles +An update to CommitPulseSection inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act +An update to CommitPulseSection inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act + +stderr | components/dashboard/DashboardClient.error-resilience.test.tsx > DashboardClient Exception safety, Hydration Stability & Error Fallbacks > verify comparison fetch failure exception safety: displays the network error message +Unknown event handler property `onAnimationComplete`. It will be ignored. + +stderr | app/generator/components/sections/CommitPulseSection.timezone-boundaries.test.tsx > CommitPulseSection - Timezone Normalization & Calendar Data Boundary Alignment > triggers accent clearing pathways predictably upon interaction commands +An update to CommitPulseSection inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act +An update to CommitPulseSection inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act + + ✓ app/generator/components/sections/CommitPulseSection.timezone-boundaries.test.tsx (5 tests) 922ms + ✓ triggers accent clearing pathways predictably upon interaction commands 616ms + ✓ components/WallOfLove.accessibility.test.tsx (5 tests) 3640ms + ✓ renders the main heading 1329ms + ✓ renders avatars with alt text 859ms + ✓ renders accessibility badge text 498ms + ✓ renders statistics labels 744ms + ✓ app/contributors/ContributorsClient.empty-fallback.test.tsx (5 tests) 2900ms + ✓ renders safely with empty contributors array 1294ms + ✓ renders safely with empty top contributors array 725ms + ✓ renders correctly when total contributions is zero 472ms + ✓ components/dashboard/DashboardClient.error-resilience.test.tsx (5 tests) 3470ms + ✓ verify initialization stability: handles undefined insights and popularRepos lists gracefully 619ms + ✓ verify comparison fetch failure exception safety: displays the network error message 879ms + ✓ verify comparison non-ok response handling: displays custom server error message 604ms + ✓ verify invalid JSON response body resilience: displays fallback error parsing message 603ms + ✓ verify transition state boundary safety: switches between single profile and compare mode safely 753ms + ✓ app/customize/components/ControlsPanel.timezone-boundaries.test.tsx (5 tests) 2603ms + ✓ labels the "(current)" option using the viewer's local year, not UTC (2026-01-01T00:30:00Z in America/Los_Angeles -> 2025) 781ms + ✓ labels the "(current)" option using the viewer's local year, not UTC (2025-12-31T23:30:00Z in Asia/Tokyo -> 2026) 338ms + ✓ generates the year option range down to 2019 with no gaps or duplicates, anchored to the local year 821ms + ✓ does not drop or duplicate a year option across a Feb 29 leap-year boundary 440ms + ✓ app/customize/components/ThemeQuickPresets.empty-fallback.test.tsx (5 tests) 3026ms + ✓ renders successfully with an unknown theme value 1926ms + ✓ renders preset buttons while no active theme matches 567ms +stderr | app/contributors/page.theme-contrast.test.tsx > ContributorsPage - Theme Contrast & Visual Cohesion > retains theme contrast utility classes in the layout container structure +React does not recognize the `whileInView` prop on a DOM element. If you intentionally want it to appear in the DOM as a custom attribute, spell it as lowercase `whileinview` instead. If you accidentally passed it from a parent component, remove it from the DOM element. + + ✓ components/dashboard/HistoricalTrendView.accessibility.test.tsx (5 tests) 2740ms + ✓ Case 1: Inspect markup landmarks to verify the correct usage of accessible coordinate labels on container modules 1134ms + ✓ Case 2: Assert interactive nodes designed to accept focus maintain visible outline class parameters 727ms + ✓ Case 4: Test keyboard control path selectors to ensure normal tab ordering 390ms + ✓ app/generator/components/sections/TechnologiesSection.mock-integrations.test.tsx (5 tests) 4572ms + ✓ 1. Mock standard asynchronous imports and databases using stubs 1967ms + ✓ 3. Assert local cache layers are queried before triggering database retrievals 1565ms + ✓ 5. Assert complete cache sync is written on success callbacks 842ms + ✓ app/customize/components/AdvancedSettingsPanel.accessibility.test.tsx (5 tests) 1491ms + ✓ 1. verifies that the root container has a region role with a descriptive accessibility label 1061ms + ✓ app/contributors/page.theme-contrast.test.tsx (5 tests) 2607ms + ✓ retains theme contrast utility classes in the layout container structure 1530ms + ✓ applies text colors that adapt to system preferences on primary headings 341ms + ✓ app/customize/components/ThemeSelector.responsive-breakpoints.test.tsx (5 tests) 980ms + ✓ renders correctly on a mobile viewport (375px) 663ms +Not implemented: navigation to another Document + ✓ app/components/navbar.test.tsx (8 tests) 2994ms + ✓ menu is hidden by default 743ms + ✓ renders semantic navigation and mobile menu controls at small widths 959ms + ✓ closes the open hamburger menu when crossing into the desktop breakpoint 312ms + ✓ dismisses the open mobile menu when a dropdown link is tapped 454ms + ✓ app/burnout-analyzer/page.test.tsx (3 tests) 1345ms + ✓ rejects a path that is not exactly owner/repo and does not call the API 976ms + ✓ app/documentation/code-block.accessibility.test.tsx (5 tests) 545ms + ✓ renders copy button with accessible aria-label 376ms + ✓ app/generator/components/ReadmeInsightsPanel.test.tsx (10 tests) 566ms + ✓ shows up to 4 tips when state is empty 336ms + ✓ app/customize/components/ThemeSelector.empty-fallback.test.tsx (5 tests) 2236ms + ✓ renders a non-breaking fallback UI when theme prop is an empty string 1099ms + ✓ renders a clear, non-breaking fallback when theme is an unrecognised key not in THEME_KEYS 377ms + ✓ confirms key DOM structure markers exist and the select contains all option elements in the empty state 334ms + ✓ components/Leaderboard.accessibility.test.tsx (5 tests) 762ms + ✓ exposes interactive leaderboard entries as buttons 429ms + ✓ app/contributors/ContributorsSearch.theme-contrast.test.tsx (5 tests) 1101ms + ✓ renders light mode contrast classes correctly 332ms + ✓ applies dark and light border styling on contributor cards 610ms +stderr | app/global-error.empty-fallback.test.tsx > Global Error Page - Empty & Missing Input Fallbacks > renders successfully when error is null +In HTML, <html> cannot be a child of <div>. +This will cause a hydration error. + + ✓ app/customize/components/ControlsPanel.error-resilience.test.tsx (5 tests) 1167ms + ✓ renders successfully without crashing 663ms + ✓ app/generator/components/sections/TechnologiesSection.error-resilience.test.tsx (5 tests) 1586ms + ✓ Case 1: Verify Hydration Stability by rendering normally without exceptions 806ms + ✓ Case 5: Ensure user reset/reload paths are available on the recovery panels and function correctly 509ms + ✓ app/global-error.empty-fallback.test.tsx (6 tests) 650ms + ✓ renders interactive elements and triggers reset correctly in fallback state 453ms + ✓ components/WallOfLove.responsive-breakpoints.test.tsx (5 tests) 3135ms + ✓ Mock standard mobile-width media coordinates (e.g. 375px wide viewports): Mock window viewport to simulate iPhone SE size 1387ms + ✓ Assert that columns reflow into standard vertical flex lists: Container stacks rows vertically and tracks align horizontally 336ms + ✓ Verify styling values are not absolute widths that cause horizontal scrollbars on smaller viewports: containers use relative constraints 425ms + ✓ Check that navigation components scale down gracefully: Click/touch targets and layout bounds are properly configured 610ms + ✓ Assert mobile-specific toggle states respond cleanly: reduced motion toggle disables GSAP marquees 362ms + ✓ components/dashboard/ActivityLandscape.accessibility.test.tsx (5 tests) 746ms + ✓ renders chart with accessible role and aria-label 448ms + ✓ app/customize/components/ThemeQuickPresets.error-resilience.test.tsx (5 tests) 2354ms + ✓ renders normally without crashing 1961ms + ✓ app/components/Footer.theme-contrast.test.tsx (5 tests) 1326ms + ✓ renders footer with light theme contrast classes 522ms + ✓ keeps footer links readable and interactive across themes 441ms + ✓ app/generator/components/sections/DescriptionSection.massive_scaling.test.tsx (5 tests) 1886ms + ✓ Case 1: renders correctly at the exact 280-character limit — counter reads zero and layout stays intact 381ms + ✓ Case 3: amber warning activates at the near-limit threshold across full range re-renders 650ms + ✓ Case 5: DOM structure stays intact after 500 rapid re-renders at extreme bounds 790ms + ✓ app/components/theme-switch.test.tsx (12 tests) 836ms + ✓ renders correctly 540ms +stderr | lib/github.token-encryption.test.ts > github-token-encryption > encryptGitHubToken > returns token as-is when encryption key is not configured +GITHUB_TOKEN_ENCRYPTION_KEY not configured. GitHub tokens should be encrypted in production. + +stderr | app/generator/components/sections/TechnologyGraph.accessibility.test.tsx > TechnologyGraph Accessibility > toggles technology selection using Enter key +An update to TechnologyGraph inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act + +stderr | app/generator/components/sections/TechnologyGraph.accessibility.test.tsx > TechnologyGraph Accessibility > toggles technology selection using Space key +An update to TechnologyGraph inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act + +stderr | components/dashboard/DashboardClient.accessibility.test.tsx > DashboardClient - Accessibility & Aria compliance (Variation 4) > Case 1: Inspect markup to verify correct accessible label coordinates on landmarks and interactive elements +Received `true` for a non-boolean attribute `layout`. + +If you want to write it to the DOM, pass a string instead: layout="true" or layout={value.toString()}. + + ✓ app/generator/components/sections/TechnologyGraph.accessibility.test.tsx (9 tests) 2073ms + ✓ supports keyboard focus 479ms + ✓ supports keyboard focus on SVG nodes 666ms + ✓ lib/github.token-encryption.test.ts (19 tests) 1805ms + ✓ parses and encrypts comma-separated tokens 343ms + ✓ decrypts and rotates tokens 407ms + ✓ app/customize/components/AdvancedSettingsPanel.mock-integrations.test.tsx (5 tests) 1092ms + ✓ 1. renders all controlled components inside the configuration region 716ms + ✓ components/dashboard/DashboardClient.accessibility.test.tsx (5 tests) 3075ms + ✓ Case 1: Inspect markup to verify correct accessible label coordinates on landmarks and interactive elements 1398ms + ✓ Case 3: Verify tooltip labels are announced with correct accessibility descriptions 445ms + ✓ Case 4: Test keyboard control path selectors to ensure normal tab ordering 500ms + ✓ Case 5: Confirm standard headings exist in correct logical hierarchical order 436ms + ✓ components/KonamiEasterEgg.error-resilience.test.tsx (5 tests) 1835ms + ✓ auto-resets to the idle state after the display duration elapses 1585ms + ✓ components/InteractiveViewer.accessibility.test.tsx (15 tests) 2138ms + ✓ exposes an accessible name on the interactive container 695ms + ✓ app/customize/components/ControlsPanel.theme-contrast.test.tsx (6 tests) 1238ms + ✓ calls onScaleChange when logarithmic scale button is clicked 671ms + ✓ lib/svg/generator.test.ts (205 tests) 2591ms + ✓ generateSVG with all themes produces valid XML 1353ms +stderr | app/layout.responsive-breakpoints.test.tsx > RootLayout Responsive Multi-device Columns & Mobile Viewport Layouts > 1. mocks standard mobile-width media coordinates (e.g. 375px wide viewports) +In HTML, <html> cannot be a child of <div>. +This will cause a hydration error. + + ✓ app/not-found.accessibility.test.tsx (5 tests) 1219ms + ✓ exposes accessible names on all interactive elements 812ms + ✓ app/layout.responsive-breakpoints.test.tsx (5 tests) 1444ms + ✓ 1. mocks standard mobile-width media coordinates (e.g. 375px wide viewports) 556ms + ✓ app/generator/GeneratorClient.responsive-breakpoints.test.tsx (5 tests) 915ms + ✓ keeps editor and preview panels accessible on smaller viewports 419ms + ✓ tests/visual/visual.test.ts (20 tests) 1471ms + ✓ app/customize/components/ThemeQuickPresets.mock-integration.test.tsx (5 tests) 931ms + ✓ renders one button for every selectable theme 506ms + ✓ app/generator/GeneratorClient.mock-integrations.test.tsx (5 tests) 2557ms + ✓ Case 3: asserts local cache layers are queried before triggering database retrievals 1385ms + ✓ Case 5: asserts complete cache sync is written on success callbacks 1046ms + ✓ app/generator/components/sections/SocialsSection.accessibility.test.tsx (5 tests) 2460ms + ✓ renders accessible tab buttons 746ms + ✓ allows keyboard navigation through primary controls 960ms + ✓ components/dashboard/PopularPinnnedRepos.mouse-interactivity.test.tsx (5 tests) 1699ms + ✓ triggers mouseenter and mouseleave gestures on repository cards and validates transition classes 908ms + ✓ handles click and touch gestures and ensures events propagate correctly through nodes 313ms + ✓ components/dashboard/ComparisonStatsCard.responsive-breakpoints.test.tsx (5 tests) 776ms + ✓ verifies styling values use relative widths preventing horizontal scrollbars on mobile 426ms +Not implemented: HTMLCanvasElement's getContext() method: without installing the canvas npm package +Not implemented: HTMLCanvasElement's getContext() method: without installing the canvas npm package + ✓ app/contributors/ContributorsClient.accessibility.test.tsx (5 tests) 788ms + ✓ renders accessible heading content for screen readers 537ms +Not implemented: HTMLCanvasElement's getContext() method: without installing the canvas npm package +Not implemented: HTMLCanvasElement's getContext() method: without installing the canvas npm package +Not implemented: HTMLCanvasElement's getContext() method: without installing the canvas npm package +Not implemented: HTMLCanvasElement's getContext() method: without installing the canvas npm package +Not implemented: HTMLCanvasElement's getContext() method: without installing the canvas npm package +Not implemented: HTMLCanvasElement's getContext() method: without installing the canvas npm package + ✓ app/generator/components/sections/TechnologyGraph.empty-fallback.test.tsx (5 tests) 678ms +Not implemented: HTMLCanvasElement's getContext() method: without installing the canvas npm package +Not implemented: HTMLCanvasElement's getContext() method: without installing the canvas npm package +Not implemented: HTMLCanvasElement's getContext() method: without installing the canvas npm package +Not implemented: HTMLCanvasElement's getContext() method: without installing the canvas npm package +Not implemented: HTMLCanvasElement's getContext() method: without installing the canvas npm package +Not implemented: HTMLCanvasElement's getContext() method: without installing the canvas npm package +Not implemented: HTMLCanvasElement's getContext() method: without installing the canvas npm package +Not implemented: HTMLCanvasElement's getContext() method: without installing the canvas npm package +Not implemented: HTMLCanvasElement's getContext() method: without installing the canvas npm package +Not implemented: HTMLCanvasElement's getContext() method: without installing the canvas npm package +Not implemented: HTMLCanvasElement's getContext() method: without installing the canvas npm package +Not implemented: HTMLCanvasElement's getContext() method: without installing the canvas npm package +Not implemented: HTMLCanvasElement's getContext() method: without installing the canvas npm package +Not implemented: HTMLCanvasElement's getContext() method: without installing the canvas npm package +Not implemented: HTMLCanvasElement's getContext() method: without installing the canvas npm package +Not implemented: HTMLCanvasElement's getContext() method: without installing the canvas npm package + ✓ components/dashboard/Heatmap.test.tsx (6 tests) 2246ms + ✓ renders all provided historical entries as grid cells 823ms + ✓ renders without crashing with 365 days of data 1134ms +Not implemented: HTMLCanvasElement's getContext() method: without installing the canvas npm package +Not implemented: HTMLCanvasElement's getContext() method: without installing the canvas npm package +Not implemented: HTMLCanvasElement's getContext() method: without installing the canvas npm package +Not implemented: HTMLCanvasElement's getContext() method: without installing the canvas npm package +Not implemented: HTMLCanvasElement's getContext() method: without installing the canvas npm package +Not implemented: HTMLCanvasElement's getContext() method: without installing the canvas npm package +Not implemented: HTMLCanvasElement's getContext() method: without installing the canvas npm package +Not implemented: HTMLCanvasElement's getContext() method: without installing the canvas npm package +Not implemented: HTMLCanvasElement's getContext() method: without installing the canvas npm package +Not implemented: HTMLCanvasElement's getContext() method: without installing the canvas npm package +Not implemented: HTMLCanvasElement's getContext() method: without installing the canvas npm package +Not implemented: HTMLCanvasElement's getContext() method: without installing the canvas npm package +Not implemented: HTMLCanvasElement's getContext() method: without installing the canvas npm package +Not implemented: HTMLCanvasElement's getContext() method: without installing the canvas npm package + ✓ components/AdvancedColorPicker.test.tsx (21 tests) 1866ms + ✓ renders Presets tab as active by default when presets are provided 641ms + ✓ app/components/Footer.responsive-breakpoints.test.tsx (10 tests) 2008ms + ✓ renders all four grid sections on mobile viewport 501ms + ✓ renders navigation links with correct ARIA labels across viewports 932ms + ✓ components/dashboard/ResumePreviewForm.accessibility.test.tsx (5 tests) 936ms + ✓ checks that the save button is disabled when saving to prevent multiple submissions 463ms +Not implemented: navigation to another Document + ✓ app/components/navbar.responsive-breakpoints.test.tsx (8 tests) 1592ms + ✓ 1. Renders the Navbar component without the mobile menu initially open 613ms + ✓ app/generator/components/sections/DescriptionSection.responsive-breakpoints.test.tsx (5 tests) 902ms + ✓ asserts that columns reflow into standard vertical flex lists 600ms + ✓ components/dashboard/PRInsights/TopMetricsRow.error-resilience.test.tsx (5 tests) 1103ms + ✓ renders stably with valid data and never engages the error fallback 434ms + ✓ catches an unexpected runtime exception thrown by a nested child component 376ms + ✓ components/WallOfLove.error-resilience.test.tsx (5 tests) 1485ms + ✓ should maintain hydration stability when initial data is missing 663ms + ✓ should trigger user reset or reload path on recovery panel click 746ms + ✓ components/dashboard/PRInsights/RepoPerformanceTable.theme-contrast.test.tsx (5 tests) 531ms + ✓ keeps table content visible and accessible 342ms + ✓ lib/crypto.test.ts (8 tests) 1653ms + ✓ produces different ciphertexts for the same input (random salt/IV) 405ms +stderr | components/reviewform.responsive-breakpoints.test.tsx > SubmitReviewPage responsive breakpoints > renders the form correctly at a standard mobile viewport +React does not recognize the `whileHover` prop on a DOM element. If you intentionally want it to appear in the DOM as a custom attribute, spell it as lowercase `whilehover` instead. If you accidentally passed it from a parent component, remove it from the DOM element. +React does not recognize the `whileTap` prop on a DOM element. If you intentionally want it to appear in the DOM as a custom attribute, spell it as lowercase `whiletap` instead. If you accidentally passed it from a parent component, remove it from the DOM element. + + ✓ components/reviewform.responsive-breakpoints.test.tsx (5 tests) 1240ms + ✓ renders the form correctly at a standard mobile viewport 834ms + ✓ lib/github.fetch-org-members-rate-limit.test.ts (3 tests) 3472ms + ✓ preserves the generic org members error for non-rate-limited failures 3271ms + ✓ components/ExportButton.test.tsx (13 tests) 1337ms + ✓ renders the default "Export" trigger button, closed and not loading 606ms + ✓ app/generator/components/sections/SocialsSection.timezone-boundaries.test.tsx (5 tests) 2168ms + ✓ 1. mock standard timezone settings (UTC, EST, IST, JST) and verify rendering remains consistent 1026ms + ✓ 2. verify timezone offsets do not shift rendered data unexpectedly across date boundaries 519ms + ✓ components/dashboard/HistoricalTrendView.theme-contrast.test.tsx (5 tests) 440ms + ✓ app/contributors/loading.empty-fallback.test.tsx (5 tests) 622ms + ✓ shows a clear fallback loading state without persistent copy 371ms + ✓ app/achievements/UnlockCelebration.test.tsx (4 tests) 1282ms + ✓ renders as a labelled modal dialog 950ms +stderr | components/dashboard/ComparisonStatsCard.test.tsx > ComparisonStatsCard > renders correctly with title, labels and values +React does not recognize the `whileInView` prop on a DOM element. If you intentionally want it to appear in the DOM as a custom attribute, spell it as lowercase `whileinview` instead. If you accidentally passed it from a parent component, remove it from the DOM element. +React does not recognize the `whileHover` prop on a DOM element. If you intentionally want it to appear in the DOM as a custom attribute, spell it as lowercase `whilehover` instead. If you accidentally passed it from a parent component, remove it from the DOM element. + + ✓ components/dashboard/PRInsights/Highlights.accessibility.test.tsx (5 tests) 1038ms + ✓ inspects markup for accessible link roles and descriptive text labels 699ms + ✓ app/documentation/code-block.mouse-interactivity.test.tsx (5 tests) 861ms + ✓ renders copy button with pointer hover styling 674ms + ✓ components/dashboard/ComparisonStatsCard.test.tsx (50 tests) 1183ms +stderr | components/dashboard/DashboardClient.empty-fallback.test.tsx > DashboardClient empty fallback states > renders with an empty languages array without crashing +Received `true` for a non-boolean attribute `layout`. + +If you want to write it to the DOM, pass a string instead: layout="true" or layout={value.toString()}. + +stderr | components/dashboard/PRInsights/PRStatusDistribution.accessibility.test.tsx > PRStatusDistribution Accessibility Standards & Screen Reader Aria Compliance > inspects markup for correct use of accessible label coordinates and roles +React does not recognize the `innerRadius` prop on a DOM element. If you intentionally want it to appear in the DOM as a custom attribute, spell it as lowercase `innerradius` instead. If you accidentally passed it from a parent component, remove it from the DOM element. +React does not recognize the `outerRadius` prop on a DOM element. If you intentionally want it to appear in the DOM as a custom attribute, spell it as lowercase `outerradius` instead. If you accidentally passed it from a parent component, remove it from the DOM element. +React does not recognize the `paddingAngle` prop on a DOM element. If you intentionally want it to appear in the DOM as a custom attribute, spell it as lowercase `paddingangle` instead. If you accidentally passed it from a parent component, remove it from the DOM element. +React does not recognize the `dataKey` prop on a DOM element. If you intentionally want it to appear in the DOM as a custom attribute, spell it as lowercase `datakey` instead. If you accidentally passed it from a parent component, remove it from the DOM element. +React does not recognize the `contentStyle` prop on a DOM element. If you intentionally want it to appear in the DOM as a custom attribute, spell it as lowercase `contentstyle` instead. If you accidentally passed it from a parent component, remove it from the DOM element. +React does not recognize the `itemStyle` prop on a DOM element. If you intentionally want it to appear in the DOM as a custom attribute, spell it as lowercase `itemstyle` instead. If you accidentally passed it from a parent component, remove it from the DOM element. + + ✓ components/dashboard/PRInsights/PRStatusDistribution.accessibility.test.tsx (5 tests) 716ms + ✓ inspects markup for correct use of accessible label coordinates and roles 526ms +stderr | components/dashboard/PRInsights/PRTrendChart.mouse-interactivity.test.tsx > PRTrendChart mouse interactivity > renders weekly and monthly view buttons +The tag <stop> is unrecognized in this browser. If you meant to render a React component, start its name with an uppercase letter. +<linearGradient /> is using incorrect casing. Use PascalCase for React components, or lowercase for HTML elements. +The tag <linearGradient> is unrecognized in this browser. If you meant to render a React component, start its name with an uppercase letter. +The tag <defs> is unrecognized in this browser. If you meant to render a React component, start its name with an uppercase letter. + +stderr | components/dashboard/PRInsights/PRTrendChart.mouse-interactivity.test.tsx > PRTrendChart mouse interactivity > shows monthly as the default active view +<linearGradient /> is using incorrect casing. Use PascalCase for React components, or lowercase for HTML elements. + +stderr | components/dashboard/PRInsights/PRTrendChart.mouse-interactivity.test.tsx > PRTrendChart mouse interactivity > switches to the weekly view when the weekly button is clicked +<linearGradient /> is using incorrect casing. Use PascalCase for React components, or lowercase for HTML elements. + +stderr | components/dashboard/PRInsights/PRTrendChart.mouse-interactivity.test.tsx > PRTrendChart mouse interactivity > switches back to the monthly view when the monthly button is clicked +<linearGradient /> is using incorrect casing. Use PascalCase for React components, or lowercase for HTML elements. + +stderr | components/dashboard/PRInsights/PRTrendChart.mouse-interactivity.test.tsx > PRTrendChart mouse interactivity > supports repeated view toggling without losing the active state +<linearGradient /> is using incorrect casing. Use PascalCase for React components, or lowercase for HTML elements. + + ✓ components/dashboard/DashboardClient.empty-fallback.test.tsx (5 tests) 1386ms + ✓ renders with an empty languages array without crashing 565ms +stderr | components/dashboard/PRInsights/PRTrendChart.mouse-interactivity.test.tsx > PRTrendChart mouse interactivity > keeps the chart mounted during view toggling +<linearGradient /> is using incorrect casing. Use PascalCase for React components, or lowercase for HTML elements. + + ✓ components/dashboard/PRInsights/PRTrendChart.mouse-interactivity.test.tsx (6 tests) 1098ms + ✓ renders weekly and monthly view buttons 325ms + ✓ components/dashboard/ProfileOptimizerModal.accessibility.test.tsx (5 tests) 813ms + ✓ renders the modal heading in a logical hierarchy 420ms + ✓ components/InteractiveViewer.timezone-boundaries.test.tsx (5 tests) 647ms + ✓ renders tooltip dates correctly for leap-year activity blocks 568ms +stderr | components/reviewform.test.tsx > SubmitReviewPage > renders the form correctly +React does not recognize the `whileHover` prop on a DOM element. If you intentionally want it to appear in the DOM as a custom attribute, spell it as lowercase `whilehover` instead. If you accidentally passed it from a parent component, remove it from the DOM element. +React does not recognize the `whileTap` prop on a DOM element. If you intentionally want it to appear in the DOM as a custom attribute, spell it as lowercase `whiletap` instead. If you accidentally passed it from a parent component, remove it from the DOM element. + + ✓ app/contributors/ContributorsSearch.empty-fallback.test.tsx (4 tests) 2229ms + ✓ keeps the empty collection stable while searching and clearing 1080ms + ✓ moves from populated results to the fallback and back 829ms + ✓ app/generator/components/sections/SocialsSection.mock-integrations.test.tsx (5 tests) 1474ms + ✓ 3. simulate service timeout and verify fallback behavior is rendered without runtime errors 305ms + ✓ 5. verify asynchronous failures are handled gracefully without crashing the component 502ms + ✓ components/reviewform.test.tsx (6 tests) 1082ms + ✓ renders the form correctly 407ms +stderr | components/dashboard/DeploymentTracker.error-resilience.test.tsx > DeploymentTracker — error resilience > does not throw when a required string field is missing from the object +Each child in a list should have a unique "key" prop. + +Check the render method of `DeploymentTracker`. See https://react.dev/link/warning-keys for more information. + + ✓ components/dashboard/HistoricalTrendView.mouse-interactivity.test.tsx (5 tests) 1551ms + ✓ navigates to previous period when Previous button is clicked 854ms + ✓ components/dashboard/DeploymentTracker.error-resilience.test.tsx (12 tests) 797ms + ✓ does not throw when repoUrl is not actually a valid URL 475ms + ✓ components/dashboard/ContributionCity3D.test.tsx (11 tests) 1863ms + ✓ 3D City toggle button exists in ActivityLandscape 659ms + ✓ clicking 3D City hides the flat activity chart 363ms + ✓ app/customize/components/ThemeQuickPresets.accessibility.test.tsx (5 tests) 792ms + ✓ uses correct accessible label coordinates (aria-label and aria-pressed) 609ms + ✓ components/dashboard/ShareSheet.responsive-breakpoints.test.tsx (5 tests) 1598ms + ✓ all export option buttons have w-full class ensuring vertical stacking on mobile 697ms + ✓ renders cleanly when matchMedia reports a 375px mobile viewport 307ms +stderr | components/dashboard/PRInsights/PRInsightsClient.timezone-boundaries.test.tsx > PRInsightsClient Timezone Normalization & Calendar Data Boundary Alignment > 1. mocks standard timezone settings (e.g., UTC, EST, IST, and JST) +React does not recognize the `whileHover` prop on a DOM element. If you intentionally want it to appear in the DOM as a custom attribute, spell it as lowercase `whilehover` instead. If you accidentally passed it from a parent component, remove it from the DOM element. +Unknown event handler property `onHoverStart`. It will be ignored. +Unknown event handler property `onHoverEnd`. It will be ignored. + + ✓ app/generator/components/sections/ContributionGraphSection.test.tsx (15 tests) 1922ms +stderr | components/reviewform.mouse-interactivity.test.tsx > reviewform mouse interactivity > triggers simulated mouseenter and hover interactions +React does not recognize the `whileHover` prop on a DOM element. If you intentionally want it to appear in the DOM as a custom attribute, spell it as lowercase `whilehover` instead. If you accidentally passed it from a parent component, remove it from the DOM element. +React does not recognize the `whileTap` prop on a DOM element. If you intentionally want it to appear in the DOM as a custom attribute, spell it as lowercase `whiletap` instead. If you accidentally passed it from a parent component, remove it from the DOM element. + + ✓ components/reviewform.mouse-interactivity.test.tsx (5 tests) 1558ms + ✓ triggers simulated mouseenter and hover interactions 1000ms + ✓ app/generator/components/CompletionScorePanel.test.tsx (7 tests) 1335ms + ✓ renders with 0% score and Beginner level when state is completely empty 598ms + ✓ components/dashboard/PRInsights/PRInsightsClient.timezone-boundaries.test.tsx (5 tests) 3078ms + ✓ 1. mocks standard timezone settings (e.g., UTC, EST, IST, and JST) 1633ms + ✓ 2. asserts calculations align commits onto the correct visual dates 343ms + ✓ 4. asserts calendar date format utility outputs match expectations in each locale 373ms + ✓ 5. tests offsets around transition dates like daylight savings 445ms + ✓ app/components/Footer.empty-fallback.test.tsx (5 tests) 3076ms + ✓ renders raw translation keys as fallback when t returns the path keys 1631ms + ✓ handles custom LinkComponent renders safely with missing optional params 804ms + ✓ app/not-found.responsive-breakpoints.test.tsx (5 tests) 1439ms + ✓ Mock standard mobile-width media coordinates (e.g. 375px wide viewports) 738ms + ✓ Check that navigation components scale down gracefully 489ms + ✓ components/dashboard/ShareSheet.error-resilience.test.tsx (5 tests) 1413ms + ✓ mounts cleanly when isOpen is true with all key elements present 982ms + ✓ app/generator/GeneratorClient.mouse-interactivity.test.tsx (5 tests) 1872ms + ✓ exposes pointer hover styling on interactive editor controls 638ms + ✓ propagates click interactions from editor controls into preview updates 454ms + ✓ propagates touch-style click interactions for CommitPulse options 465ms + ✓ components/dashboard/RepositoryContributionExplorer.test.tsx (4 tests) 794ms + ✓ handles selecting a different repository 356ms + ✓ components/dashboard/ComparisonStatsCard.mock-integrations.test.tsx (5 tests) 1035ms + ✓ should successfully render the main component container and accessibilities 599ms + ✓ app/generator/components/SectionCard.mouse-interactivity.test.tsx (5 tests) 1344ms + ✓ 1. toggles content when header is clicked 764ms + ✓ app/components/Footer.mouse-interactivity.test.tsx (5 tests) 3001ms + ✓ renders branding correctly 472ms + ✓ renders navigation links correctly 1447ms + ✓ renders GitHub repository links correctly 494ms + ✓ renders social links using aria-labels (no ambiguity) 503ms +stderr | app/generator/components/sections/CommitPulseSection.mouse-interactivity.test.tsx > CommitPulseSection - Interactive Tooltips, Cursor Hovers & Touch Event Propagation > handles user context clear button clicks to wipe data entry inputs cleanly +An update to CommitPulseSection inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act +An update to CommitPulseSection inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act + + ✓ app/generator/components/sections/CommitPulseSection.mouse-interactivity.test.tsx (5 tests) 819ms + ✓ applies appropriate clickable cursor class modifiers on the main visibility toggle switch 479ms + ✓ components/dashboard/RepositoryImpactAnalyzer.test.tsx (6 tests) 2467ms + ✓ correctly ranks repositories and limits to top 5 based on weighted impact score 867ms + ✓ computes language contributions percentage correctly 324ms + ✓ complies with accessibility (a11y) standards 814ms + ✓ components/AnimatedCursor.accessibility.test.tsx (5 tests) 1560ms + ✓ keeps the rendered cursor layers decorative and unlabeled 591ms + ✓ does not introduce focusable cursor nodes that would require custom outlines 358ms + ✓ does not disturb keyboard tab order or logical heading hierarchy 413ms + ✓ app/customize/components/ThemeSelector.accessibility.test.tsx (10 tests) 2777ms + ✓ renders shuffle button with accessible name 1276ms + ✓ renders all theme options for screen reader access 517ms + ✓ components/dashboard/ResumeProfileSection.responsive-breakpoints.test.tsx (5 tests) 2056ms + ✓ renders mobile-first form grid classes for narrow viewports 1004ms + ✓ keeps navigation controls visible and usable on mobile breakpoints 496ms + ✓ app/generator/components/sections/DescriptionSection.error-resilience.test.tsx (5 tests) 897ms + ✓ renders safely when value is undefined and falls back to an empty string 563ms + ✓ app/customize/components/ExportPanel.empty-fallback.test.tsx (5 tests) 3663ms + ✓ renders safely when username is empty and username-dependent features are unavailable 376ms + ✓ keeps copy action disabled when username is missing 1572ms + ✓ keeps SVG and PNG download controls disabled when username is missing 444ms + ✓ handles empty snippet and empty status message without runtime errors 1120ms + ✓ app/generator/components/sections/CommitPulseSection.theme-contrast.test.tsx (5 tests) 3657ms + ✓ renders correctly in light theme with visible primary content 2201ms + ✓ keeps interactive controls accessible across themes 776ms +stderr | app/generator/components/PreviewPanel.mouse-interactivity.test.tsx > PreviewPanel Component Interactivity Tests > Case 3: click events propagate cleanly to parental DOM wrappers +An update to PreviewPanel inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act + + ✓ app/generator/components/PreviewPanel.mouse-interactivity.test.tsx (5 tests) 4594ms + ✓ Case 1: applies transition and hover styles structurally on all interactive controls 3188ms + ✓ Case 3: click events propagate cleanly to parental DOM wrappers 314ms + ✓ Case 4: transitions copy button label states and resets safely after delay 576ms + ✓ components/ScrollToBottom.empty-fallback.test.tsx (6 tests) 2606ms + ✓ renders nothing on initial mount when scroll position is 0 (page not yet scrolled) 2330ms + ✓ app/components/HeroSection.mouse-interactivity.test.tsx (5 tests) 1619ms + ✓ applies hover styling to the Copy Link button 1003ms + ✓ app/components/SuccessGuide.responsive-breakpoints.test.tsx (5 tests) 1430ms + ✓ Case 2: Inspect rendering boundaries to ensure that visual component containers avoid fixed absolute widths that cause horizontal overflow scrolling on compact display windows 628ms + ✓ Case 3: Verify that sub-navigation blocks, form fields, and icons collapse or scale down gracefully while preserving clear target interactive space limits 455ms + ✓ components/dashboard/ProfileComparisonAnalytics.test.tsx (6 tests) 5087ms + ✓ renders usernames, developer scores, and key stats in side-by-side layout 2181ms + ✓ correctly ranks repositories and calculates impact scores 491ms + ✓ renders achievements status with unlock/lock badges correctly 896ms + ✓ supports keyboard accessibility controls and ARIA compliance 1150ms + ✓ app/(root)/dashboard/error.responsive-breakpoints.test.tsx (5 tests) 1424ms + ✓ Case 1: mocks standard mobile-width media coordinates correctly 751ms + ✓ Case 4: checks that navigation components/buttons scale down gracefully on mobile screens 330ms + ✓ components/dashboard/PopularPinnnedRepos.theme-contrast.test.tsx (5 tests) 3032ms + ✓ emulates light and dark color-scheme presets while rendering real repository cards 2549ms + ✓ components/reviewform.mock-integrations.test.tsx (5 tests) 3592ms + ✓ tests service loading paths to ensure pending state overlays render 1938ms + ✓ asserts local cache layers are queried before triggering database retrievals 691ms + ✓ asserts complete cache sync is written on success callbacks 478ms + ✓ app/generator/components/sections/SocialsSection.responsive-breakpoints.test.tsx (5 tests) 2869ms + ✓ Case 1: verifies grid and flex reflow structure under 375px mobile viewport 1877ms + ✓ Case 3: verifies that categories scroll and interactive buttons maintain touch target space 342ms + ✓ app/components/navbar.mouse-interactivity.test.tsx (6 tests) 1167ms + ✓ propagates click and touch gestures through the mobile menu button 483ms + ✓ hooks/useDebounce.error-resilience.test.ts (5 tests) 1103ms + ✓ mocks nested child properties to throw unexpected runtime exceptions or database connectivity errors 469ms + ✓ ensures user reset/reload paths are available on the recovery panels 539ms + ✓ components/dashboard/PRInsights/TopMetricsRow.theme-contrast.test.tsx (5 tests) 914ms + ✓ renders correctly in light mode 445ms +stderr | components/dashboard/Heatmap.mock-integrations.test.tsx > Heatmap Mock Integrations > renders empty state when no activity exists +React does not recognize the `whileInView` prop on a DOM element. If you intentionally want it to appear in the DOM as a custom attribute, spell it as lowercase `whileinview` instead. If you accidentally passed it from a parent component, remove it from the DOM element. + + ✓ app/components/ScrollRestoration.accessibility.test.tsx (5 tests) 952ms + ✓ renders no DOM nodes that would disrupt screen reader document flow 658ms + ✓ app/customize/components/AdvancedSettingsPanel.massive_scaling.test.tsx (5 tests) 769ms + ✓ renders successfully with maximum supported dimension values 391ms + ✓ components/dashboard/Heatmap.mock-integrations.test.tsx (5 tests) 1793ms + ✓ renders grid cells when activity data exists 1018ms + ✓ components/FeatureCards.empty-fallback.test.tsx (5 tests) 2084ms + ✓ renders FeatureCard with default props 1716ms + ✓ app/generator/components/PreviewPanel.error-resilience.test.tsx (5 tests) 1526ms + ✓ Test 1: should maintain Hydration Stability and render without crashing on initial load 637ms + ✓ Test 5: should ensure user reset/reload paths are available on the recovery panels 803ms + ✓ app/customize/components/ControlsPanel.responsive-breakpoints.test.tsx (5 tests) 3272ms + ✓ renders correctly on mobile viewport 1786ms + ✓ renders scale buttons in a responsive 3-column grid 425ms + ✓ renders responsive select controls 566ms + ✓ app/generator/components/sections/CommitPulseSection.accessibility.test.tsx (5 tests) 1897ms + ✓ Case 1: exposes the CommitPulse toggle as an accessible switch 1266ms + ✓ Case 3: clear username button exposes an accessible name 508ms + ✓ components/dashboard/PRInsights/Highlights.theme-contrast.test.tsx (5 tests) 1142ms + ✓ 2. should assert that the visual elements adapt color styling properly for both settings 837ms + ✓ app/customize/components/ExportPanel.test.tsx (11 tests) 2708ms + ✓ renders 'Markdown' button active by default 1809ms +stderr | app/contributors/page.empty-fallback.test.tsx > ContributorsPage empty fallback > handles fetch failures gracefully and still renders fallback state +[ERROR] Failed to fetch contributors {"error":{}} + +stderr | app/contributors/page.empty-fallback.test.tsx > ContributorsPage empty fallback > handles non-ok API responses without breaking the page +[ERROR] Failed to fetch contributors {"error":{}} + + ✓ app/contributors/ContributorsClient.theme-contrast.test.tsx (5 tests) 1441ms + ✓ applies root light and dark theme classes 468ms + ✓ renders CTA buttons with readable foreground and background contrast 576ms + ✓ app/contributors/page.empty-fallback.test.tsx (5 tests) 2444ms + ✓ renders fallback UI when contributors are empty 1513ms + ✓ maintains page layout and empty markers for empty contributor input 454ms + ✓ app/contributors/ContributorsSearch.test.tsx (7 tests) 1594ms + ✓ renders without crashing 707ms + ✓ ignores leading and trailing whitespace when filtering 308ms + ✓ app/generator/components/sections/CommitPulseSection.responsive-breakpoints.test.tsx (5 tests) 1274ms + ✓ implements global full-width fluid configurations on core input elements to prevent clipping 466ms + ✓ enforces maximum boundary scaling restrictions on visual asset elements 474ms + ✓ app/generator/components/PreviewPanel.mock-integrations.test.tsx (5 tests) 1383ms + ✓ 1. copies markdown using mocked clipboard service 915ms + ✓ app/customize/components/ExportPanel.accessibility.test.tsx (5 tests) 1031ms + ✓ uses correct accessible label coordinates (aria-label and aria-describedby) 692ms + ✓ components/dashboard/StatsCard.error-resilience.test.tsx (5 tests) 747ms + ✓ should handle very large chartData arrays without crashing and render chart bars correctly 571ms + ✓ components/dashboard/ResumeProfileSection.accessibility.test.tsx (5 tests) 1288ms + ✓ ensures all interactive elements have accessible names for screen readers 639ms + ✓ components/dashboard/Achievements.accessibility.test.tsx (5 tests) 891ms + ✓ inspects markup for correct use of accessible label coordinates and roles 648ms + ✓ components/InteractiveViewer.theme-contrast.test.tsx (5 tests) 668ms + ✓ renders correctly in dark prefers-color-scheme environments 401ms + ✓ app/support/page.test.tsx (3 tests) 1207ms + ✓ links to the canonical Discord invite (matches DiscordButton/Footer) 678ms + ✓ does not link to the stale invite code 326ms + ✓ components/dashboard/DeveloperJourneyTimeline.test.tsx (5 tests) 1059ms + ✓ renders title, subtitle, and filters correctly 544ms + ✓ components/NavbarSearch.test.tsx (8 tests) 1124ms + ✓ app/generator/components/sections/SocialsSection.theme-contrast.test.tsx (5 tests) 1061ms + ✓ renders correctly in light theme with proper structure 455ms + ✓ ensures text remains visible in light mode (contrast proxy check) 413ms + ✓ app/customize/page.accessibility.test.tsx (5 tests) 902ms + ✓ 1. verifies that the layout structure contains semantic ARIA role landmarks 576ms + ✓ components/dashboard/ShareSheet.theme-contrast.test.tsx (5 tests) 1128ms + ✓ sets up a dual theme environment mock (emulate both dark and light presets) 577ms +stderr | components/DiscordButton.test.tsx > DiscordButton > renders discord invite link with correct href +React does not recognize the `whileTap` prop on a DOM element. If you intentionally want it to appear in the DOM as a custom attribute, spell it as lowercase `whiletap` instead. If you accidentally passed it from a parent component, remove it from the DOM element. + +stderr | components/dashboard/ProfileCard.mouse-interactivity.test.tsx > ProfileCard Mouse Interactivity & Event Propagation > Case 1: mouseenter gesture on stat target makes the interactive tooltip visible +React does not recognize the `whileHover` prop on a DOM element. If you intentionally want it to appear in the DOM as a custom attribute, spell it as lowercase `whilehover` instead. If you accidentally passed it from a parent component, remove it from the DOM element. +React does not recognize the `whileTap` prop on a DOM element. If you intentionally want it to appear in the DOM as a custom attribute, spell it as lowercase `whiletap` instead. If you accidentally passed it from a parent component, remove it from the DOM element. + + ✓ app/api/wrapped/route.mouse-interactivity.test.tsx (5 tests) 699ms + ✓ 1. triggers simulated mouseenter/hover gestures on active segments 403ms + ✓ components/DiscordButton.test.tsx (8 tests) 956ms + ✓ renders discord invite link with correct href 668ms + ✓ app/components/CustomizeCTA.error-resilience.test.tsx (5 tests) 977ms + ✓ renders successfully during initial mount 754ms + ✓ app/generator/components/sections/TechnologyGraph.mouse-interactivity.test.tsx (5 tests) 1584ms + ✓ triggers onToggle when a technology node is clicked 681ms + ✓ maintains interactive node visibility during mouse enter and leave events 398ms + ✓ components/dashboard/ProfileCard.mouse-interactivity.test.tsx (7 tests) 1497ms + ✓ Case 3: touch and click events propagate correctly without encountered runtime prevents 616ms + ✓ components/dashboard/RefreshButton.mouse-interactivity.test.tsx (5 tests) 718ms + ✓ renders tooltip title attribute for hover tooltip display 555ms +stderr | components/dashboard/PRInsights/PRTrendChart.theme-contrast.test.tsx > PRTrendChart Theme Contrast and Visual Cohesion > 1. should emulate both dark and light presets +The tag <stop> is unrecognized in this browser. If you meant to render a React component, start its name with an uppercase letter. +<linearGradient /> is using incorrect casing. Use PascalCase for React components, or lowercase for HTML elements. +The tag <linearGradient> is unrecognized in this browser. If you meant to render a React component, start its name with an uppercase letter. +The tag <defs> is unrecognized in this browser. If you meant to render a React component, start its name with an uppercase letter. +<linearGradient /> is using incorrect casing. Use PascalCase for React components, or lowercase for HTML elements. + +stderr | components/dashboard/PRInsights/PRTrendChart.theme-contrast.test.tsx > PRTrendChart Theme Contrast and Visual Cohesion > 2. should assert that the visual elements adapt color styling properly for both settings +<linearGradient /> is using incorrect casing. Use PascalCase for React components, or lowercase for HTML elements. + +stderr | components/reviewform.theme-contrast.test.tsx > SubmitReviewPage - Dark and Light Prefers-Color-Scheme Visual Cohesion > Dual Theme Setup: component renders without crashing in both dark and light color scheme environments +React does not recognize the `whileHover` prop on a DOM element. If you intentionally want it to appear in the DOM as a custom attribute, spell it as lowercase `whilehover` instead. If you accidentally passed it from a parent component, remove it from the DOM element. +React does not recognize the `whileTap` prop on a DOM element. If you intentionally want it to appear in the DOM as a custom attribute, spell it as lowercase `whiletap` instead. If you accidentally passed it from a parent component, remove it from the DOM element. + +stderr | components/dashboard/PRInsights/PRTrendChart.theme-contrast.test.tsx > PRTrendChart Theme Contrast and Visual Cohesion > 3. should verify contrast ratio standards are satisfied for all textual elements +<linearGradient /> is using incorrect casing. Use PascalCase for React components, or lowercase for HTML elements. + +stderr | components/dashboard/PRInsights/PRTrendChart.theme-contrast.test.tsx > PRTrendChart Theme Contrast and Visual Cohesion > 4. should check that specific custom stylesheet properties or Tailwind classes are active in the markup +<linearGradient /> is using incorrect casing. Use PascalCase for React components, or lowercase for HTML elements. + +stderr | components/dashboard/PRInsights/PRTrendChart.theme-contrast.test.tsx > PRTrendChart Theme Contrast and Visual Cohesion > 5. should ensure that background overlays do not clip foreground content colors +<linearGradient /> is using incorrect casing. Use PascalCase for React components, or lowercase for HTML elements. + + ✓ components/dashboard/PRInsights/PRTrendChart.theme-contrast.test.tsx (5 tests) 659ms + ✓ 3. should verify contrast ratio standards are satisfied for all textual elements 320ms + ✓ components/reviewform.theme-contrast.test.tsx (5 tests) 1410ms + ✓ Dual Theme Setup: component renders without crashing in both dark and light color scheme environments 608ms + ✓ Background Overlay Safety: error alert uses translucent background that does not clip foreground text color 649ms +stderr | lib/github.rotation.test.ts > GitHub Multi-Token Rotation & Fallback > discards an undecryptable token instead of forwarding a malformed credential +[WARN] Failed to decrypt GitHub token: Token decryption failed: Encryption key must be at least 32 characters + +stderr | app/generator/components/sections/TechnologyGraph.responsive-breakpoints.test.tsx > TechnologyGraph Responsive Breakpoints > 5. asserts mobile-specific toggle states respond cleanly +An update to TechnologyGraph inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act + +stderr | app/generator/components/sections/TechnologyGraph.responsive-breakpoints.test.tsx > TechnologyGraph Responsive Breakpoints > 5. asserts mobile-specific toggle states respond cleanly +The current testing environment is not configured to support act(...) + + ✓ lib/github.rotation.test.ts (10 tests) 1665ms + ✓ rotates to the next token on HTTP 429 rate limiting 520ms + ✓ rotates to the next token on HTTP 401 unauthorized and excludes the bad token for 24h 318ms + ✓ decrypts encrypted tokens if GITHUB_TOKEN_ENCRYPTION_KEY is present 344ms + ✓ deduplicates concurrent 401 rotations using the pending refresh promise pattern (Issue #7213) 404ms + ✓ app/generator/components/sections/TechnologyGraph.responsive-breakpoints.test.tsx (5 tests) 1149ms + ✓ 5. asserts mobile-specific toggle states respond cleanly 769ms + ✓ lib/graph/types.theme-contrast.test.ts (5 tests) 1198ms + ✓ all edges use valid recommendation categories 470ms + ✓ all edges have scores between 0 and 1 461ms + ✓ app/contributors/page.responsive-breakpoints.test.tsx (4 tests) 935ms + ✓ verifies typography classes scaling across responsive viewports 520ms + ✓ app/api/og/route.mouse-interactivity.test.tsx (5 tests) 1041ms + ✓ 1. triggers simulated mouseenter/hover gestures on active segments 737ms + ✓ components/dashboard/Achievements.mouse-interactivity.test.tsx (5 tests) 1792ms + ✓ renders unlocked achievements with hover visual feedback and default cursor 557ms + ✓ applies pointer-events-none to locked achievements so they cannot receive clicks 681ms + ✓ toggles between See All Achievements and Show Less when the button is clicked 431ms + ✓ app/customize/components/AdvancedSettingsPanel.mouse-interactivity.test.tsx (5 tests) 1404ms + ✓ should display the interactive tooltip when mouse enters an active segment 1285ms +stderr | app/components/FeatureCard.mock-integrations.test.tsx > FeatureCard - mock integrations > renders data from mocked service layer without making real network calls +React does not recognize the `whileHover` prop on a DOM element. If you intentionally want it to appear in the DOM as a custom attribute, spell it as lowercase `whilehover` instead. If you accidentally passed it from a parent component, remove it from the DOM element. + + ✓ app/components/CustomizeCTA.mouse-interactivity.test.tsx (5 tests) 1398ms + ✓ should display the tooltip when hovering over an interactive node 1226ms + ✓ app/components/FeatureCard.mock-integrations.test.tsx (5 tests) 584ms + ✓ renders empty fallback gracefully when mocked service returns empty cache stub 387ms +stderr | app/customize/page.test.tsx > CustomizePage timezone query params > falls back when numeric URL params are malformed +An update to CustomizePageInner inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act +An update to CustomizePageInner inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act +An update to CustomizePageInner inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act +An update to CustomizePageInner inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act +An update to CustomizePageInner inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act +An update to CustomizePageInner inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act + + ✓ app/customize/page.test.tsx (3 tests) 956ms + ✓ omits the default UTC timezone from export snippets 450ms + ✓ components/dashboard/Heatmap.theme-contrast.test.tsx (5 tests) 731ms + ✓ renders the themed heatmap card container 600ms + ✓ lib/github.race-condition.test.ts (3 tests) 1082ms + ✓ never lets concurrent rate-limit handlers corrupt the rotation index 523ms + ✓ concurrent requests across retries exercise the pool without throwing on a corrupted index 525ms + ✓ app/generator/components/EditorPanel.theme-contrast.test.tsx (5 tests) 1235ms + ✓ renders GitHub import button 580ms +stderr | app/page.test.tsx > LandingPage > can dismiss the SuccessGuide +Received `true` for a non-boolean attribute `unoptimized`. + +If you want to write it to the DOM, pass a string instead: unoptimized="true" or unoptimized={value.toString()}. +React does not recognize the `whileInView` prop on a DOM element. If you intentionally want it to appear in the DOM as a custom attribute, spell it as lowercase `whileinview` instead. If you accidentally passed it from a parent component, remove it from the DOM element. + + ✓ app/page.test.tsx (2 tests | 1 skipped) 1871ms + ✓ can dismiss the SuccessGuide 1861ms + ✓ components/FeatureCards.mock-integrations.test.tsx (5 tests) 544ms + ✓ renders section heading correctly with mocked integrations 356ms + ✓ components/FeatureCards.mouse-interactivity.test.tsx (5 tests) 638ms + ✓ renders content for hover interaction scenarios 467ms + ✓ components/FeatureCards.test.tsx (6 tests) 1233ms + ✓ renders card title, description and icon correctly 529ms + ✓ renders all 3 feature cards matching the defined list length 514ms + ✓ components/dashboard/RepositoryGraph.accessibility.test.tsx (8 tests) 870ms +stderr | app/error.empty-fallback.test.tsx > Root Error Boundary - Empty & Missing Input Fallbacks > renders successfully when error is an empty object +{} + +stderr | app/error.empty-fallback.test.tsx > Root Error Boundary - Empty & Missing Input Fallbacks > renders successfully when error has no message property +{ name: 'CustomError' } + +stderr | app/error.empty-fallback.test.tsx > Root Error Boundary - Empty & Missing Input Fallbacks > renders successfully when error message is an empty string +Error: + at /home/atulupadhyay/Contribution/commitpulse/app/error.empty-fallback.test.tsx:91:47 + at Proxy.assertThrows (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/chai/index.js:2798:5) + at Proxy.methodWrapper (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/chai/index.js:1700:25) + at Proxy.<anonymous> (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/expect/dist/index.js:1216:12) + at Proxy.overwritingMethodWrapper (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/chai/index.js:1750:33) + at Proxy.<anonymous> (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/expect/dist/index.js:1552:16) + at Proxy.<anonymous> (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/expect/dist/index.js:1156:15) + at Proxy.methodWrapper (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/chai/index.js:1700:25) + at /home/atulupadhyay/Contribution/commitpulse/app/error.empty-fallback.test.tsx:91:87 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:302:11 + + ✓ components/KonamiEasterEgg.empty-fallback.test.tsx (5 tests) 931ms + ✓ 1. renders safely with empty arrays when matrix and confetti counts are set to 0 764ms +stderr | app/error.empty-fallback.test.tsx > Root Error Boundary - Empty & Missing Input Fallbacks > renders interactive elements and triggers actions correctly in fallback state +{} + + ✓ app/error.empty-fallback.test.tsx (6 tests) 1102ms + ✓ renders successfully when error is null 614ms +stderr | components/DiscordButton.error-resilience.test.tsx > DiscordButton error resilience > renders without crashing +React does not recognize the `whileTap` prop on a DOM element. If you intentionally want it to appear in the DOM as a custom attribute, spell it as lowercase `whiletap` instead. If you accidentally passed it from a parent component, remove it from the DOM element. + + ✓ components/dashboard/ResumeUpload.accessibility.test.tsx (8 tests) 877ms + ✓ renders a remove button with an accessible label when a file is selected 402ms + ✓ components/DiscordButton.error-resilience.test.tsx (5 tests) 1156ms + ✓ renders without crashing 371ms + ✓ renders the discord link even when animations are mocked 671ms + ✓ app/components/HeroSection.test.tsx (15 tests) 1800ms + ✓ renders the hero heading and content 925ms + ✓ components/dashboard/Heatmap.responsive-breakpoints.test.tsx (5 tests) 922ms + ✓ renders heatmap grid at mobile viewport width 550ms + ✓ app/contributors/ContributorsClient.timezone-boundaries.test.tsx (5 tests) 1340ms + ✓ mocks standard timezone settings (UTC, EST, IST, and JST) correctly 1281ms + ✓ components/dashboard/ShareSheet.mouse-interactivity.test.tsx (5 tests) 1017ms + ✓ touch events on the Share on X button do not block the click handler from firing 527ms + ✓ components/dashboard/PopularPinnnedRepos.accessibility.test.tsx (5 tests) 1227ms + ✓ renders repository section heading for screen readers 497ms +stderr | components/dashboard/PRInsights/PRTrendChart.responsive-breakpoints.test.tsx > PRTrendChart responsive breakpoints > renders the chart inside a ResponsiveContainer +The tag <stop> is unrecognized in this browser. If you meant to render a React component, start its name with an uppercase letter. +<linearGradient /> is using incorrect casing. Use PascalCase for React components, or lowercase for HTML elements. +The tag <linearGradient> is unrecognized in this browser. If you meant to render a React component, start its name with an uppercase letter. +The tag <defs> is unrecognized in this browser. If you meant to render a React component, start its name with an uppercase letter. + +stderr | components/dashboard/PRInsights/PRTrendChart.responsive-breakpoints.test.tsx > PRTrendChart responsive breakpoints > configures ResponsiveContainer to fill its parent +<linearGradient /> is using incorrect casing. Use PascalCase for React components, or lowercase for HTML elements. + + ✓ components/dashboard/AIInsights.mouse-interactivity.test.tsx (8 tests) 1145ms + ✓ handles click events on insight cards and propagates without stopping propagation 661ms +stderr | components/dashboard/PRInsights/PRTrendChart.responsive-breakpoints.test.tsx > PRTrendChart responsive breakpoints > preserves the responsive chart wrapper layout +<linearGradient /> is using incorrect casing. Use PascalCase for React components, or lowercase for HTML elements. + +stderr | components/dashboard/PRInsights/PRTrendChart.responsive-breakpoints.test.tsx > PRTrendChart responsive breakpoints > keeps the responsive container mounted while switching chart views +<linearGradient /> is using incorrect casing. Use PascalCase for React components, or lowercase for HTML elements. + +stderr | components/dashboard/PRInsights/PRTrendChart.responsive-breakpoints.test.tsx > PRTrendChart responsive breakpoints > preserves the responsive layout after rerendering with updated data +<linearGradient /> is using incorrect casing. Use PascalCase for React components, or lowercase for HTML elements. + +stderr | components/dashboard/PRInsights/PRTrendChart.responsive-breakpoints.test.tsx > PRTrendChart responsive breakpoints > retains its responsive wrapper classes after rerender +<linearGradient /> is using incorrect casing. Use PascalCase for React components, or lowercase for HTML elements. + + ✓ components/dashboard/PRInsights/PRTrendChart.responsive-breakpoints.test.tsx (6 tests) 825ms + ✓ keeps the responsive container mounted while switching chart views 531ms + ✓ app/components/navbar.error-resilience.test.tsx (4 tests) 1142ms + ✓ renders a static, non-interactive language placeholder before mount, to avoid a hydration mismatch 844ms + ✓ app/components/navbar.accessibility.test.tsx (6 tests) 963ms + ✓ renders header and navigation landmarks for screen reader navigation 430ms + ✓ components/dashboard/HistoricalTrendView.test.tsx (6 tests) 959ms + ✓ renders navigation controls 394ms + ✓ components/dashboard/ActivityHeatmapPro.test.tsx (3 tests) 1109ms + ✓ toggles view modes when tab buttons are clicked 847ms + ✓ components/dashboard/DeploymentTracker.mouse-interactivity.test.tsx (8 tests) 1102ms + ✓ repo link carries a hover color-transition class 467ms + ✓ app/generator/components/sections/SocialsSection.error-resilience.test.tsx (5 tests) 738ms + ✓ components/dashboard/ProfileCard.test.tsx (12 tests) 1247ms + ✓ renders a copy username button beside the username 457ms + ✓ app/generator/components/EditorPanel.responsive-breakpoints.test.tsx (5 tests) 1025ms + ✓ 1. Mock standard mobile-width media coordinates (e.g. 375px wide viewports) 579ms +stderr | components/DiscordButton.accessibility.test.tsx > DiscordButton accessibility behavior > renders as an accessible link with visible text +React does not recognize the `whileTap` prop on a DOM element. If you intentionally want it to appear in the DOM as a custom attribute, spell it as lowercase `whiletap` instead. If you accidentally passed it from a parent component, remove it from the DOM element. + + ✓ components/DiscordButton.accessibility.test.tsx (5 tests) 994ms + ✓ renders as an accessible link with visible text 744ms +stderr | app/components/FeatureCard.error-resilience.test.tsx > FeatureCard Error Resilience > renders successfully with valid props +React does not recognize the `whileHover` prop on a DOM element. If you intentionally want it to appear in the DOM as a custom attribute, spell it as lowercase `whilehover` instead. If you accidentally passed it from a parent component, remove it from the DOM element. + +stderr | app/components/FeatureCard.error-resilience.test.tsx > FeatureCard Error Resilience > hydrates without mismatches +React does not recognize the `whileHover` prop on a DOM element. If you intentionally want it to appear in the DOM as a custom attribute, spell it as lowercase `whilehover` instead. If you accidentally passed it from a parent component, remove it from the DOM element. + + ✓ app/generator/components/SectionCard.accessibility.test.tsx (5 tests) 1626ms + ✓ 1. ARIA & Accessible Markup Validation: verifies interactive elements expose correct accessibility attributes 956ms +stderr | app/components/FeatureCard.error-resilience.test.tsx > FeatureCard Error Resilience > renders recovery UI when a child throws inside an Error Boundary +Error: Icon crashed + at BrokenIcon (/home/atulupadhyay/Contribution/commitpulse/app/components/FeatureCard.error-resilience.test.tsx:82:13) + at Object.react_stack_bottom_frame (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:25904:20) + at renderWithHooks (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:7662:22) + at updateFunctionComponent (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:10166:19) + at beginWork (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:11778:18) + at runWithFiberInDEV (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:874:13) + at performUnitOfWork (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:17641:22) + at workLoopSync (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:17469:41) + at renderRootSync (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:17450:11) + at performWorkOnRoot (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:16583:35) { + [stack]: [Getter/Setter], + [message]: 'Icon crashed' +} + +The above error occurred in the <BrokenIcon> component. + +React will try to recreate this component tree from scratch using the error boundary you provided, ErrorBoundary. + + + ✓ app/components/FeatureCard.error-resilience.test.tsx (5 tests) 976ms + ✓ renders successfully with valid props 637ms + ✓ components/KeyboardShortcutsModal.accessibility.test.tsx (10 tests) 670ms + ✓ renders with role="dialog" and aria-modal="true" when open 349ms + ✓ components/InteractiveViewer.mouse-interactivity.test.tsx (5 tests) 1173ms + ✓ 1. shows tooltip while hovering interactive tower 564ms +Not implemented: navigation to another Document + ✓ app/components/CustomizeCTA.test.tsx (26 tests) 1445ms + ✓ renders the section heading as exactly one <h2> 376ms + ✓ components/dashboard/VisualizationTooltip.theme-contrast.test.tsx (5 tests) 1054ms + ✓ applies paired light/dark background and border contrast classes on the tooltip root 949ms + ✓ components/dashboard/CommitClock.test.tsx (10 tests) 1042ms + ✓ renders 'Commit Clock' heading 783ms + ✓ app/generator/components/PreviewPanel.accessibility.test.tsx (5 tests) 1358ms + ✓ 1. verifies correct ARIA roles and dynamic aria-selected states for tabs and tab panels 943ms + ✓ app/components/SuccessGuide.test.tsx (5 tests) 1254ms + ✓ renders the dismiss guide button with correct aria-label 816ms + ✓ hooks/useRecentSearches.mouse-interactivity.test.ts (5 tests) 1357ms + ✓ triggers mouseenter and mouseleave gestures on search tags and validates hover behavior 616ms + ✓ handles custom click and touch gestures and ensures propagation 328ms + ✓ app/generator/components/sections/SocialSection.mouse-interactivity.test.tsx (5 tests) 899ms + ✓ allows hovering interactive platform buttons without errors 521ms + ✓ app/(root)/dashboard/[username]/page.test.tsx (6 tests) 1523ms + ✓ renders the dashboard components with the fetched data 874ms + ✓ components/BrandParticles.theme-contrast.test.tsx (5 tests) 945ms + ✓ renders successfully in light mode 365ms + ✓ components/dashboard/AIInsightsSkeleton.accessibility.test.tsx (6 tests) 832ms + ✓ allows sequential keyboard tab navigation to bypass the skeleton entirely 532ms + ✓ lib/crypto.empty-fallback.test.ts (11 tests) 3348ms + ✓ rejects malformed payload with wrong number of parts 413ms + ✓ rejects tampered ciphertext (modified encrypted part) 434ms + ✓ rejects tampered auth tag (modified tag part) 675ms + ✓ rejects tampered IV (modified iv part) 604ms + ✓ throws on decrypt with wrong key 464ms + ✓ app/achievements/AchievementsClient.a11y.test.tsx (2 tests) 877ms + ✓ gives both username search inputs an accessible name (not just a placeholder) 556ms + ✓ gives the achievement filter input an accessible name in the loaded view 314ms +stderr | components/dashboard/Heatmap.timezone-boundaries.test.tsx > renders leap day contribution correctly +React does not recognize the `whileInView` prop on a DOM element. If you intentionally want it to appear in the DOM as a custom attribute, spell it as lowercase `whileinview` instead. If you accidentally passed it from a parent component, remove it from the DOM element. + + ✓ components/dashboard/DeploymentTracker.response-breakpoints.test.tsx (8 tests) 711ms + ✓ repo name has truncate + min-w-0 on its wrapper so long names clip instead of breaking layout 445ms + ✓ components/dashboard/Heatmap.timezone-boundaries.test.tsx (6 tests) 869ms + ✓ shows active streak across calendar boundaries 561ms +stderr | components/dashboard/ProfileCard.accessibility.test.tsx > ProfileCard Accessibility Standards & Screen Reader Aria Compliance > renders logical heading hierarchy correctly +React does not recognize the `whileHover` prop on a DOM element. If you intentionally want it to appear in the DOM as a custom attribute, spell it as lowercase `whilehover` instead. If you accidentally passed it from a parent component, remove it from the DOM element. +React does not recognize the `whileTap` prop on a DOM element. If you intentionally want it to appear in the DOM as a custom attribute, spell it as lowercase `whiletap` instead. If you accidentally passed it from a parent component, remove it from the DOM element. + + ✓ app/components/theme-switch.empty-fallback.test.tsx (5 tests) 466ms + ✓ renders ThemeToggleButton without props 408ms + ✓ components/dashboard/ProfileCard.accessibility.test.tsx (9 tests) 1559ms + ✓ renders logical heading hierarchy correctly 555ms + ✓ components/dashboard/RepositoryGraph.timezone-boundaries.test.tsx (5 tests) 1766ms + ✓ renders consistently under UTC timezone assumptions 1172ms + ✓ keeps repository nodes visible for IST timezone boundary data 308ms + ✓ components/ShareButtons.test.tsx (5 tests) 1778ms + ✓ renders LinkedIn and Twitter share buttons 1075ms +stderr | components/dashboard/PRInsights/PRTrendChart.timezone-boundaries.test.tsx > PRTrendChart Timezone Normalization & Calendar Boundary Alignment > 2. aligns chart labels after switching weekly/monthly views +The tag <stop> is unrecognized in this browser. If you meant to render a React component, start its name with an uppercase letter. +<linearGradient /> is using incorrect casing. Use PascalCase for React components, or lowercase for HTML elements. +The tag <linearGradient> is unrecognized in this browser. If you meant to render a React component, start its name with an uppercase letter. +The tag <defs> is unrecognized in this browser. If you meant to render a React component, start its name with an uppercase letter. + +stderr | components/dashboard/PRInsights/PRTrendChart.timezone-boundaries.test.tsx > PRTrendChart Timezone Normalization & Calendar Boundary Alignment > 5. handles daylight saving transition without breaking rendering +<linearGradient /> is using incorrect casing. Use PascalCase for React components, or lowercase for HTML elements. + + ✓ components/dashboard/PRInsights/PRTrendChart.timezone-boundaries.test.tsx (5 tests) 1532ms + ✓ 2. aligns chart labels after switching weekly/monthly views 1219ms + ✓ app/components/CopyRepoButton.accessibility.test.tsx (5 tests) 2238ms + ✓ renders as an accessible button with visible label 1491ms + ✓ components/dashboard/RepositoryGraph.theme-contrast.test.tsx (5 tests) 1160ms + ✓ applies dark mode heading text contrast styling 758ms + ✓ components/dashboard/PRInsights/RepoPerformanceTable.accessibility.test.tsx (5 tests) 2727ms + ✓ inspects markup for correct table roles and accessible column labels 2344ms +stderr | app/(root)/dashboard/error.empty-fallback.test.tsx > Dashboard Error Page - Empty & Missing Input Fallbacks > renders successfully when error is null +[ERROR] Dashboard error {"error":null} + +stderr | app/(root)/dashboard/error.empty-fallback.test.tsx > Dashboard Error Page - Empty & Missing Input Fallbacks > renders successfully when error is undefined +[ERROR] Dashboard error {} + +stderr | app/(root)/dashboard/error.empty-fallback.test.tsx > Dashboard Error Page - Empty & Missing Input Fallbacks > renders successfully when error is an empty object +{} +[ERROR] Dashboard error {"error":{}} + +stderr | app/(root)/dashboard/error.empty-fallback.test.tsx > Dashboard Error Page - Empty & Missing Input Fallbacks > renders successfully when error has no message property +{ name: 'CustomError' } +[ERROR] Dashboard error {"error":{"name":"CustomError"}} + +stderr | app/(root)/dashboard/error.empty-fallback.test.tsx > Dashboard Error Page - Empty & Missing Input Fallbacks > renders successfully when error message is an empty string +Error: + at /home/atulupadhyay/Contribution/commitpulse/app/(root)/dashboard/error.empty-fallback.test.tsx:64:48 + at Proxy.assertThrows (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/chai/index.js:2798:5) + at Proxy.methodWrapper (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/chai/index.js:1700:25) + at Proxy.<anonymous> (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/expect/dist/index.js:1216:12) + at Proxy.overwritingMethodWrapper (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/chai/index.js:1750:33) + at Proxy.<anonymous> (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/expect/dist/index.js:1552:16) + at Proxy.<anonymous> (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/expect/dist/index.js:1156:15) + at Proxy.methodWrapper (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/chai/index.js:1700:25) + at /home/atulupadhyay/Contribution/commitpulse/app/(root)/dashboard/error.empty-fallback.test.tsx:64:88 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:302:11 +[ERROR] Dashboard error {"error":{}} + +stderr | app/(root)/dashboard/error.empty-fallback.test.tsx > Dashboard Error Page - Empty & Missing Input Fallbacks > renders without errors when the optional digest field is absent +Error: Unexpected failure + at /home/atulupadhyay/Contribution/commitpulse/app/(root)/dashboard/error.empty-fallback.test.tsx:73:19 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:302:11 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:1903:26 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2326:20 + at new Promise (<anonymous>) + at runWithCancel (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2323:10) + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2305:20 + at new Promise (<anonymous>) + at runWithTimeout (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2272:10) + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2955:64 +[ERROR] Dashboard error {"error":{}} + +stderr | app/(root)/dashboard/error.empty-fallback.test.tsx > Dashboard Error Page - Empty & Missing Input Fallbacks > renders interactive elements correctly in fallback state +{} +[ERROR] Dashboard error {"error":{}} + + ✓ app/(root)/dashboard/error.empty-fallback.test.tsx (7 tests) 2247ms + ✓ renders successfully when error is null 1108ms + ✓ components/dashboard/ProfileOptimizerModal.theme-contrast.test.tsx (5 tests) 1680ms + ✓ renders light mode surface and foreground contrast classes 399ms + ✓ keeps action buttons contrast-aware while disabled 1061ms + ✓ app/documentation/code-block.empty-fallback.test.tsx (11 tests) 2725ms + ✓ renders successfully with an empty string code 1185ms + ✓ handles clipboard writing gracefully when clicked with empty code 423ms + ✓ app/components/SuccessGuide.timezone-boundaries.test.tsx (5 tests) 1733ms + ✓ Case 1: Mock standard global timezone configurations (e.g., America/New_York, Asia/Kolkata, Asia/Tokyo) and verify calculations accurately bind localized metadata onto intended layout timelines 855ms + ✓ Case 3: Test hour shifts around daylight savings time (DST) transition parameters to guarantee calculations handle temporal gaps smoothly without runtime execution crashes 658ms + ✓ app/components/HeroSection.accessibility.test.tsx (5 tests) 1032ms + ✓ renders primary h1 heading with correct text for screen reader hierarchy 760ms + ✓ app/generator/components/sections/NameSection.mouse-interactivity.test.tsx (5 tests) 922ms + ✓ triggers simulated mouseenter/hover gestures on active segments or interactive nodes 622ms + ✓ app/api/student/resume/upload/route.mouse-interactivity.test.tsx (5 tests) 1268ms + ✓ 1. triggers simulated mouseenter/hover gestures on active segments 750ms + ✓ components/dashboard/AchievementsSkeleton.mouse-interactivity.test.tsx (5 tests) 886ms + ✓ simulates mouse enter/hover events on skeleton cells and triggers hover-state activation callbacks 594ms + ✓ components/dashboard/ShareSheet.accessibility.test.tsx (5 tests) 2128ms + ✓ Close button has descriptive aria-label for screen reader announcement 1326ms + ✓ Social share buttons have visible descriptive text labels for screen readers 333ms + ✓ app/components/Footer.error-resilience.test.tsx (5 tests) 1030ms + ✓ does not crash when the translation service returns undefined for all keys — t() is called for every label in Footer.tsx 653ms + ✓ app/not-found.mock-integrations.test.tsx (5 tests) 773ms + ✓ renders initial pending state overlay before MiniGame activation 684ms + ✓ app/components/CopyRepoButton.error-resilience.test.tsx (5 tests) 772ms + ✓ renders successfully during initial mount 413ms + ✓ app/components/navbar.timezone-boundaries.test.tsx (5 tests) 2023ms + ✓ 1. Renders consistently when the system clock is normalized to UTC midnight 910ms + ✓ 2. Aligns navigation link rendering across EST, IST, and JST timezone offsets 721ms + ✓ app/components/HeroSection.responsive-breakpoints.test.tsx (5 tests) 1052ms + ✓ stacks the search form vertically by default and switches to a horizontal row at the sm breakpoint 538ms +stderr | components/ReturnToTop.accessibility.test.tsx > ReturnToTop Accessibility Standards & Screen Reader Aria Compliance > inspects markup for correct use of accessible label coordinates (role, aria-label, aria-labelledby) +React does not recognize the `whileHover` prop on a DOM element. If you intentionally want it to appear in the DOM as a custom attribute, spell it as lowercase `whilehover` instead. If you accidentally passed it from a parent component, remove it from the DOM element. +React does not recognize the `whileTap` prop on a DOM element. If you intentionally want it to appear in the DOM as a custom attribute, spell it as lowercase `whiletap` instead. If you accidentally passed it from a parent component, remove it from the DOM element. + + ✓ components/ReturnToTop.accessibility.test.tsx (5 tests) 694ms + ✓ inspects markup for correct use of accessible label coordinates (role, aria-label, aria-labelledby) 380ms + ✓ components/dashboard/PRInsights/Highlights.timezone-boundaries.test.tsx (5 tests) 646ms + ✓ renders PR links with correct href across different timezone contexts 373ms + ✓ components/BrandParticles.accessibility.test.tsx (5 tests) 1076ms + ✓ renders decorative particle elements successfully 578ms + ✓ hooks/useDebounce.responsive-breakpoints.test.tsx (5 tests) 733ms + ✓ does not use fixed widths that cause horizontal overflow 510ms + ✓ components/dashboard/RadarChart.accessibility.test.tsx (5 tests) 852ms + ✓ inspects markup for accessible heading and descriptive chart labels 633ms + ✓ app/not-found.test.tsx (5 tests) 1005ms + ✓ renders go back home link with root href 585ms + ✓ components/ShareButtons.empty-fallback.test.tsx (5 tests) 703ms + ✓ renders without crashing when url is an empty string 431ms + ✓ components/AnimatedCursor.mouse-interactivity.test.tsx (6 tests) 1389ms + ✓ applies hover styling on ring when hovering over interactive element 827ms + ✓ components/FeatureCards.timezone-boundaries.test.tsx (5 tests) 627ms + ✓ renders section heading correctly 412ms +stderr | app/customize/components/ThemeSelector.error-resilience.test.tsx > ThemeSelector Resilience > should catch crashes in children via Error Boundary +Error: Crash + at CrashingChild (/home/atulupadhyay/Contribution/commitpulse/app/customize/components/ThemeSelector.error-resilience.test.tsx:81:13) + at Object.react_stack_bottom_frame (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:25904:20) + at renderWithHooks (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:7662:22) + at updateFunctionComponent (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:10166:19) + at beginWork (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:11778:18) + at runWithFiberInDEV (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:874:13) + at performUnitOfWork (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:17641:22) + at workLoopSync (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:17469:41) + at renderRootSync (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:17450:11) + at performWorkOnRoot (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:16583:35) { + [stack]: [Getter/Setter], + [message]: 'Crash' +} + +The above error occurred in the <CrashingChild> component. + +React will try to recreate this component tree from scratch using the error boundary you provided, TestErrorBoundary. + + + ✓ app/customize/components/ThemeSelector.error-resilience.test.tsx (4 tests) 564ms + ✓ should render successfully with a valid theme 463ms + ✓ components/dashboard/ActivityLandscape.theme-contrast.test.tsx (5 tests) 505ms + ✓ renders successfully in light theme 392ms + ✓ components/dashboard/ShareSheet.empty-fallback.test.tsx (5 tests) 1145ms + ✓ checks key DOM structures to make sure core markers exist even without populated data 620ms +stderr | components/dashboard/GrowthTrendChart.error-resilience.test.tsx > GrowthTrendChart Error Resilience > renders fallback UI on runtime exceptions +Error: Simulated runtime failure + at CrashComponent (/home/atulupadhyay/Contribution/commitpulse/components/dashboard/GrowthTrendChart.error-resilience.test.tsx:125:13) + at Object.react_stack_bottom_frame (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:25904:20) + at renderWithHooks (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:7662:22) + at updateFunctionComponent (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:10166:19) + at beginWork (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:11778:18) + at runWithFiberInDEV (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:874:13) + at performUnitOfWork (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:17641:22) + at workLoopSync (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:17469:41) + at renderRootSync (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:17450:11) + at performWorkOnRoot (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:16583:35) { + [stack]: [Getter/Setter], + [message]: 'Simulated runtime failure' +} + +The above error occurred in the <CrashComponent> component. + +React will try to recreate this component tree from scratch using the error boundary you provided, TestErrorBoundary. + +Error: Simulated runtime failure + at CrashComponent (/home/atulupadhyay/Contribution/commitpulse/components/dashboard/GrowthTrendChart.error-resilience.test.tsx:125:13) + at Object.react_stack_bottom_frame (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:25904:20) + at renderWithHooks (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:7662:22) + at updateFunctionComponent (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:10166:19) + at beginWork (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:11778:18) + at runWithFiberInDEV (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:874:13) + at performUnitOfWork (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:17641:22) + at workLoopSync (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:17469:41) + at renderRootSync (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:17450:11) + at performWorkOnRoot (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:16583:35) + +stderr | components/dashboard/GrowthTrendChart.error-resilience.test.tsx > GrowthTrendChart Error Resilience > provides retry/recovery controls in fallback UI +Error: Unexpected chart rendering failure + at BrokenComponent (/home/atulupadhyay/Contribution/commitpulse/components/dashboard/GrowthTrendChart.error-resilience.test.tsx:157:13) + at Object.react_stack_bottom_frame (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:25904:20) + at renderWithHooks (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:7662:22) + at updateFunctionComponent (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:10166:19) + at beginWork (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:11778:18) + at runWithFiberInDEV (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:874:13) + at performUnitOfWork (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:17641:22) + at workLoopSync (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:17469:41) + at renderRootSync (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:17450:11) + at performWorkOnRoot (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:16583:35) { + [stack]: [Getter/Setter], + [message]: 'Unexpected chart rendering failure' +} + +The above error occurred in the <BrokenComponent> component. + +React will try to recreate this component tree from scratch using the error boundary you provided, TestErrorBoundary. + +Error: Unexpected chart rendering failure + at BrokenComponent (/home/atulupadhyay/Contribution/commitpulse/components/dashboard/GrowthTrendChart.error-resilience.test.tsx:157:13) + at Object.react_stack_bottom_frame (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:25904:20) + at renderWithHooks (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:7662:22) + at updateFunctionComponent (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:10166:19) + at beginWork (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:11778:18) + at runWithFiberInDEV (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:874:13) + at performUnitOfWork (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:17641:22) + at workLoopSync (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:17469:41) + at renderRootSync (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:17450:11) + at performWorkOnRoot (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:16583:35) + + ✓ components/dashboard/GrowthTrendChart.error-resilience.test.tsx (5 tests) 801ms + ✓ provides retry/recovery controls in fallback UI 458ms +stderr | app/api/student/resume/tests/upload.test.ts > POST /api/student/resume/upload > accepts a file whose bytes match the declared PDF type +Failed to parse PDF using pdf-parse, falling back to UTF-8 decoding: InvalidPDFException: Invalid PDF structure. + at getException (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/pdf-parse/dist/pdf-parse/esm/Exception.js:197:24) + at PDFParse.load (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/pdf-parse/dist/pdf-parse/esm/PDFParse.js:159:19) + at processTicksAndRejections (node:internal/process/task_queues:103:5) + at PDFParse.getText (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/pdf-parse/dist/pdf-parse/esm/PDFParse.js:122:21) + at extractTextFromBuffer (/home/atulupadhyay/Contribution/commitpulse/lib/resume-parser.ts:144:24) + at parseResume (/home/atulupadhyay/Contribution/commitpulse/lib/resume-parser.ts:205:19) + at Module.POST (/home/atulupadhyay/Contribution/commitpulse/app/api/student/resume/upload/route.ts:76:20) + at /home/atulupadhyay/Contribution/commitpulse/app/api/student/resume/tests/upload.test.ts:79:22 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:1903:20 { + [cause]: Error: + at BaseExceptionClosure (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/pdfjs-dist/legacy/build/pdf.mjs:6418:29) + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/pdfjs-dist/legacy/build/pdf.mjs:6421:2 + at ModuleJob.run (node:internal/modules/esm/module_job:343:25) + at processTicksAndRejections (node:internal/process/task_queues:103:5) + at onImport.tracePromise.__proto__ (node:internal/modules/esm/loader:665:26) + at VitestModuleEvaluator.runExternalModule (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/vitest/dist/module-evaluator.js:80:21) + at VitestModuleRunner.directRequest (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/vite/dist/node/module-runner.js:1222:18) + at VitestModuleRunner.cachedRequest (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/vite/dist/node/module-runner.js:1166:73) + at extractTextFromBuffer (/home/atulupadhyay/Contribution/commitpulse/lib/resume-parser.ts:141:30) + at parseResume (/home/atulupadhyay/Contribution/commitpulse/lib/resume-parser.ts:205:19) { + message: 'Invalid PDF structure.', + name: 'InvalidPDFException' + } +} + + ✓ components/dashboard/CommitClock.responsive-breakpoints.test.tsx (5 tests) 631ms + ✓ mounts cleanly without side-effects inside a narrow 375px mobile display canvas 330ms + ✓ app/api/student/resume/tests/upload.test.ts (5 tests) 767ms + ✓ accepts a file whose bytes match the declared PDF type 668ms +stderr | components/dashboard/PRInsights/PRTrendChart.accessibility.test.tsx > PRTrendChart accessibility > renders accessible heading for the chart section +The width(-1) and height(-1) of chart should be greater than 0, + please check the style of container, or the props width(100%) and height(100%), + or add a minWidth(0) or minHeight(undefined) or use aspect(undefined) to control the + height and width. +The width(0) and height(0) of chart should be greater than 0, + please check the style of container, or the props width(100%) and height(100%), + or add a minWidth(0) or minHeight(undefined) or use aspect(undefined) to control the + height and width. + +stderr | components/dashboard/PRInsights/PRTrendChart.accessibility.test.tsx > PRTrendChart accessibility > renders view toggle buttons with accessible names +The width(-1) and height(-1) of chart should be greater than 0, + please check the style of container, or the props width(100%) and height(100%), + or add a minWidth(0) or minHeight(undefined) or use aspect(undefined) to control the + height and width. +The width(0) and height(0) of chart should be greater than 0, + please check the style of container, or the props width(100%) and height(100%), + or add a minWidth(0) or minHeight(undefined) or use aspect(undefined) to control the + height and width. + +stderr | components/dashboard/PRInsights/PRTrendChart.accessibility.test.tsx > PRTrendChart accessibility > allows keyboard focus on weekly and monthly buttons +The width(-1) and height(-1) of chart should be greater than 0, + please check the style of container, or the props width(100%) and height(100%), + or add a minWidth(0) or minHeight(undefined) or use aspect(undefined) to control the + height and width. +The width(0) and height(0) of chart should be greater than 0, + please check the style of container, or the props width(100%) and height(100%), + or add a minWidth(0) or minHeight(undefined) or use aspect(undefined) to control the + height and width. + + ✓ lib/aggregate.large-org.test.ts (5 tests) 570ms + ✓ performs aggregation efficiently on large datasets 423ms +stderr | components/dashboard/PRInsights/PRTrendChart.accessibility.test.tsx > PRTrendChart accessibility > changes chart view when weekly button is activated +The width(-1) and height(-1) of chart should be greater than 0, + please check the style of container, or the props width(100%) and height(100%), + or add a minWidth(0) or minHeight(undefined) or use aspect(undefined) to control the + height and width. +The width(0) and height(0) of chart should be greater than 0, + please check the style of container, or the props width(100%) and height(100%), + or add a minWidth(0) or minHeight(undefined) or use aspect(undefined) to control the + height and width. + +stderr | components/dashboard/PRInsights/PRTrendChart.accessibility.test.tsx > PRTrendChart accessibility > changes chart view when weekly button is activated +The width(0) and height(0) of chart should be greater than 0, + please check the style of container, or the props width(100%) and height(100%), + or add a minWidth(0) or minHeight(undefined) or use aspect(undefined) to control the + height and width. + +stderr | components/dashboard/PRInsights/PRTrendChart.accessibility.test.tsx > PRTrendChart accessibility > changes chart view when monthly button is activated +The width(-1) and height(-1) of chart should be greater than 0, + please check the style of container, or the props width(100%) and height(100%), + or add a minWidth(0) or minHeight(undefined) or use aspect(undefined) to control the + height and width. +The width(0) and height(0) of chart should be greater than 0, + please check the style of container, or the props width(100%) and height(100%), + or add a minWidth(0) or minHeight(undefined) or use aspect(undefined) to control the + height and width. + +stderr | components/dashboard/PRInsights/PRTrendChart.accessibility.test.tsx > PRTrendChart accessibility > changes chart view when monthly button is activated +The width(0) and height(0) of chart should be greater than 0, + please check the style of container, or the props width(100%) and height(100%), + or add a minWidth(0) or minHeight(undefined) or use aspect(undefined) to control the + height and width. + +stderr | components/dashboard/PRInsights/PRTrendChart.accessibility.test.tsx > PRTrendChart accessibility > changes chart view when monthly button is activated +The width(0) and height(0) of chart should be greater than 0, + please check the style of container, or the props width(100%) and height(100%), + or add a minWidth(0) or minHeight(undefined) or use aspect(undefined) to control the + height and width. + +stderr | components/dashboard/PRInsights/PRTrendChart.accessibility.test.tsx > PRTrendChart accessibility > keeps heading hierarchy logical with h2 as main chart heading +The width(-1) and height(-1) of chart should be greater than 0, + please check the style of container, or the props width(100%) and height(100%), + or add a minWidth(0) or minHeight(undefined) or use aspect(undefined) to control the + height and width. +The width(0) and height(0) of chart should be greater than 0, + please check the style of container, or the props width(100%) and height(100%), + or add a minWidth(0) or minHeight(undefined) or use aspect(undefined) to control the + height and width. + + ✓ components/dashboard/PRInsights/PRTrendChart.accessibility.test.tsx (6 tests) 1449ms + ✓ renders accessible heading for the chart section 765ms + ✓ components/dashboard/PRInsights/PRStatusDistribution.mouse-interactivity.test.tsx (5 tests) 946ms + ✓ renders interactive filter buttons for available PR states 599ms + ✓ app/components/SuccessGuide.mouse-interactivity.test.tsx (5 tests) 1418ms + ✓ should display responsive tooltip layouts at computed coordinates on mouseenter 923ms + ✓ app/components/CopyRepoButton.mouse-interactivity.test.tsx (5 tests) 738ms + ✓ renders copy button 506ms + ✓ components/dashboard/GithubWrapped.error-resilience.test.tsx (6 tests) 776ms + ✓ renders normally inside an error boundary 316ms + ✓ shows recovery UI when wrappedData is missing 320ms + ✓ app/components/FeatureCard.test.tsx (15 tests) 721ms + ✓ renders the title inside an <h3> 395ms + ✓ components/dashboard/DeploymentTracker.theme-contrast.test.tsx (16 tests) 814ms + ✓ heading text is dark-on-light and light-on-dark 412ms + ✓ components/dashboard/VisualizationTooltip.accessibility.test.tsx (5 tests) 738ms + ✓ 1. checks for correct use of accessible role and semantic coordinates 522ms + ✓ app/customize/components/ExportPanel.mouse-interactivity.test.tsx (5 tests) 1135ms + ✓ triggers format change when HTML button is clicked 743ms + ✓ components/dashboard/PopularPinnedRepos.empty-fallback.test.tsx (10 tests) 758ms + ✓ shows pinned empty-state after switching to pinned when pinnedRepos is empty 467ms + ✓ app/reviewform/page.test.tsx (2 tests) 1421ms + ✓ renders the testimonial submission form 1320ms + ✓ components/dashboard/ResumePreviewForm.test.tsx (5 tests) 631ms + ✓ adds a new skill 400ms + ✓ app/components/navbar.empty-fallback.test.tsx (5 tests) 876ms + ✓ Case 1: renders target component with default empty/unconfigured parameters 634ms + ✓ components/dashboard/HistoricalTrendView.timezone-boundaries.test.tsx (5 tests) 343ms +stderr | app/(root)/dashboard/error.mock-integrations.test.tsx > DashboardError - mock integrations > renders pending state overlays/fallback when service layer fails +Error: Service timeout + at /home/atulupadhyay/Contribution/commitpulse/app/(root)/dashboard/error.mock-integrations.test.tsx:29:35 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:302:11 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:1903:26 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2326:20 + at new Promise (<anonymous>) + at runWithCancel (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2323:10) + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2305:20 + at new Promise (<anonymous>) + at runWithTimeout (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2272:10) + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2955:64 + +stderr | app/(root)/dashboard/error.mock-integrations.test.tsx > DashboardError - mock integrations > triggers specific rate limit fallback when database hits API limit +Error: API limit exceeded + at /home/atulupadhyay/Contribution/commitpulse/app/(root)/dashboard/error.mock-integrations.test.tsx:37:35 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:302:11 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:1903:26 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2326:20 + at new Promise (<anonymous>) + at runWithCancel (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2323:10) + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2305:20 + at new Promise (<anonymous>) + at runWithTimeout (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2272:10) + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2955:64 + +stderr | app/(root)/dashboard/error.mock-integrations.test.tsx > DashboardError - mock integrations > triggers specific not found fallback when cache returns no user +Error: User not found in cache + at /home/atulupadhyay/Contribution/commitpulse/app/(root)/dashboard/error.mock-integrations.test.tsx:45:35 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:302:11 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:1903:26 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2326:20 + at new Promise (<anonymous>) + at runWithCancel (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2323:10) + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2305:20 + at new Promise (<anonymous>) + at runWithTimeout (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2272:10) + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2955:64 + +stderr | app/(root)/dashboard/error.mock-integrations.test.tsx > DashboardError - mock integrations > calls reset mechanism for complete cache sync on retry +Error: Service timeout + at /home/atulupadhyay/Contribution/commitpulse/app/(root)/dashboard/error.mock-integrations.test.tsx:53:35 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:302:11 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:1903:26 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2326:20 + at new Promise (<anonymous>) + at runWithCancel (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2323:10) + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2305:20 + at new Promise (<anonymous>) + at runWithTimeout (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2272:10) + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2955:64 + +stderr | app/(root)/dashboard/error.mock-integrations.test.tsx > DashboardError - mock integrations > writes complete telemetry sync to the mocked logger service +Error: Database retrieval timeout + at /home/atulupadhyay/Contribution/commitpulse/app/(root)/dashboard/error.mock-integrations.test.tsx:63:22 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:302:11 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:1903:26 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2326:20 + at new Promise (<anonymous>) + at runWithCancel (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2323:10) + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2305:20 + at new Promise (<anonymous>) + at runWithTimeout (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2272:10) + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2955:64 + + ✓ app/(root)/dashboard/error.mock-integrations.test.tsx (5 tests) 540ms + ✓ renders pending state overlays/fallback when service layer fails 466ms + ✓ app/components/theme-switch.mouse-interactivity.test.tsx (5 tests) 1040ms + ✓ should respond to mouseenter events on the active button layout structure 867ms + ✓ app/faq/page.test.tsx (1 test) 736ms + ✓ renders readable FAQ copy instead of raw translation keys 726ms + ✓ app/components/CustomizeCTA.responsive-breakpoints.test.tsx (5 tests) 701ms + ✓ renders successfully 550ms + ✓ app/customize/components/SectionLabel.mouse-interactivity.test.tsx (5 tests) 1168ms + ✓ should display the interactive tooltip when mouse enters the section label node 1096ms +stderr | app/customize/components/AdvancedSettingsPanel.error-resilience.test.tsx > AdvancedSettingsPanel Error Resilience > should isolate crashes when a child component throws an unexpected runtime exception +Error: Unexpected runtime exception or database connectivity error + at /home/atulupadhyay/Contribution/commitpulse/app/customize/components/AdvancedSettingsPanel.error-resilience.test.tsx:104:13 + at StyledSelect (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/spy/dist/index.js:332:34) + at Object.react_stack_bottom_frame (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:25904:20) + at renderWithHooks (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:7662:22) + at updateFunctionComponent (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:10166:19) + at beginWork (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:11778:18) + at runWithFiberInDEV (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:874:13) + at performUnitOfWork (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:17641:22) + at workLoopSync (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:17469:41) + at renderRootSync (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:17450:11) { + [stack]: [Getter/Setter], + [message]: 'Unexpected runtime exception or database connectivity error' +} + +The above error occurred in the <StyledSelect> component. + +React will try to recreate this component tree from scratch using the error boundary you provided, TestingErrorBoundary. + + +stderr | app/customize/components/AdvancedSettingsPanel.error-resilience.test.tsx > AdvancedSettingsPanel Error Resilience > should render a clean error recovery UI instead of hard-crashing the application +Error: Database connection failed + at /home/atulupadhyay/Contribution/commitpulse/app/customize/components/AdvancedSettingsPanel.error-resilience.test.tsx:119:13 + at StyledSelect (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/spy/dist/index.js:332:34) + at Object.react_stack_bottom_frame (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:25904:20) + at renderWithHooks (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:7662:22) + at updateFunctionComponent (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:10166:19) + at beginWork (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:11778:18) + at runWithFiberInDEV (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:874:13) + at performUnitOfWork (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:17641:22) + at workLoopSync (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:17469:41) + at renderRootSync (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:17450:11) { + [stack]: [Getter/Setter], + [message]: 'Database connection failed' +} + +The above error occurred in the <StyledSelect> component. + +React will try to recreate this component tree from scratch using the error boundary you provided, TestingErrorBoundary. + + +stderr | app/customize/components/AdvancedSettingsPanel.error-resilience.test.tsx > AdvancedSettingsPanel Error Resilience > should log the caught runtime exception to the dev-telemetry trackers +Error: Telemetry tracked crash condition + at /home/atulupadhyay/Contribution/commitpulse/app/customize/components/AdvancedSettingsPanel.error-resilience.test.tsx:148:20 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:302:11 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:1903:26 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2326:20 + at new Promise (<anonymous>) + at runWithCancel (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2323:10) + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2305:20 + at new Promise (<anonymous>) + at runWithTimeout (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2272:10) + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2955:64 { + [stack]: [Getter/Setter], + [message]: 'Telemetry tracked crash condition' +} + +The above error occurred in the <StyledSelect> component. + +React will try to recreate this component tree from scratch using the error boundary you provided, TestingErrorBoundary. + + +stderr | app/customize/components/AdvancedSettingsPanel.error-resilience.test.tsx > AdvancedSettingsPanel Error Resilience > should provide an interactive recovery path or reload button to reset the UI state +Error: Crash for recovery path check + at /home/atulupadhyay/Contribution/commitpulse/app/customize/components/AdvancedSettingsPanel.error-resilience.test.tsx:153:13 + at StyledSelect (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/spy/dist/index.js:332:34) + at Object.react_stack_bottom_frame (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:25904:20) + at renderWithHooks (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:7662:22) + at updateFunctionComponent (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:10166:19) + at beginWork (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:11778:18) + at runWithFiberInDEV (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:874:13) + at performUnitOfWork (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:17641:22) + at workLoopSync (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:17469:41) + at renderRootSync (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:17450:11) { + [stack]: [Getter/Setter], + [message]: 'Crash for recovery path check' +} + +The above error occurred in the <StyledSelect> component. + +React will try to recreate this component tree from scratch using the error boundary you provided, TestingErrorBoundary. + + + ✓ app/customize/components/AdvancedSettingsPanel.error-resilience.test.tsx (5 tests) 831ms + ✓ should maintain stability and render safely during initial server/client mismatch states 462ms + ✓ components/dashboard/PRInsights/ReviewAnalytics.accessibility.test.tsx (5 tests) 511ms + ✓ renders the analytics heading 386ms +stderr | components/dashboard/PRInsights/PRInsightsClient.error-resilience.test.tsx > PRInsightsClient - Error Resilience > 5. recovers via the reset/retry path once the underlying error is resolved +The width(-1) and height(-1) of chart should be greater than 0, + please check the style of container, or the props width(100%) and height(100%), + or add a minWidth(0) or minHeight(undefined) or use aspect(undefined) to control the + height and width. + + ✓ components/dashboard/PRInsights/PRInsightsClient.error-resilience.test.tsx (5 tests) 734ms + ✓ 3. renders a clean recovery UI instead of a crashed screen when a child throws 367ms + ✓ app/generator/GeneratorClient.empty-fallback.test.tsx (5 tests) 1319ms + ✓ Case 1: mounts successfully and renders initial empty states in Editor and Preview panels 735ms + ✓ components/dashboard/HistoricalTrendView.responsive-breakpoints.test.tsx (5 tests) 1560ms + ✓ should reflow multi-device columns into a standard vertical flex arrangement at 375px 524ms + ✓ should apply relative widths and prevent absolute sizing from causing horizontal scrollbars 467ms + ✓ should cleanly register user interactions on mobile-specific layout controls 322ms +stderr | components/ReturnToTop.mouse-interactivity.test.tsx > ReturnToTop - Interactive Tooltips, Cursor Hovers & Touch Event Propagation > triggers simulated mouseenter/hover gestures on active segments or interactive nodes +React does not recognize the `whileHover` prop on a DOM element. If you intentionally want it to appear in the DOM as a custom attribute, spell it as lowercase `whilehover` instead. If you accidentally passed it from a parent component, remove it from the DOM element. +React does not recognize the `whileTap` prop on a DOM element. If you intentionally want it to appear in the DOM as a custom attribute, spell it as lowercase `whiletap` instead. If you accidentally passed it from a parent component, remove it from the DOM element. + + ✓ components/ReturnToTop.mouse-interactivity.test.tsx (5 tests) 933ms + ✓ triggers simulated mouseenter/hover gestures on active segments or interactive nodes 671ms + ✓ app/documentation/code-block.test.tsx (5 tests) 628ms + ✓ renders the copy button with the correct label 331ms +stderr | components/dashboard/DashboardClient.responsive-breakpoints.test.tsx > DashboardClient Responsive Multi-device Columns & Mobile Viewport Layouts > root container has p-4 md:p-6 lg:p-8 classes for fluid responsive scaling padding +Received `true` for a non-boolean attribute `layout`. + +If you want to write it to the DOM, pass a string instead: layout="true" or layout={value.toString()}. + + ✓ components/KeyboardShortcutsModal.mouse-interactivity.test.tsx (7 tests) 854ms + ✓ calls onClose when the ✕ close button is clicked 682ms + ✓ components/dashboard/DashboardClient.responsive-breakpoints.test.tsx (5 tests) 1090ms + ✓ root container has p-4 md:p-6 lg:p-8 classes for fluid responsive scaling padding 430ms +stderr | app/layout.timezone-boundaries.test.tsx > RootLayout - Timezone Normalization & Calendar Data Boundary Alignment > 1. mocks standard timezone settings (e.g., UTC, EST, IST, and JST) +In HTML, <html> cannot be a child of <div>. +This will cause a hydration error. + + ✓ components/dashboard/ResumePreviewForm.mouse-interactivity.test.tsx (5 tests) 1060ms + ✓ adds skill input via add button click 703ms + ✓ app/layout.timezone-boundaries.test.tsx (5 tests) 557ms + ✓ components/dashboard/DashboardSkeleton.mouse-interactivity.test.tsx (5 tests) 497ms + ✓ app/customize/components/ThemeSelector.theme-contrast.test.tsx (5 tests) 750ms + ✓ renders theme selector controls 532ms + ✓ app/documentation/code-block.theme-contrast.test.tsx (5 tests) 754ms + ✓ adapts visual elements for light mode color scheme 593ms +stderr | app/components/theme-switch.error-resilience.test.tsx > ThemeSwitch error resilience > recovers gracefully when localStorage throws during initial theme resolution +Error: LocalStorage unavailable + at Object.<anonymous> (/home/atulupadhyay/Contribution/commitpulse/app/components/theme-switch.error-resilience.test.tsx:105:15) + at Object.Mock [as getItem] (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/spy/dist/index.js:332:34) + at getInitialIsDark (/home/atulupadhyay/Contribution/commitpulse/app/components/theme-switch.tsx:60:43) + at mountStateImpl (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:8268:24) + at mountState (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:8289:22) + at Object.useState (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:26243:18) + at process.env.NODE_ENV.exports.useState (/home/atulupadhyay/Contribution/commitpulse/node_modules/react/cjs/react.development.js:1263:34) + at useThemeToggle (/home/atulupadhyay/Contribution/commitpulse/app/components/theme-switch.tsx:471:31) + at ThemeToggleButton (/home/atulupadhyay/Contribution/commitpulse/app/components/theme-switch.tsx:556:44) + at Object.react_stack_bottom_frame (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:25904:20) { + [stack]: [Getter/Setter], + [message]: 'LocalStorage unavailable' +} + +The above error occurred in the <ThemeToggleButton> component. + +React will try to recreate this component tree from scratch using the error boundary you provided, TestErrorBoundary. + + +stderr | app/components/theme-switch.error-resilience.test.tsx > ThemeSwitch error resilience > allows the error recovery panel reset button to restore the UI +Error: LocalStorage unavailable + at Object.<anonymous> (/home/atulupadhyay/Contribution/commitpulse/app/components/theme-switch.error-resilience.test.tsx:135:15) + at Object.Mock [as getItem] (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/spy/dist/index.js:332:34) + at getInitialIsDark (/home/atulupadhyay/Contribution/commitpulse/app/components/theme-switch.tsx:60:43) + at mountStateImpl (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:8268:24) + at mountState (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:8289:22) + at Object.useState (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:26243:18) + at process.env.NODE_ENV.exports.useState (/home/atulupadhyay/Contribution/commitpulse/node_modules/react/cjs/react.development.js:1263:34) + at useThemeToggle (/home/atulupadhyay/Contribution/commitpulse/app/components/theme-switch.tsx:471:31) + at ThemeToggleButton (/home/atulupadhyay/Contribution/commitpulse/app/components/theme-switch.tsx:556:44) + at Object.react_stack_bottom_frame (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:25904:20) { + [stack]: [Getter/Setter], + [message]: 'LocalStorage unavailable' +} + +The above error occurred in the <ThemeToggleButton> component. + +React will try to recreate this component tree from scratch using the error boundary you provided, TestErrorBoundary. + +Error: LocalStorage unavailable + at Object.<anonymous> (/home/atulupadhyay/Contribution/commitpulse/app/components/theme-switch.error-resilience.test.tsx:135:15) + at Object.Mock [as getItem] (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/spy/dist/index.js:332:34) + at getInitialIsDark (/home/atulupadhyay/Contribution/commitpulse/app/components/theme-switch.tsx:60:43) + at mountStateImpl (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:8268:24) + at mountState (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:8289:22) + at Object.useState (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:26243:18) + at process.env.NODE_ENV.exports.useState (/home/atulupadhyay/Contribution/commitpulse/node_modules/react/cjs/react.development.js:1263:34) + at useThemeToggle (/home/atulupadhyay/Contribution/commitpulse/app/components/theme-switch.tsx:471:31) + at ThemeToggleButton (/home/atulupadhyay/Contribution/commitpulse/app/components/theme-switch.tsx:556:44) + at Object.react_stack_bottom_frame (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:25904:20) { + [stack]: [Getter/Setter], + [message]: 'LocalStorage unavailable' +} + +The above error occurred in the <ThemeToggleButton> component. + +React will try to recreate this component tree from scratch using the error boundary you provided, TestErrorBoundary. + + + ✓ app/components/theme-switch.error-resilience.test.tsx (4 tests) 755ms + ✓ renders ThemeToggleButton without crashing and shows placeholder before hydration 538ms + ✓ components/dashboard/AIInsightsSkeleton.timezon-boundaries.test.tsx (5 tests) 555ms +stderr | components/dashboard/ResumeUpload.theme-contrast.test.tsx > ResumeUpload Theme Contrast > preserves theme‑safe text legibility during the uploading state +An update to ResumeUpload inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act + + ✓ components/dashboard/ResumeUpload.theme-contrast.test.tsx (5 tests) 773ms + ✓ renders theme‑aware classes in dark mode 538ms +stderr | components/dashboard/CommitClock.accessibility.test.tsx > CommitClock - Accessibility & Screen Reader Aria Compliance > exposes each weekday group as an img role with a descriptive aria-label +React does not recognize the `whileInView` prop on a DOM element. If you intentionally want it to appear in the DOM as a custom attribute, spell it as lowercase `whileinview` instead. If you accidentally passed it from a parent component, remove it from the DOM element. + + ✓ components/dashboard/StatsCardSkeleton.accessibility.test.tsx (5 tests) 684ms + ✓ has no invalid or broken aria-labelledby references 498ms + ✓ components/dashboard/CommitClock.accessibility.test.tsx (5 tests) 906ms + ✓ announces the tooltip with role="tooltip" and the day title on focus 500ms + ✓ components/dashboard/GrowthTrendChart.timezone-boundaries.test.tsx (5 tests) 535ms +stderr | components/dashboard/LanguageChart.mock-integrations.test.tsx > LanguageChart — mock integrations > renders all language names when given typical API-shaped data +React does not recognize the `whileInView` prop on a DOM element. If you intentionally want it to appear in the DOM as a custom attribute, spell it as lowercase `whileinview` instead. If you accidentally passed it from a parent component, remove it from the DOM element. + + ✓ components/dashboard/LanguageChart.mock-integrations.test.tsx (5 tests) 453ms + ✓ renders all language names when given typical API-shaped data 342ms + ✓ components/BrandParticles.mock-integrations.test.tsx (5 tests) 921ms + ✓ renders successfully with mocked motion services 355ms + ✓ components/dashboard/DashboardClient.mock-integrations.test.tsx (5 tests) 1059ms + ✓ components/dashboard/RadarChart.test.tsx (11 tests) 716ms + ✓ app/components/navbar.theme-contrast.test.tsx (5 tests) 1178ms + ✓ renders navbar in light mode 777ms + ✓ app/generator/GeneratorClient.theme-contrast.test.tsx (5 tests) 827ms + ✓ renders editor and preview regions in a dark prefers-color-scheme environment 349ms + ✓ components/CherryBlossom.timezone-boundaries.test.tsx (5 tests) 816ms + ✓ renders correctly at a UTC midnight boundary 424ms + ✓ app/contributors/ContributorsSearch.mock-integrations.test.tsx (5 tests) 827ms + ✓ mocks standard asynchronous imports and databases using stubs 636ms + ✓ app/(root)/dashboard/layout.mouse-interactivity.test.tsx (5 tests) 986ms + ✓ displays a tooltip when hovering an active dashboard node 849ms + ✓ app/generator/components/ReadmeHealthBreakdown.test.tsx (5 tests) 935ms + ✓ renders quick fix buttons only for incomplete sections 516ms + ✓ app/generator/components/sections/TechnologyGraph.theme-contrast.test.tsx (5 tests) 1450ms + ✓ renders correctly in light theme with visible graph content 891ms + ✓ components/dashboard/AIInsights.mock-integrations.test.tsx (5 tests) 841ms + ✓ renders pending overlay while async service loads insights 753ms + ✓ components/InteractiveViewer.error-resilience.test.tsx (5 tests) 950ms + ✓ renders successfully with minimal content without crashing 728ms + ✓ app/not-found.mouse-interactivity.test.tsx (5 tests) 593ms + ✓ triggers simulated mouseenter/hover gestures on active segments 400ms + ✓ app/components/CopyRepoButton.timezone-boundaries.test.tsx (5 tests) 681ms + ✓ renders with the default "Copy URL" label on mount 437ms + ✓ app/generator/components/SectionCard.empty-fallback.test.tsx (10 tests) 873ms + ✓ toggles content visibility when header button is clicked 465ms + ✓ components/FeatureCards.error-resilience.test.tsx (5 tests) 2083ms + ✓ renders without crashing when all valid props are supplied 526ms + ✓ recovery panel has a reset button so user can reload without full page refresh 1255ms + ✓ components/dashboard/LanguageChart.accessibility.test.tsx (5 tests) 2003ms + ✓ Inspect markup to check for correct use of accessible label coordinates (role, aria-labelledby, or aria-describedby): region role and labelledby 1380ms +stderr | app/(root)/dashboard/error.accessibility.test.tsx > Dashboard Error Component - Accessibility Standards > should utilize correct accessible elements or roles +Error: Test dashboard error + at /home/atulupadhyay/Contribution/commitpulse/app/(root)/dashboard/error.accessibility.test.tsx:8:21 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:1889:40 + at runWithSuite (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2258:8) + at Object.collect (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:1889:10) + at Object.collect (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:1893:54) + at processTicksAndRejections (node:internal/process/task_queues:103:5) + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2462:26 + at collectTests (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2433:3) + at startTests (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:3278:17) + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/vitest/dist/chunks/base.B6Opl8PE.js:90:5 +[ERROR] Dashboard error {"error":{}} + + ✓ app/generator/components/sections/DescriptionSection.accessibility.test.tsx (5 tests) 1283ms + ✓ uses correct accessible label coordinates (role, aria-labelledby, or aria-describedby) 970ms +stderr | app/(root)/dashboard/error.accessibility.test.tsx > Dashboard Error Component - Accessibility Standards > interactive elements like buttons should accept programmatic key focus +Error: Test dashboard error + at /home/atulupadhyay/Contribution/commitpulse/app/(root)/dashboard/error.accessibility.test.tsx:8:21 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:1889:40 + at runWithSuite (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2258:8) + at Object.collect (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:1889:10) + at Object.collect (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:1893:54) + at processTicksAndRejections (node:internal/process/task_queues:103:5) + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2462:26 + at collectTests (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2433:3) + at startTests (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:3278:17) + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/vitest/dist/chunks/base.B6Opl8PE.js:90:5 +[ERROR] Dashboard error {"error":{}} + +stderr | components/dashboard/ProfileCard.responsive-breakpoints.test.tsx > ProfileCard — content presence under a mocked 375 px matchMedia environment > renders name, username and bio when matchMedia reports a 375 px viewport +React does not recognize the `whileHover` prop on a DOM element. If you intentionally want it to appear in the DOM as a custom attribute, spell it as lowercase `whilehover` instead. If you accidentally passed it from a parent component, remove it from the DOM element. +React does not recognize the `whileTap` prop on a DOM element. If you intentionally want it to appear in the DOM as a custom attribute, spell it as lowercase `whiletap` instead. If you accidentally passed it from a parent component, remove it from the DOM element. + +stderr | app/(root)/dashboard/error.accessibility.test.tsx > Dashboard Error Component - Accessibility Standards > tooltip elements should announce correct accessibility descriptions +Error: Test dashboard error + at /home/atulupadhyay/Contribution/commitpulse/app/(root)/dashboard/error.accessibility.test.tsx:8:21 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:1889:40 + at runWithSuite (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2258:8) + at Object.collect (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:1889:10) + at Object.collect (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:1893:54) + at processTicksAndRejections (node:internal/process/task_queues:103:5) + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2462:26 + at collectTests (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2433:3) + at startTests (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:3278:17) + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/vitest/dist/chunks/base.B6Opl8PE.js:90:5 +[ERROR] Dashboard error {"error":{}} + +stderr | app/(root)/dashboard/error.accessibility.test.tsx > Dashboard Error Component - Accessibility Standards > keyboard navigation follows a logical tab ordering path +Error: Test dashboard error + at /home/atulupadhyay/Contribution/commitpulse/app/(root)/dashboard/error.accessibility.test.tsx:8:21 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:1889:40 + at runWithSuite (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2258:8) + at Object.collect (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:1889:10) + at Object.collect (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:1893:54) + at processTicksAndRejections (node:internal/process/task_queues:103:5) + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2462:26 + at collectTests (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2433:3) + at startTests (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:3278:17) + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/vitest/dist/chunks/base.B6Opl8PE.js:90:5 +[ERROR] Dashboard error {"error":{}} + + ✓ components/dashboard/RepositoryGraph.mouse-interactivity.test.tsx (5 tests) 1787ms + ✓ clicking an active filter button toggles it to inactive and removes its background colour 1343ms +stderr | app/(root)/dashboard/error.accessibility.test.tsx > Dashboard Error Component - Accessibility Standards > headings are structured in a logical hierarchical sequence +Error: Test dashboard error + at /home/atulupadhyay/Contribution/commitpulse/app/(root)/dashboard/error.accessibility.test.tsx:8:21 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:1889:40 + at runWithSuite (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2258:8) + at Object.collect (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:1889:10) + at Object.collect (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:1893:54) + at processTicksAndRejections (node:internal/process/task_queues:103:5) + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2462:26 + at collectTests (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2433:3) + at startTests (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:3278:17) + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/vitest/dist/chunks/base.B6Opl8PE.js:90:5 +[ERROR] Dashboard error {"error":{}} + + ✓ app/(root)/dashboard/error.accessibility.test.tsx (5 tests) 1949ms + ✓ should utilize correct accessible elements or roles 1149ms + ✓ components/dashboard/ProfileCard.responsive-breakpoints.test.tsx (5 tests) 2261ms + ✓ renders name, username and bio when matchMedia reports a 375 px viewport 581ms + ✓ share button opens the ShareSheet when clicked 1102ms + ✓ app/generator/components/sections/NameSection.accessibility.test.tsx (5 tests) 2187ms + ✓ renders the section toggle button with accessible name 1233ms + ✓ supports keyboard tab navigation to interactive elements 396ms + ✓ app/components/Footer.timezone-boundaries.test.tsx (5 tests) 1110ms + ✓ computes the copyright year correctly in 'UTC' 340ms +stderr | components/dashboard/PRInsights/ReviewAnalytics.mock-integrations.test.tsx > ReviewAnalytics - Asynchronous Service Layer Mocking & Local Cache Stubs > 4. verifies correct fallback procedures during fake endpoint timeout blocks +A suspended resource finished loading inside a test, but the event was not wrapped in act(...). + +When testing, code that resolves suspended data should be wrapped into act(...): + +act(() => { + /* finish loading suspended data */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act +A suspended resource finished loading inside a test, but the event was not wrapped in act(...). + +When testing, code that resolves suspended data should be wrapped into act(...): + +act(() => { + /* finish loading suspended data */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act + + ❯ components/dashboard/PRInsights/ReviewAnalytics.mock-integrations.test.tsx (5 tests | 1 failed) 1484ms + ✓ 1. mocks standard asynchronous imports and databases using stubs 28ms + × 2. tests service loading paths to ensure pending state overlays render 1259ms + ✓ 3. asserts local cache layers are queried before triggering database retrievals 3ms + ✓ 4. verifies correct fallback procedures during fake endpoint timeout blocks 163ms + ✓ 5. asserts complete cache sync is written on success callbacks 15ms +stderr | components/dashboard/PRInsights/TopMetricsRow.accessibility.test.tsx > TopMetricsRow Accessibility Standards & Screen Reader Aria Compliance > renders all metric headings in logical order +React does not recognize the `whileHover` prop on a DOM element. If you intentionally want it to appear in the DOM as a custom attribute, spell it as lowercase `whilehover` instead. If you accidentally passed it from a parent component, remove it from the DOM element. +Unknown event handler property `onHoverStart`. It will be ignored. +Unknown event handler property `onHoverEnd`. It will be ignored. + + ✓ components/dashboard/LanguageChart.mouse-interactivity.test.tsx (5 tests) 389ms + ✓ hooks/useRecentSearches.responsive-breakpoints.test.ts (5 tests) 741ms + ✓ scales navigation and preserves max searches 558ms + ✓ components/dashboard/PRInsights/TopMetricsRow.accessibility.test.tsx (5 tests) 739ms + ✓ renders all metric cards without accessibility violations 442ms + ✓ app/generator/components/sections/DescriptionSection.mouse-interactivity.test.tsx (5 tests) 846ms + ✓ allows textarea interaction through mouse click events 603ms + ✓ components/dashboard/DeploymentTracker.accessibility.test.tsx (10 tests) 1136ms + ✓ renders a heading that names the section 521ms +stderr | components/dashboard/ContributionForecast.test.tsx > ContributionForecast > renders forecast headers and elements +React does not recognize the `whileInView` prop on a DOM element. If you intentionally want it to appear in the DOM as a custom attribute, spell it as lowercase `whileinview` instead. If you accidentally passed it from a parent component, remove it from the DOM element. + + ✓ components/dashboard/ContributionForecast.test.tsx (6 tests) 661ms + ✓ renders forecast headers and elements 483ms + ✓ components/dashboard/VisualizationTooltip.mock-integrations.test.tsx (5 tests) 642ms + ✓ asserts the tooltip uses the correct accessible roles for screen readers 386ms +stderr | app/(root)/dashboard/error.mouse-interactivity.test.tsx > DashboardError Mouse Interactivity > triggers reset when Try again button is clicked +Error: Something went wrong + at renderComponent (/home/atulupadhyay/Contribution/commitpulse/app/(root)/dashboard/error.mouse-interactivity.test.tsx:17:42) + at /home/atulupadhyay/Contribution/commitpulse/app/(root)/dashboard/error.mouse-interactivity.test.tsx:21:5 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:302:11 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:1903:26 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2326:20 + at new Promise (<anonymous>) + at runWithCancel (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2323:10) + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2305:20 + at new Promise (<anonymous>) + at runWithTimeout (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2272:10) +[ERROR] Dashboard error {"error":{}} + +stderr | app/(root)/dashboard/error.mouse-interactivity.test.tsx > DashboardError Mouse Interactivity > handles mouse enter and mouse leave on Try again button +Error: Something went wrong + at renderComponent (/home/atulupadhyay/Contribution/commitpulse/app/(root)/dashboard/error.mouse-interactivity.test.tsx:17:42) + at /home/atulupadhyay/Contribution/commitpulse/app/(root)/dashboard/error.mouse-interactivity.test.tsx:33:5 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:302:11 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:1903:26 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2326:20 + at new Promise (<anonymous>) + at runWithCancel (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2323:10) + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2305:20 + at new Promise (<anonymous>) + at runWithTimeout (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2272:10) +[ERROR] Dashboard error {"error":{}} + +stderr | app/(root)/dashboard/error.mouse-interactivity.test.tsx > DashboardError Mouse Interactivity > handles mouse enter and mouse leave on Go back home button +Error: Something went wrong + at renderComponent (/home/atulupadhyay/Contribution/commitpulse/app/(root)/dashboard/error.mouse-interactivity.test.tsx:17:42) + at /home/atulupadhyay/Contribution/commitpulse/app/(root)/dashboard/error.mouse-interactivity.test.tsx:46:5 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:302:11 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:1903:26 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2326:20 + at new Promise (<anonymous>) + at runWithCancel (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2323:10) + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2305:20 + at new Promise (<anonymous>) + at runWithTimeout (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2272:10) +[ERROR] Dashboard error {"error":{}} + +stderr | app/(root)/dashboard/error.mouse-interactivity.test.tsx > DashboardError Mouse Interactivity > renders navigation link correctly +Error: Something went wrong + at renderComponent (/home/atulupadhyay/Contribution/commitpulse/app/(root)/dashboard/error.mouse-interactivity.test.tsx:17:42) + at /home/atulupadhyay/Contribution/commitpulse/app/(root)/dashboard/error.mouse-interactivity.test.tsx:59:5 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:302:11 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:1903:26 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2326:20 + at new Promise (<anonymous>) + at runWithCancel (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2323:10) + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2305:20 + at new Promise (<anonymous>) + at runWithTimeout (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2272:10) +[ERROR] Dashboard error {"error":{}} + +stderr | app/(root)/dashboard/error.mouse-interactivity.test.tsx > DashboardError Mouse Interactivity > keeps interactive controls visible after mouse interactions +Error: Something went wrong + at renderComponent (/home/atulupadhyay/Contribution/commitpulse/app/(root)/dashboard/error.mouse-interactivity.test.tsx:17:42) + at /home/atulupadhyay/Contribution/commitpulse/app/(root)/dashboard/error.mouse-interactivity.test.tsx:67:5 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:302:11 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:1903:26 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2326:20 + at new Promise (<anonymous>) + at runWithCancel (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2323:10) + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2305:20 + at new Promise (<anonymous>) + at runWithTimeout (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2272:10) +[ERROR] Dashboard error {"error":{}} + + ✓ app/(root)/dashboard/error.mouse-interactivity.test.tsx (5 tests) 755ms + ✓ triggers reset when Try again button is clicked 473ms + ✓ components/dashboard/tooltipUtils.accessibility.test.tsx (5 tests) 1044ms + ✓ renders with role="tooltip" so assistive technologies correctly identify the element 820ms + ✓ components/BrandParticles.error-resilience.test.tsx (5 tests) 636ms + ✓ renders without crashing after hydration 318ms + ✓ app/generator/components/SectionCard.responsive-breakpoints.test.tsx (5 tests) 660ms + ✓ asserts mobile-specific toggle states respond cleanly 495ms +stderr | components/ReturnToTop.timezone-boundaries.test.tsx > ReturnToTop Timezone Normalization & Calendar Data Boundary Alignment > 1. mocks standard timezone settings (UTC, EST, IST, JST) while the button mounts correctly +React does not recognize the `whileHover` prop on a DOM element. If you intentionally want it to appear in the DOM as a custom attribute, spell it as lowercase `whilehover` instead. If you accidentally passed it from a parent component, remove it from the DOM element. +React does not recognize the `whileTap` prop on a DOM element. If you intentionally want it to appear in the DOM as a custom attribute, spell it as lowercase `whiletap` instead. If you accidentally passed it from a parent component, remove it from the DOM element. + + ✓ components/ReturnToTop.timezone-boundaries.test.tsx (5 tests) 681ms + ✓ 1. mocks standard timezone settings (UTC, EST, IST, JST) while the button mounts correctly 576ms + ✓ app/not-found.error-resilience.test.tsx (5 tests) 789ms + ✓ Renders normally with hydration stability when no exceptions occur 499ms + ✓ components/dashboard/HistoricalTrendView.empty-fallback.test.tsx (5 tests) 705ms + ✓ renders the period label and navigation controls even with no activity data 478ms + ✓ components/FeatureCards.responsive-breakpoints.test.tsx (5 tests) 994ms + ✓ Mobile Column Reflow (Mobile Viewports Equivalent): defaults to single column and reflows at md breakpoint 728ms + ✓ components/CherryBlossom.responsive-breakpoints.test.tsx (5 tests) 578ms + ✓ components/dashboard/RefreshButton.empty-fallback.test.tsx (5 tests) 625ms + ✓ renders button when username is empty 491ms + ✓ app/generator/components/PreviewPanel.theme-contrast.test.tsx (5 tests) 392ms + ✓ components/dashboard/GithubWrapped.accessibility.test.tsx (5 tests) 1084ms + ✓ renders main heading correctly for screen readers 820ms + ✓ app/template.accessibility.test.tsx (5 tests) 861ms + ✓ Case 1: exposes structural labeling on the landmark container 670ms + ✓ components/BrandParticles.timezone-boundaries.test.tsx (5 tests) 1101ms + ✓ renders successfully across multiple timezone offsets (UTC, EST, IST, JST) 698ms + ✓ app/generator/components/sections/SocialsSection.empty-fallback.test.tsx (5 tests) 751ms + ✓ shows fallback message when links tab is opened with no selected platforms 466ms + ✓ components/dashboard/ResumePreviewForm.error-resilience.test.tsx (5 tests) 366ms + ✓ app/components/SuccessGuide.empty-fallback.test.tsx (5 tests) 859ms + ✓ dismiss button works without errors 526ms + ✓ app/components/CustomizeCTA.mock-integrations.test.tsx (5 tests) 572ms + ✓ renders successfully with mocked services 453ms + ✓ app/generator/components/EditorPanel.timezone-boundaries.test.tsx (5 tests) 485ms + ✓ renders the core form wrapper layout cleanly with structural accessibility markers 341ms +stderr | components/dashboard/CommitClock.timezone-boundaries.test.tsx > CommitClock - Timezone Normalization & Calendar Data Boundary Alignment > aligns commit data to correct calendar dates in UTC timezone +React does not recognize the `whileInView` prop on a DOM element. If you intentionally want it to appear in the DOM as a custom attribute, spell it as lowercase `whileinview` instead. If you accidentally passed it from a parent component, remove it from the DOM element. + + ✓ components/dashboard/heatmapUtils.mouse-interactivity.test.ts (5 tests) 952ms + ✓ 1. should activate tooltip and compute positioning on cell mouseenter 679ms + ✓ components/dashboard/CommitClock.timezone-boundaries.test.tsx (10 tests) 656ms + ✓ app/components/theme-switch.responsive-breakpoints.test.tsx (5 tests) 646ms + ✓ renders correctly on a standard 375px mobile viewport 473ms + ✓ components/Leaderboard.timezone-boundaries.test.tsx (5 tests) 697ms + ✓ 1. mocks standard timezone settings (e.g., UTC, EST, IST, and JST) 462ms + ✓ components/dashboard/DashboardSkeleton.mock-integrations.test.tsx (5 tests) 792ms + ✓ 5. Assert complete cache sync is written on success callbacks 670ms + ✓ app/components/Footer.mock-integrations.test.tsx (5 tests) 578ms + ✓ components/dashboard/PRInsights/RepoPerformanceTable.responsive-breakpoints.test.tsx (5 tests) 742ms + ✓ uses an overflow-auto table wrapper for smaller viewports 353ms + ✓ components/ScrollToBottom.mouse-interactivity.test.tsx (7 tests) 888ms + ✓ is visible when not scrolled to the bottom 562ms +stderr | app/(root)/dashboard/error.test.tsx > Dashboard Error Page > renders the API limit emoji for API limit reached errors +Error: API limit reached + at /home/atulupadhyay/Contribution/commitpulse/app/(root)/dashboard/error.test.tsx:17:30 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:302:11 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:1903:26 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2326:20 + at new Promise (<anonymous>) + at runWithCancel (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2323:10) + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2305:20 + at new Promise (<anonymous>) + at runWithTimeout (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2272:10) + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2955:64 +[ERROR] Dashboard error {"error":{}} + +stderr | app/(root)/dashboard/error.test.tsx > Dashboard Error Page > renders the not found emoji for User not found errors +Error: User not found + at /home/atulupadhyay/Contribution/commitpulse/app/(root)/dashboard/error.test.tsx:24:30 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:302:11 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:1903:26 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2326:20 + at new Promise (<anonymous>) + at runWithCancel (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2323:10) + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2305:20 + at new Promise (<anonymous>) + at runWithTimeout (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2272:10) + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2955:64 +[ERROR] Dashboard error {"error":{}} + +stderr | app/(root)/dashboard/error.test.tsx > Dashboard Error Page > renders the generic error emoji for other errors +Error: Something went wrong + at /home/atulupadhyay/Contribution/commitpulse/app/(root)/dashboard/error.test.tsx:31:30 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:302:11 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:1903:26 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2326:20 + at new Promise (<anonymous>) + at runWithCancel (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2323:10) + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2305:20 + at new Promise (<anonymous>) + at runWithTimeout (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2272:10) + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2955:64 +[ERROR] Dashboard error {"error":{}} + +stderr | app/(root)/dashboard/error.test.tsx > Dashboard Error Page > shows Try again button +Error: error + at /home/atulupadhyay/Contribution/commitpulse/app/(root)/dashboard/error.test.tsx:37:30 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:302:11 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:1903:26 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2326:20 + at new Promise (<anonymous>) + at runWithCancel (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2323:10) + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2305:20 + at new Promise (<anonymous>) + at runWithTimeout (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2272:10) + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2955:64 +[ERROR] Dashboard error {"error":{}} + +stderr | app/(root)/dashboard/error.test.tsx > Dashboard Error Page > calls reset when Try again is clicked +Error: error + at /home/atulupadhyay/Contribution/commitpulse/app/(root)/dashboard/error.test.tsx:45:30 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:302:11 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:1903:26 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2326:20 + at new Promise (<anonymous>) + at runWithCancel (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2323:10) + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2305:20 + at new Promise (<anonymous>) + at runWithTimeout (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2272:10) + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2955:64 +[ERROR] Dashboard error {"error":{}} + +stderr | app/(root)/dashboard/error.test.tsx > Dashboard Error Page > shows Go back home link +Error: error + at /home/atulupadhyay/Contribution/commitpulse/app/(root)/dashboard/error.test.tsx:53:30 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:302:11 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:1903:26 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2326:20 + at new Promise (<anonymous>) + at runWithCancel (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2323:10) + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2305:20 + at new Promise (<anonymous>) + at runWithTimeout (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2272:10) + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2955:64 +[ERROR] Dashboard error {"error":{}} + + ✓ app/(root)/dashboard/error.test.tsx (6 tests) 897ms + ✓ renders the API limit emoji for API limit reached errors 551ms + ✓ components/dashboard/ActivityLandscape.mouse-interactivity.test.tsx (5 tests) 909ms + ✓ triggers simulated mouseenter gestures on active segments to show tooltips 531ms + ✓ app/not-found.theme-contrast.test.tsx (5 tests) 1083ms + ✓ renders correctly in both light and dark theme environments 859ms + ✓ app/components/CustomizeCTA.theme-contrast.test.tsx (5 tests) 619ms + ✓ applies light and dark text classes to the heading 365ms +stderr | components/dashboard/ComparisonStatsCard.accessibility.test.tsx > ComparisonStatsCard — Accessibility & Screen Reader Compliance > renders card as a named region landmark with correct aria-label +React does not recognize the `whileInView` prop on a DOM element. If you intentionally want it to appear in the DOM as a custom attribute, spell it as lowercase `whileinview` instead. If you accidentally passed it from a parent component, remove it from the DOM element. +React does not recognize the `whileHover` prop on a DOM element. If you intentionally want it to appear in the DOM as a custom attribute, spell it as lowercase `whilehover` instead. If you accidentally passed it from a parent component, remove it from the DOM element. + + ✓ components/KeyboardShortcutsModal.error-resilience.test.tsx (8 tests) 934ms + ✓ does not throw when onClose is a no-op function 446ms + ✓ components/dashboard/ComparisonStatsCard.accessibility.test.tsx (5 tests) 594ms + ✓ renders card as a named region landmark with correct aria-label 475ms + ✓ components/AnimatedCursor.empty-fallback.test.tsx (5 tests) 262ms + ✓ components/dashboard/DeploymentTracker.empty-fallback.test.tsx (11 tests) 856ms + ✓ handles an empty repoName gracefully (renders an empty but present link) 413ms + ✓ app/components/SuccessGuide.theme-contrast.test.tsx (5 tests) 866ms + ✓ confirms the decorative background glow overlay is non-interactive and does not clip foreground text 534ms +stderr | components/dashboard/ResumePreviewForm.mock-integrations.test.tsx > ResumePreviewForm - Mock Integrations & Cache Stubs > DistributedCache.get falls back to local cache when Redis fetch fails +[ERROR] Cache SET failed {"component":"DistributedCache","key":"[REDACTED]","error":{}} + + ✓ components/InteractiveViewer.mock-integrations.test.tsx (5 tests) 998ms + ✓ resolves the tooltip through the mocked async presentation layer, not the real module 644ms + ✓ components/dashboard/ResumePreviewForm.mock-integrations.test.tsx (5 tests) 1244ms + ✓ component shows pending overlay when save request is pending 910ms + ✓ handles fetch timeout/failure and shows toast.error 306ms + ✓ lib/calculate.responsive-breakpoints.test.ts (5 tests) 741ms + ✓ components/BrandParticles.empty-fallback.test.tsx (5 tests) 1077ms + ✓ renders stably when parameters or option configs are completely empty 504ms + ✓ components/dashboard/RefreshButton.timezone-boundaries.test.tsx (5 tests) 800ms + ✓ 1. mocks standard timezone settings (e.g., UTC, EST, IST, and JST) 646ms + ✓ app/components/CopyRepoButton.mock-integrations.test.tsx (5 tests) 885ms + ✓ calls the clipboard service when the button is clicked 602ms + ✓ components/BrandParticles.mouse-interactivity.test.tsx (5 tests) 1050ms + ✓ renders particle layer successfully 394ms +stderr | app/generator/components/sections/CommitPulseSection.mock-integrations.test.tsx > CommitPulseSection - Asynchronous Service Layer Mocking & Local Cache Stubs > manages value truncation boundaries on hex accent inputs and triggers clear routines safely +An update to CommitPulseSection inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act +An update to CommitPulseSection inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act + + ✓ app/generator/components/sections/CommitPulseSection.mock-integrations.test.tsx (5 tests) 1034ms + ✓ handles successful profile verification queries from the api route cleanly 421ms + ✓ dispatches status synchronization callbacks on click interaction triggers 404ms + ✓ components/dashboard/PRInsights/RepoPerformanceTable.mock-integrations.test.tsx (5 tests) 165ms + ✓ components/dashboard/ContributionReplay.test.tsx (7 tests) 1030ms + ✓ lib/calculate.test.ts (125 tests) 410ms + ✓ app/components/SuccessGuide.error-resilience.test.tsx (5 tests) 627ms + ✓ calls onDismiss handler when close button is clicked without crashing 387ms + ✓ lib/svg/themes.empty-fallback.test.ts (5 tests) 489ms + ✓ Case 1: Render with null/undefined theme parameters and verify fallback to default "dark" theme constants 399ms + ✓ app/components/theme-switch.mock-integrations.test.tsx (5 tests) 981ms + ✓ renders the toggle button and resolves hydration state asynchronously 677ms + ✓ app/components/HeroSection.empty-fallback.test.tsx (5 tests) 1005ms + ✓ Case 1: mounts successfully and renders initial empty states/headings 646ms + ✓ components/dashboard/PRInsights/RepoPerformanceTable.timezone-boundaries.test.tsx (5 tests) 976ms + ✓ 1. mocks UTC, EST, IST, and JST timezone buckets in rendered repo rows 338ms + ✓ 3. parses leap-year boundaries without leaving gaps in rendered grid rows 512ms + ✓ components/dashboard/GoalTracker.test.tsx (4 tests) 425ms + ✓ components/ReturnToTop.mock-integrations.test.tsx (5 tests) 554ms + ✓ Case 1: Mock standard asynchronous imports and databases using stubs and verify scrolling state loading 463ms +stderr | components/dashboard/PRInsights/TopMetricsRow.timezone-boundaries.test.tsx > TopMetricsRow Timezone Normalization & Calendar Data Boundary Alignment > 1. mocks standard timezone settings (e.g., UTC, EST, IST, and JST) +React does not recognize the `whileHover` prop on a DOM element. If you intentionally want it to appear in the DOM as a custom attribute, spell it as lowercase `whilehover` instead. If you accidentally passed it from a parent component, remove it from the DOM element. +Unknown event handler property `onHoverStart`. It will be ignored. +Unknown event handler property `onHoverEnd`. It will be ignored. + + ✓ app/generator/data/technologies.theme-contrast.test.tsx (5 tests) 924ms + ✓ components/dashboard/PRInsights/TopMetricsRow.timezone-boundaries.test.tsx (5 tests) 993ms + ✓ 1. mocks standard timezone settings (e.g., UTC, EST, IST, and JST) 651ms + ✓ components/dashboard/ShareSheet.mock-integrations.test.tsx (5 tests) 974ms + ✓ renders share sheet with mocked service layer data 416ms + ✓ components/ScrollToBottom.accessibility.test.tsx (6 tests) 916ms + ✓ button has aria-label="Scroll to bottom" 717ms + ✓ app/components/CopyRepoButton.test.tsx (5 tests) 680ms + ✓ renders with default copy text 519ms + ✓ components/reviewform.error-resilience.test.tsx (5 tests) 1279ms + ✓ 1. should render a clean error recovery UI instead of crashing when a nested runtime exception occurs 331ms + ✓ 3. should ensure user reset and reload interaction paths are available on recovery panels 507ms + ✓ 4. should recover successfully and try re-rendering when user triggers the reset/retry path 323ms + ✓ components/dashboard/Heatmap.accessibility.test.tsx (6 tests) 1243ms + ✓ renders a semantic heading H3 for the heatmap title 745ms + ✓ app/components/SuccessGuide.mock-integrations.test.tsx (5 tests) 769ms + ✓ renders a pending state overlay while the async service is loading 512ms + ✓ components/DiscordButton.timezone-boundaries.test.tsx (5 tests) 431ms + ✓ renders correctly 338ms + ✓ app/customize/components/ExportPanel.error-resilience.test.tsx (5 tests) 568ms + ✓ hooks/useShareActions.accessibility.test.ts (5 tests) 788ms + ✓ inspects markup to check for correct use of accessible label coordinates (role, aria-labelledby, aria-describedby) 532ms + ✓ components/dashboard/PRInsights/Highlights.empty-fallback.test.tsx (6 tests) 957ms + ✓ 6. applies correct link href and opens in new tab when data is available 576ms +stderr | components/dashboard/PRInsights/PRInsightsClient.mouse-interactivity.test.tsx > PRInsightsClient Mouse Interactivity > renders interactive dashboard sections after successful data load +The width(-1) and height(-1) of chart should be greater than 0, + please check the style of container, or the props width(100%) and height(100%), + or add a minWidth(0) or minHeight(undefined) or use aspect(undefined) to control the + height and width. + +stderr | components/dashboard/PRInsights/PRInsightsClient.mouse-interactivity.test.tsx > PRInsightsClient Mouse Interactivity > propagates click interactions on dashboard widgets +The width(-1) and height(-1) of chart should be greater than 0, + please check the style of container, or the props width(100%) and height(100%), + or add a minWidth(0) or minHeight(undefined) or use aspect(undefined) to control the + height and width. + +stderr | components/dashboard/PRInsights/PRInsightsClient.mouse-interactivity.test.tsx > PRInsightsClient Mouse Interactivity > handles mouse enter and mouse leave interactions without crashing +The width(-1) and height(-1) of chart should be greater than 0, + please check the style of container, or the props width(100%) and height(100%), + or add a minWidth(0) or minHeight(undefined) or use aspect(undefined) to control the + height and width. + +stderr | components/dashboard/PRInsights/PRInsightsClient.mouse-interactivity.test.tsx > PRInsightsClient Mouse Interactivity > supports touch interaction propagation on mobile devices +The width(-1) and height(-1) of chart should be greater than 0, + please check the style of container, or the props width(100%) and height(100%), + or add a minWidth(0) or minHeight(undefined) or use aspect(undefined) to control the + height and width. + +stderr | components/dashboard/PRInsights/PRInsightsClient.mouse-interactivity.test.tsx > PRInsightsClient Mouse Interactivity > renders pointer-enabled interactive widgets for hoverable dashboard actions +The width(-1) and height(-1) of chart should be greater than 0, + please check the style of container, or the props width(100%) and height(100%), + or add a minWidth(0) or minHeight(undefined) or use aspect(undefined) to control the + height and width. + + ✓ components/dashboard/PRInsights/PRInsightsClient.mouse-interactivity.test.tsx (5 tests) 472ms + ✓ lib/cache.distributed-lock.test.ts (6 tests) 752ms + ✓ accepts custom maxPollTimeMs via LockConfig and stops polling after timeout 569ms + ✓ components/CherryBlossom.error-resilience.test.tsx (5 tests) 835ms + ✓ renders a clean recovery panel when the nested animation runtime throws 458ms + ✓ components/Leaderboard.test.tsx (8 tests) 840ms + ✓ renders rank 1, 2, and 3 podium items when there are 3 or more contributors 327ms + ✓ components/dashboard/GrowthTrendChart.test.tsx (14 tests) 825ms + ✓ app/components/CustomizeCTA.responsive-v2.test.tsx (5 tests) 833ms + ✓ renders the section header using responsive font sizes from mobile text-2xl to desktop md:text-3xl 612ms + ✓ app/components/HeroSection.timezone-boundaries.test.tsx (5 tests) 711ms + ✓ 1. Renders the hero heading consistently when the system clock is normalized to UTC midnight 402ms + ✓ components/dashboard/ProfileOptimizerModal.test.tsx (5 tests) 751ms + ✓ calls onClose when close button is clicked 485ms + ✓ app/components/CustomizeCTA.timezone-boundaries.test.tsx (4 tests) 737ms + ✓ renders identical core UI in UTC timezone 496ms + ✓ components/dashboard/PRInsights/PRTrendChart.error-resilience.test.tsx (5 tests) 1103ms + ✓ 3. provides retry action on recovery panel 621ms + ✓ components/dashboard/ActivityLandscape.test.tsx (7 tests) 623ms + ✓ components/BrandParticles.responsive-breakpoints.test.tsx (5 tests) 816ms + ✓ handles isolated mounting clean inside a 375px mobile viewport configuration 341ms + ✓ app/components/HeroSection.theme-contrast.test.tsx (5 tests) 702ms + ✓ includes dark mode classes on interactive controls 418ms + ✓ components/dashboard/RefreshButton.mock-integrations.test.tsx (5 tests) 554ms + ✓ renders the button in idle state without triggering any async service call on mount 440ms + ✓ components/dashboard/ActivityLandscape.empty-fallback.test.tsx (5 tests) 678ms + ✓ renders successfully with an empty data array 586ms + ✓ app/api/og/route.accessibility.test.tsx (5 tests) 839ms + ✓ should have correct ARIA roles and accessible labels assigned 434ms + ✓ app/documentation/code-block.responsive-breakpoints.test.tsx (5 tests) 680ms + ✓ should ensure the code block wrapper utilizes responsive styles without hardcoded absolute clipping dimensions 368ms + ✓ app/customize/components/AdvancedSettingsPanel.empty-fallback.test.tsx (5 tests) 1143ms + ✓ handles zero grace days correctly 690ms + ✓ components/dashboard/RefreshButton.responsive-breakpoints.test.tsx (5 tests) 592ms + ✓ renders button element correctly 358ms + ✓ components/dashboard/ResumePreviewForm.empty-fallback.test.tsx (5 tests) 872ms + ✓ shows empty fallback input fields for missing profile values 462ms +stderr | components/dashboard/PRInsights/TopMetricsRow.responsive-breakpoints.test.tsx > TopMetricsRow responsive multi-device columns & mobile viewport layouts (Variation 7) > reflows into a single-column vertical layout on mobile-width viewports +React does not recognize the `whileHover` prop on a DOM element. If you intentionally want it to appear in the DOM as a custom attribute, spell it as lowercase `whilehover` instead. If you accidentally passed it from a parent component, remove it from the DOM element. +Unknown event handler property `onHoverStart`. It will be ignored. +Unknown event handler property `onHoverEnd`. It will be ignored. + + ✓ components/dashboard/PRInsights/TopMetricsRow.responsive-breakpoints.test.tsx (5 tests) 1167ms + ✓ reflows into a single-column vertical layout on mobile-width viewports 373ms + ✓ app/template.error-resilience.test.tsx (5 tests) 1529ms + ✓ Test 1: Hydration Stability - renders valid children without crashing 422ms + ✓ Test 5: Reset/Reload Paths - ensures user reset/reload paths are available on recovery panels and functioning 885ms + ✓ app/not-found.empty-fallback.test.tsx (5 tests) 2745ms + ✓ renders successfully with default empty layout state and correct header 1999ms + ✓ app/generator/components/sections/CommitPulseSection.empty-fallback.test.tsx (5 tests) 1706ms + ✓ renders successfully with empty parameters and handles missing properties defensively 426ms + ✓ falls back to transparent preview background when accent color hex is invalid or empty 903ms + ✓ components/dashboard/PRInsights/ReviewAnalytics.error-resilience.test.tsx (5 tests) 2392ms + ✓ Test 1: boundary catches exception inside ReviewAnalytics and prevents page crash 431ms + ✓ Test 3: renders clean error recovery UI with role="alert" when analytics throws 1400ms + ✓ components/dashboard/ProfileCard.type-compiler.test.tsx (5 tests) 616ms + ✓ components/dashboard/CommitClock.mouse-interactivity.test.tsx (5 tests) 1881ms + ✓ shows tooltip on mouse enter 836ms + ✓ hides tooltip on mouse leave 302ms + ✓ shows and hides tooltip on focus and blur 333ms +stderr | components/DiscordButton.mouse-interactivity.test.tsx > DiscordButton - Interactive Tooltips, Cursor Hovers & Touch Event Propagation > fires mouseleave on the anchor without throwing and confirms GSAP reset is attempted +An update to DiscordButton inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act + + ✓ components/DiscordButton.mouse-interactivity.test.tsx (5 tests) 1410ms + ✓ renders the anchor element with the correct Discord href and external link attributes 1080ms + ✓ components/dashboard/LanguageChart.type-compiler.test.tsx (5 tests) 1285ms + ✓ renders the "Top Languages" heading for both empty and populated data 495ms + ✓ renders the donut chart with the correct aria-label for the top language 656ms +stderr | components/dashboard/ProfileCard.error-resilience.test.tsx > ProfileCard: Hydration Stability, Exception Safety & Error Fallbacks > Test 3: should assert that target modules render a clean error recovery UI instead of crashing the site +TypeError: Cannot read properties of null (reading 'repositories') + at ProfileCard (/home/atulupadhyay/Contribution/commitpulse/components/dashboard/ProfileCard.tsx:181:35) + at Object.react_stack_bottom_frame (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:25904:20) + at renderWithHooks (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:7662:22) + at updateFunctionComponent (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:10166:19) + at beginWork (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:11778:18) + at runWithFiberInDEV (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:874:13) + at performUnitOfWork (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:17641:22) + at workLoopSync (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:17469:41) + at renderRootSync (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:17450:11) + at performWorkOnRoot (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:16583:35) { + [stack]: [Getter/Setter], + [message]: "Cannot read properties of null (reading 'repositories')" +} + +The above error occurred in the <ProfileCard> component. + +React will try to recreate this component tree from scratch using the error boundary you provided, MockErrorBoundary. + +Telemetry Error Logged: Cannot read properties of null (reading 'repositories') + + ✓ app/layout.error-resilience.test.tsx (5 tests) 797ms + ✓ Test 5: Reset/Reload Paths - ensures user reset/reload paths are available on recovery panels and functioning 426ms +stderr | app/(root)/dashboard/error.error-resilience.test.tsx > DashboardError - error resilience > renders generic error state +Error: Something went wrong + at /home/atulupadhyay/Contribution/commitpulse/app/(root)/dashboard/error.error-resilience.test.tsx:33:35 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:302:11 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:1903:26 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2326:20 + at new Promise (<anonymous>) + at runWithCancel (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2323:10) + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2305:20 + at new Promise (<anonymous>) + at runWithTimeout (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2272:10) + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2955:64 + +stderr | app/(root)/dashboard/error.error-resilience.test.tsx > DashboardError - error resilience > renders rate limit UI when API limit error occurs +Error: API limit exceeded + at /home/atulupadhyay/Contribution/commitpulse/app/(root)/dashboard/error.error-resilience.test.tsx:44:35 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:302:11 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:1903:26 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2326:20 + at new Promise (<anonymous>) + at runWithCancel (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2323:10) + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2305:20 + at new Promise (<anonymous>) + at runWithTimeout (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2272:10) + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2955:64 + +stderr | app/(root)/dashboard/error.error-resilience.test.tsx > DashboardError - error resilience > renders not found UI when user is missing +Error: User not found + at /home/atulupadhyay/Contribution/commitpulse/app/(root)/dashboard/error.error-resilience.test.tsx:52:35 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:302:11 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:1903:26 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2326:20 + at new Promise (<anonymous>) + at runWithCancel (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2323:10) + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2305:20 + at new Promise (<anonymous>) + at runWithTimeout (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2272:10) + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2955:64 + +stderr | app/(root)/dashboard/error.error-resilience.test.tsx > DashboardError - error resilience > calls reset when Try again is clicked +Error: Something went wrong + at /home/atulupadhyay/Contribution/commitpulse/app/(root)/dashboard/error.error-resilience.test.tsx:60:35 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:302:11 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:1903:26 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2326:20 + at new Promise (<anonymous>) + at runWithCancel (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2323:10) + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2305:20 + at new Promise (<anonymous>) + at runWithTimeout (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2272:10) + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2955:64 + +stderr | app/(root)/dashboard/error.error-resilience.test.tsx > DashboardError - error resilience > logs error to logger on render +Error: Crash test + at /home/atulupadhyay/Contribution/commitpulse/app/(root)/dashboard/error.error-resilience.test.tsx:69:17 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:302:11 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:1903:26 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2326:20 + at new Promise (<anonymous>) + at runWithCancel (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2323:10) + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2305:20 + at new Promise (<anonymous>) + at runWithTimeout (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2272:10) + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2955:64 + + ✓ app/(root)/dashboard/error.error-resilience.test.tsx (5 tests) 553ms + ✓ renders generic error state 472ms +stderr | components/dashboard/ProfileCard.error-resilience.test.tsx > ProfileCard: Hydration Stability, Exception Safety & Error Fallbacks > Test 5: should ensure user reset/reload paths are available on the recovery panels +TypeError: Cannot read properties of undefined (reading 'username') + at ProfileCard (/home/atulupadhyay/Contribution/commitpulse/components/dashboard/ProfileCard.tsx:67:12) + at Object.react_stack_bottom_frame (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:25904:20) + at renderWithHooks (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:7662:22) + at updateFunctionComponent (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:10166:19) + at beginWork (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:11778:18) + at runWithFiberInDEV (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:874:13) + at performUnitOfWork (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:17641:22) + at workLoopSync (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:17469:41) + at renderRootSync (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:17450:11) + at performWorkOnRoot (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:16583:35) { + [stack]: [Getter/Setter], + [message]: "Cannot read properties of undefined (reading 'username')" +} + +The above error occurred in the <ProfileCard> component. + +React will try to recreate this component tree from scratch using the error boundary you provided, MockErrorBoundary. + +Telemetry Error Logged: Cannot read properties of undefined (reading 'username') + + ✓ components/dashboard/ProfileCard.error-resilience.test.tsx (5 tests) 794ms + ✓ Test 5: should ensure user reset/reload paths are available on the recovery panels 427ms + ✓ components/ShareButtons.accessibility.test.tsx (5 tests) 638ms + ✓ provides an accessible label for the LinkedIn share link 451ms + ✓ app/components/theme-switch.timezone-boundaries.test.tsx (5 tests) 703ms + ✓ renders theme toggle button successfully in UTC timezone 494ms + ✓ app/customize/components/AdvancedSettingsPanel.responsive-breakpoints.test.tsx (5 tests) 633ms + ✓ renders correctly on a mobile viewport (375px) 371ms + ✓ app/customize/page.keyboard.test.tsx (5 tests) 547ms + ✓ components/dashboard/tooltipUtils.mouse-interactivity.test.ts (5 tests) 574ms + ✓ Case 2: verifies that responsive tooltip layouts display at computed coordinates 307ms + ✓ app/components/SuccessGuide.accessibility.test.tsx (5 tests) 510ms + ✓ renders as a named region landmark linked to h2 via aria-labelledby 369ms + ✓ app/(root)/dashboard/error.timezone-boundaries.test.tsx (5 tests) 1035ms + ✓ Case 2: Validate grid stability over leap year boundaries (e.g., February 29th) ensuring calendar utilities referenced by the error block parse dates cleanly with zero gaps or structural offset slips 619ms + ✓ app/generator/components/PreviewPanel.empty-fallback.test.tsx (5 tests) 612ms + ✓ components/DiscordButton.type-compiler.test.tsx (5 tests) 773ms + ✓ compiles and renders without error 615ms + ✓ app/contributors/loading.accessibility.test.tsx (5 tests) 620ms + ✓ exposes the loading state through a screen-reader status region 485ms + ✓ app/compare/CompareClient.error-resilience.test.tsx (5 tests) 787ms + ✓ Test 5: should ensure user reset/reload paths are available on the recovery panels 585ms + ✓ app/generator/components/sections/TechnologyGraph.timezone-boundaries.test.tsx (5 tests) 766ms + ✓ 1. renders successfully with mocked timezone offset configurations 376ms + ✓ app/generator/components/sections/DescriptionSection.theme-contrast.test.tsx (5 tests) 712ms + ✓ ensures text remains visible in light mode (contrast proxy check) 350ms + ✓ app/contributors/ContributorsSearch.accessibility.test.tsx (5 tests) 799ms + ✓ uses correct accessible label coordinates on search input (aria-label) 504ms + ✓ components/InteractiveViewer.responsive-breakpoints.test.tsx (5 tests) 846ms + ✓ 1. renders correctly on mobile viewport 380ms + ✓ 3. uses flex layout without clipping content 311ms + ✓ components/KeyboardShortcutsModal.empty-fallback.test.tsx (8 tests) 647ms + ✓ transitions from hidden to visible when isOpen changes from false to true 341ms + ✓ app/components/FeatureCard.empty-fallback.test.tsx (5 tests) 579ms + ✓ renders successfully with empty parameter fields and handles empty/null icon 462ms + ✓ components/dashboard/ResumePreviewForm.responsive-breakpoints.test.tsx (5 tests) 770ms + ✓ allows adding skills on mobile viewport 509ms + ✓ app/generator/components/SectionCard.theme-contrast.test.tsx (6 tests) 542ms + ✓ toggles content visibility when the header button is clicked 307ms + ✓ components/dashboard/GrowthTrendChart.mock-integrations.test.tsx (5 tests) 287ms + ✓ app/documentation/code-block.mock-integrations.test.tsx (5 tests) 671ms + ✓ calls the clipboard service with the provided code 395ms + ✓ components/dashboard/RefreshButton.theme-contrast.test.tsx (5 tests) 582ms + ✓ applies dark mode border contrast styling 454ms + ✓ lib/githubtoken.test.ts (3 tests) 380ms + ✓ components/InteractiveViewer.empty-fallback.test.tsx (5 tests) 1130ms + ✓ renders successfully with null children 952ms + ✓ components/dashboard/GithubWrapped.responsive-breakpoints.test.tsx (5 tests) 428ms + ✓ app/contributors/loading.theme-contrast.test.tsx (5 tests) 887ms + ✓ renders an accessible loading status 641ms +stderr | components/dashboard/PRInsights/TopMetricsRow.empty-fallback.test.tsx > TopMetricsRow Empty/Missing Inputs Verification > renders successfully with zero-value metrics without crashing +React does not recognize the `whileHover` prop on a DOM element. If you intentionally want it to appear in the DOM as a custom attribute, spell it as lowercase `whilehover` instead. If you accidentally passed it from a parent component, remove it from the DOM element. +Unknown event handler property `onHoverStart`. It will be ignored. +Unknown event handler property `onHoverEnd`. It will be ignored. + + ✓ components/dashboard/VisualizationTooltip.mouse-interactivity.test.tsx (5 tests) 900ms + ✓ 1. triggers simulated mouseenter/hover gestures and maps to state 695ms + ✓ components/dashboard/PRInsights/TopMetricsRow.empty-fallback.test.tsx (5 tests) 689ms + ✓ renders successfully with zero-value metrics without crashing 385ms + ✓ components/ShareButtons.mouse-interactivity.test.tsx (5 tests) 397ms +stderr | app/(root)/dashboard/error.theme-contrast.test.tsx > DashboardError Theme Contrast > renders correctly in light mode +Error: test error + at /home/atulupadhyay/Contribution/commitpulse/app/(root)/dashboard/error.theme-contrast.test.tsx:26:35 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:302:11 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:1903:26 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2326:20 + at new Promise (<anonymous>) + at runWithCancel (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2323:10) + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2305:20 + at new Promise (<anonymous>) + at runWithTimeout (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2272:10) + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2955:64 +[ERROR] Dashboard error {"error":{}} + +stderr | app/(root)/dashboard/error.theme-contrast.test.tsx > DashboardError Theme Contrast > renders correctly in dark mode +Error: test error + at /home/atulupadhyay/Contribution/commitpulse/app/(root)/dashboard/error.theme-contrast.test.tsx:34:35 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:302:11 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:1903:26 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2326:20 + at new Promise (<anonymous>) + at runWithCancel (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2323:10) + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2305:20 + at new Promise (<anonymous>) + at runWithTimeout (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2272:10) + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2955:64 +[ERROR] Dashboard error {"error":{}} + +stderr | app/(root)/dashboard/error.theme-contrast.test.tsx > DashboardError Theme Contrast > contains light and dark theme container classes +Error: test error + at /home/atulupadhyay/Contribution/commitpulse/app/(root)/dashboard/error.theme-contrast.test.tsx:41:30 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:302:11 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:1903:26 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2326:20 + at new Promise (<anonymous>) + at runWithCancel (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2323:10) + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2305:20 + at new Promise (<anonymous>) + at runWithTimeout (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2272:10) + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2955:64 +[ERROR] Dashboard error {"error":{}} + +stderr | app/(root)/dashboard/error.theme-contrast.test.tsx > DashboardError Theme Contrast > contains contrast-aware heading and description text classes +Error: test error + at /home/atulupadhyay/Contribution/commitpulse/app/(root)/dashboard/error.theme-contrast.test.tsx:54:30 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:302:11 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:1903:26 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2326:20 + at new Promise (<anonymous>) + at runWithCancel (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2323:10) + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2305:20 + at new Promise (<anonymous>) + at runWithTimeout (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2272:10) + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2955:64 +[ERROR] Dashboard error {"error":{}} + +stderr | app/(root)/dashboard/error.theme-contrast.test.tsx > DashboardError Theme Contrast > preserves button contrast classes across themes +Error: test error + at /home/atulupadhyay/Contribution/commitpulse/app/(root)/dashboard/error.theme-contrast.test.tsx:70:35 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:302:11 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:1903:26 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2326:20 + at new Promise (<anonymous>) + at runWithCancel (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2323:10) + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2305:20 + at new Promise (<anonymous>) + at runWithTimeout (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2272:10) + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2955:64 +[ERROR] Dashboard error {"error":{}} + + ✓ app/(root)/dashboard/error.theme-contrast.test.tsx (5 tests) 828ms + ✓ renders correctly in light mode 581ms + ✓ components/dashboard/RepositoryGraph.error-resilience.test.tsx (5 tests) 393ms +stderr | components/ReturnToTop.test.tsx > ReturnToTop > renders button with aria-label when visible +React does not recognize the `whileHover` prop on a DOM element. If you intentionally want it to appear in the DOM as a custom attribute, spell it as lowercase `whilehover` instead. If you accidentally passed it from a parent component, remove it from the DOM element. +React does not recognize the `whileTap` prop on a DOM element. If you intentionally want it to appear in the DOM as a custom attribute, spell it as lowercase `whiletap` instead. If you accidentally passed it from a parent component, remove it from the DOM element. + + ✓ components/GithubAuthButton.test.tsx (5 tests) 719ms + ✓ renders "Sign in with GitHub" when there is no session 509ms + ✓ components/ReturnToTop.test.tsx (6 tests) 1077ms + ✓ renders button with aria-label when visible 852ms + ✓ app/components/navbar.mock-integrations.test.tsx (2 tests) 524ms + ✓ visually disables the language selector while a translation service change is pending 338ms + ✓ app/components/theme-switch.theme-contrast.test.tsx (5 tests) 643ms + ✓ renders toggle button in light theme environment 431ms + ✓ app/not-found.timezone-boundaries.test.tsx (5 tests) 1047ms + ✓ Mock standard timezone settings (e.g., UTC, EST, IST, and JST) 353ms + ✓ Assert calendar date format utility outputs match expectations in each locale 502ms + ✓ lib/cache.theme-contrast.test.ts (2 tests) 575ms + ✓ ensures theme toggle button remains visible in light mode (contrast proxy check) 507ms + ✓ components/dashboard/StatsCard.theme-contrast.test.tsx (5 tests) 681ms + ✓ 5. ensures that background overlays do not clip foreground content colors 484ms + ✓ app/contributors/loading.test.tsx (5 tests) 481ms + ✓ renders loading fallback component 414ms +stderr | components/dashboard/PRInsights/TopMetricsRow.mock-integrations.test.tsx > TopMetricsRow & PRInsights Service Mock Integrations > loads and renders metric values correctly using mocked service layer data +React does not recognize the `whileHover` prop on a DOM element. If you intentionally want it to appear in the DOM as a custom attribute, spell it as lowercase `whilehover` instead. If you accidentally passed it from a parent component, remove it from the DOM element. +Unknown event handler property `onHoverStart`. It will be ignored. +Unknown event handler property `onHoverEnd`. It will be ignored. + + ✓ components/dashboard/PRInsights/TopMetricsRow.mock-integrations.test.tsx (5 tests) 345ms + ✓ components/FeatureCards.theme-contrast.test.tsx (5 tests) 562ms + ✓ maintains heading visibility across themes 370ms + ✓ app/components/theme-switch.accessibility.test.tsx (5 tests) 762ms + ✓ 1. correctly uses accessible label coordinates (aria-label/role) 475ms + ✓ components/dashboard/DashboardSkeleton.error-resilience.test.tsx (5 tests) 647ms + ✓ error boundary catches a thrown exception from AIInsightsSkeleton and exposes the reload path 437ms +stderr | components/dashboard/CommitClock.error-resilience.test.tsx > CommitClock Error Resilience > renders safely with empty data +React does not recognize the `whileInView` prop on a DOM element. If you intentionally want it to appear in the DOM as a custom attribute, spell it as lowercase `whileinview` instead. If you accidentally passed it from a parent component, remove it from the DOM element. + + ✓ components/dashboard/CommitClock.error-resilience.test.tsx (5 tests) 671ms + ✓ renders all weekday spokes without runtime failures 465ms + ✓ app/customize/components/SectionLabel.theme-contrast.test.tsx (5 tests) 371ms + ✓ app/generator/components/sections/CommitPulseSection.error-resilience.test.tsx (5 tests) 838ms + ✓ 5. Recovery UI: attempts recovery properly upon user interaction 356ms + ✓ components/CherryBlossom.test.tsx (5 tests) 515ms + ✓ components/dashboard/PRInsights/PRStatusDistribution.mock-integrations.test.tsx (5 tests) 725ms + ✓ Test 1: should mock standard asynchronous service-layer imports and database/fetch retrieval successfully 519ms + ✓ components/dashboard/AIInsightsSkeleton.error-resilience.test.tsx (5 tests) 793ms + ✓ should render clean accessible containers matching standard accessibility trees 579ms + ✓ app/customize/components/ExportPanel.responsive-breakpoints.test.tsx (4 tests) 263ms + ✓ app/api/streak/png/route.mouse-interactivity.test.tsx (5 tests) 605ms + ✓ 1. triggers simulated mouseenter/hover gestures on active segments 387ms + ✓ components/dashboard/ResumeUpload.mouse-interactivity.test.tsx (5 tests) 705ms + ✓ opens file picker when upload dropzone is clicked 415ms + ✓ app/generator/components/sections/DescriptionSection.empty-fallback.test.tsx (5 tests) 545ms + ✓ displays placeholder text and empty value in the empty state 360ms + ✓ components/GithubAuthButton.accessibility.test.tsx (6 tests) 693ms + ✓ renders a native <button> element — keyboard and screen reader accessible by default 559ms + ✓ components/dashboard/ResumeUpload.mock-integrations.test.tsx (5 tests) 328ms + ✓ components/TopRivalriesTicker.mouse-interactivity.test.tsx (5 tests) 651ms + ✓ applies pointer cursor styling to rivalry items 361ms +stderr | app/components/FeatureCard.responsive-breakpoint.test.tsx > FeatureCard Responsive Breakpoints & Mobile Viewport Layouts > 1. renders the feature card with article semantics and accessible labels +React does not recognize the `whileHover` prop on a DOM element. If you intentionally want it to appear in the DOM as a custom attribute, spell it as lowercase `whilehover` instead. If you accidentally passed it from a parent component, remove it from the DOM element. + +stderr | components/dashboard/GrowthTrendChart.mouse-interactivity.test.tsx > GrowthTrendChart mouse interactivity > handles mouse enter events without crashing +React does not recognize the `whileInView` prop on a DOM element. If you intentionally want it to appear in the DOM as a custom attribute, spell it as lowercase `whileinview` instead. If you accidentally passed it from a parent component, remove it from the DOM element. + + ✓ app/components/FeatureCard.responsive-breakpoint.test.tsx (5 tests) 920ms + ✓ 1. renders the feature card with article semantics and accessible labels 718ms + ✓ components/dashboard/GrowthTrendChart.mouse-interactivity.test.tsx (5 tests) 652ms + ✓ handles mouse enter events without crashing 396ms + ✓ components/dashboard/RefreshButton.accessibility.test.tsx (5 tests) 442ms + ✓ components/dashboard/ResumeUpload.responsive-breakpoints.test.tsx (5 tests) 610ms + ✓ supports narrow mobile widths without crashing 354ms + ✓ components/FeatureCards.accessibility.test.tsx (5 tests) 804ms + ✓ renders the primary section heading 643ms + ✓ app/(root)/dashboard/layout.empty-fallback.test.tsx (5 tests) 460ms + ✓ renders safely with null children 378ms + ✓ components/dashboard/Achievements.error-resilience.test.tsx (5 tests) 424ms + ✓ app/components/CopyRepoButton.empty-fallback.test.tsx (5 tests) 570ms + ✓ renders safely without props 477ms + ✓ app/components/CopyRepoButton.theme-contrast.test.tsx (5 tests) 507ms + ✓ includes light mode background and border contrast classes 382ms + ✓ components/ReturnToTop.responsive-breakpoints.test.tsx (5 tests) 603ms + ✓ uses standard mobile media coordinates and edge-safe positioning 486ms +stderr | components/dashboard/ResumeProfileSection.error-resilience.test.tsx > ResumeProfileSection Error Resilience > renders a clean recovery panel when ResumeUpload throws during render +Error: ResumeUpload render failure + at StubResumeUpload (/home/atulupadhyay/Contribution/commitpulse/components/dashboard/ResumeProfileSection.error-resilience.test.tsx:39:13) + at Object.react_stack_bottom_frame (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:25904:20) + at renderWithHooks (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:7662:22) + at updateFunctionComponent (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:10166:19) + at beginWork (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:11778:18) + at runWithFiberInDEV (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:874:13) + at performUnitOfWork (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:17641:22) + at workLoopSync (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:17469:41) + at renderRootSync (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:17450:11) + at performWorkOnRoot (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:16583:35) { + [stack]: [Getter/Setter], + [message]: 'ResumeUpload render failure' +} + +The above error occurred in the <StubResumeUpload> component. + +React will try to recreate this component tree from scratch using the error boundary you provided, TestErrorBoundary. + + +stderr | components/dashboard/ResumeProfileSection.error-resilience.test.tsx > ResumeProfileSection Error Resilience > renders a clean recovery panel when ResumeUpload throws during render +Error: ResumeUpload render failure + at StubResumeUpload (/home/atulupadhyay/Contribution/commitpulse/components/dashboard/ResumeProfileSection.error-resilience.test.tsx:39:13) + at Object.react_stack_bottom_frame (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:25904:20) + at renderWithHooks (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:7662:22) + at updateFunctionComponent (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:10166:19) + at beginWork (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:11778:18) + at runWithFiberInDEV (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:874:13) + at performUnitOfWork (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:17641:22) + at workLoopSync (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:17469:41) + at renderRootSync (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:17450:11) + at performWorkOnRoot (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:16583:35) { + [stack]: [Getter/Setter], + [message]: 'ResumeUpload render failure' +} + +The above error occurred in the <StubResumeUpload> component. + +React will try to recreate this component tree from scratch using the error boundary you provided, TestErrorBoundary. + + +stderr | components/dashboard/ResumeProfileSection.error-resilience.test.tsx > ResumeProfileSection Error Resilience > captures preview rendering failures and surfaces telemetry +Error: ResumePreviewForm render failure + at StubResumePreviewForm (/home/atulupadhyay/Contribution/commitpulse/components/dashboard/ResumeProfileSection.error-resilience.test.tsx:88:13) + at Object.react_stack_bottom_frame (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:25904:20) + at renderWithHooks (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:7662:22) + at updateFunctionComponent (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:10166:19) + at beginWork (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:11778:18) + at runWithFiberInDEV (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:874:13) + at performUnitOfWork (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:17641:22) + at workLoopSync (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:17469:41) + at renderRootSync (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:17450:11) + at performWorkOnRoot (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:16583:35) { + [stack]: [Getter/Setter], + [message]: 'ResumePreviewForm render failure' +} + +The above error occurred in the <StubResumePreviewForm> component. + +React will try to recreate this component tree from scratch using the error boundary you provided, TestErrorBoundary. + + +stderr | components/dashboard/ResumeProfileSection.error-resilience.test.tsx > ResumeProfileSection Error Resilience > logs database connectivity style errors and still recovers to a stable UI +Error: Database connectivity error + at /home/atulupadhyay/Contribution/commitpulse/components/dashboard/ResumeProfileSection.error-resilience.test.tsx:45:15 + at Object.react_stack_bottom_frame (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:25989:20) + at runWithFiberInDEV (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:874:13) + at commitHookEffectListMount (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:13249:29) + at commitHookPassiveMountEffects (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:13336:11) + at commitPassiveMountOnFiber (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:15484:13) + at recursivelyTraversePassiveMountEffects (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:15439:11) + at commitPassiveMountOnFiber (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:15718:11) + at recursivelyTraversePassiveMountEffects (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:15439:11) + at commitPassiveMountOnFiber (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:15476:11) { + [stack]: [Getter/Setter], + [message]: 'Database connectivity error' +} + +The above error occurred in the <StubResumeUpload> component. + +React will try to recreate this component tree from scratch using the error boundary you provided, TestErrorBoundary. + + +stderr | components/dashboard/ResumeProfileSection.error-resilience.test.tsx > ResumeProfileSection Error Resilience > provides a visible reload path on the recovery panel +Error: ResumeUpload render failure + at StubResumeUpload (/home/atulupadhyay/Contribution/commitpulse/components/dashboard/ResumeProfileSection.error-resilience.test.tsx:39:13) + at Object.react_stack_bottom_frame (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:25904:20) + at renderWithHooks (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:7662:22) + at updateFunctionComponent (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:10166:19) + at beginWork (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:11778:18) + at runWithFiberInDEV (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:874:13) + at performUnitOfWork (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:17641:22) + at workLoopSync (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:17469:41) + at renderRootSync (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:17450:11) + at performWorkOnRoot (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:16583:35) { + [stack]: [Getter/Setter], + [message]: 'ResumeUpload render failure' +} + +The above error occurred in the <StubResumeUpload> component. + +React will try to recreate this component tree from scratch using the error boundary you provided, TestErrorBoundary. + + +stderr | components/dashboard/ResumeProfileSection.error-resilience.test.tsx > ResumeProfileSection Error Resilience > provides a visible reload path on the recovery panel +Error: ResumeUpload render failure + at StubResumeUpload (/home/atulupadhyay/Contribution/commitpulse/components/dashboard/ResumeProfileSection.error-resilience.test.tsx:39:13) + at Object.react_stack_bottom_frame (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:25904:20) + at renderWithHooks (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:7662:22) + at updateFunctionComponent (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:10166:19) + at beginWork (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:11778:18) + at runWithFiberInDEV (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:874:13) + at performUnitOfWork (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:17641:22) + at workLoopSync (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:17469:41) + at renderRootSync (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:17450:11) + at performWorkOnRoot (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:16583:35) { + [stack]: [Getter/Setter], + [message]: 'ResumeUpload render failure' +} + +The above error occurred in the <StubResumeUpload> component. + +React will try to recreate this component tree from scratch using the error boundary you provided, TestErrorBoundary. + + +stderr | components/dashboard/ResumeProfileSection.error-resilience.test.tsx > ResumeProfileSection Error Resilience > recovers on retry after a nested preview error and renders normal content again +Error: ResumePreviewForm render failure + at StubResumePreviewForm (/home/atulupadhyay/Contribution/commitpulse/components/dashboard/ResumeProfileSection.error-resilience.test.tsx:88:13) + at Object.react_stack_bottom_frame (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:25904:20) + at renderWithHooks (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:7662:22) + at updateFunctionComponent (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:10166:19) + at beginWork (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:11778:18) + at runWithFiberInDEV (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:874:13) + at performUnitOfWork (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:17641:22) + at workLoopSync (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:17469:41) + at renderRootSync (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:17450:11) + at performWorkOnRoot (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:16583:35) { + [stack]: [Getter/Setter], + [message]: 'ResumePreviewForm render failure' +} + +The above error occurred in the <StubResumePreviewForm> component. + +React will try to recreate this component tree from scratch using the error boundary you provided, TestErrorBoundary. + + + ✓ components/dashboard/ResumeProfileSection.error-resilience.test.tsx (5 tests) 632ms + ✓ renders a clean recovery panel when ResumeUpload throws during render 447ms + ✓ app/components/FeatureCard.mouse-interactivity.test.tsx (5 tests) 259ms + ✓ components/dashboard/PRInsights/PRStatusDistribution.error-resilience.test.tsx (5 tests) 742ms + ✓ 3. provides retry action on recovery panel 452ms + ✓ app/components/FeatureCard.timezone-boundaries.test.tsx (5 tests) 536ms + ✓ components/dashboard/GithubWrapped.empty-fallback.test.tsx (5 tests) 485ms +stderr | components/dashboard/Achievements.empty-fallback.test.tsx > Achievements - Empty/Missing Inputs > renders successfully with an empty achievements array +React does not recognize the `whileInView` prop on a DOM element. If you intentionally want it to appear in the DOM as a custom attribute, spell it as lowercase `whileinview` instead. If you accidentally passed it from a parent component, remove it from the DOM element. + + ✓ app/components/CustomizeCTA.accessibility.test.tsx (5 tests) 725ms + ✓ renders the primary heading for screen readers 501ms + ✓ components/dashboard/Achievements.empty-fallback.test.tsx (5 tests) 548ms + ✓ renders toggle button when achievements exceed four items 394ms + ✓ components/dashboard/LanguageChart.test.tsx (2 tests) 189ms + ✓ components/dashboard/PRInsights/PRStatusDistribution.responsive-breakpoints.test.tsx (5 tests) 484ms + ✓ 1. mocks standard mobile-width media coordinates (e.g. 375px wide viewports) 324ms + ✓ app/contributors/loading.mouse-interactivity.test.tsx (15 tests) 944ms + ✓ renders exactly one status landmark 580ms + ✓ app/components/CustomizeCTA.empty-fallback.test.tsx (5 tests) 603ms + ✓ renders CTA button even when translations are null-like 387ms + ✓ components/commitpulse-logo.error-resilience.test.tsx (5 tests) 636ms + ✓ provides a retry path and invokes reset handling 400ms + ✓ components/dashboard/RefreshButton.error-resilience.test.tsx (5 tests) 847ms + ✓ mounts cleanly without hydration errors when all hooks return baseline values 635ms +stdout | app/api/streak/tests/dateRange.test.ts > GET /api/streak dateRange parameter > returns 200 OK and SVG headers for a valid standard dateRange (from/to) +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"a4978ec6-279e-4360-85ff-fde66cec3bbf"} + + ✓ components/dashboard/LanguageChart.error-resilience.test.tsx (5 tests) 343ms +stdout | app/api/streak/tests/dateRange.test.ts > GET /api/streak dateRange parameter > returns 200 OK and SVG headers for a valid standard dateRange (from/to) +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":96,"requestId":"a4978ec6-279e-4360-85ff-fde66cec3bbf"} + +stdout | app/api/streak/tests/dateRange.test.ts > GET /api/streak dateRange parameter > applies custom dateRange and affects rendered month labels (body content changes) +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"0add5050-f8c3-4a5b-8b5f-412811da3eda"} + +stdout | app/api/streak/tests/dateRange.test.ts > GET /api/streak dateRange parameter > applies custom dateRange and affects rendered month labels (body content changes) +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"0add5050-f8c3-4a5b-8b5f-412811da3eda"} + +stdout | app/api/streak/tests/dateRange.test.ts > GET /api/streak dateRange parameter > omitted dateRange falls back to default parsing and still renders safely +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"81e88cbe-7a6f-498c-bcf1-1193f98465f4"} + +stdout | app/api/streak/tests/dateRange.test.ts > GET /api/streak dateRange parameter > omitted dateRange falls back to default parsing and still renders safely +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"81e88cbe-7a6f-498c-bcf1-1193f98465f4"} + +stdout | app/api/streak/tests/dateRange.test.ts > GET /api/streak dateRange parameter > invalid dateRange formats return a validation error without crashing +[INFO] Incoming streak request {"source":"streak","requestId":"c25934c2-4d3e-46be-9c2c-d0dbee35be9c"} + +stdout | app/api/streak/tests/dateRange.test.ts > GET /api/streak dateRange parameter > sets sensible Cache-Control and Content-Type headers for SVG output +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"0b95e326-a202-49cc-abef-7238484a8f23"} + +stdout | app/api/streak/tests/dateRange.test.ts > GET /api/streak dateRange parameter > sets sensible Cache-Control and Content-Type headers for SVG output +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"0b95e326-a202-49cc-abef-7238484a8f23"} + + ✓ app/api/streak/tests/dateRange.test.ts (5 tests) 541ms + ✓ returns 200 OK and SVG headers for a valid standard dateRange (from/to) 483ms + ✓ app/documentation/code-block.error-resilience.test.tsx (5 tests) 721ms + ✓ Test 5: should gracefully handle clipboard API rejection errors without crashing 350ms + ✓ app/contributors/ContributorsSearch.timezone-boundaries.test.tsx (5 tests) 576ms + ✓ mocks standard timezone settings (UTC, EST, IST, and JST) correctly 514ms +stderr | app/api/pr-insights/route.theme-contrast.test.ts > GET /api/pr-insights > returns 500 with the error message when fetchPRInsights throws an Error +Error fetching PR insights: Error: GitHub API error + at /home/atulupadhyay/Contribution/commitpulse/app/api/pr-insights/route.theme-contrast.test.ts:102:50 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:302:11 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:1903:26 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2326:20 + at new Promise (<anonymous>) + at runWithCancel (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2323:10) + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2305:20 + at new Promise (<anonymous>) + at runWithTimeout (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2272:10) + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2955:64 + +stderr | app/api/pr-insights/route.theme-contrast.test.ts > GET /api/pr-insights > returns 500 with a generic message when fetchPRInsights throws a non-Error value +Error fetching PR insights: unexpected failure + + ✓ app/api/pr-insights/route.theme-contrast.test.ts (7 tests) 94ms + ✓ app/(root)/dashboard/layout.accessibility.test.tsx (5 tests) 765ms + ✓ renders the main landmark element 594ms + ✓ app/contributors/loading.timezone-boundaries.test.tsx (5 tests) 603ms + ✓ renders loading elements timezone-agnostically across UTC, EST, IST, and JST 552ms + ✓ components/dashboard/UnifiedIntelligenceCenter.test.tsx (4 tests) 201ms + ✓ components/dashboard/VisualizationTooltip.empty-fallback.test.tsx (5 tests) 684ms + ✓ renders without runtime errors when children is null 553ms + ✓ hooks/useDebounce.mouse-interactivity.test.tsx (5 tests) 526ms + ✓ shows tooltip after mouseenter debounce delay 373ms + ✓ components/CherryBlossom.theme-contrast.test.tsx (5 tests) 400ms + ✓ app/generator/components/sections/NameSection.mock-integrations.test.tsx (5 tests) 197ms +stderr | components/dashboard/AIInsights.theme-contrast.test.tsx > AIInsights - Theme Contrast & Visual Cohesion > renders correctly in light theme with proper structure +React does not recognize the `whileInView` prop on a DOM element. If you intentionally want it to appear in the DOM as a custom attribute, spell it as lowercase `whileinview` instead. If you accidentally passed it from a parent component, remove it from the DOM element. + + ✓ components/dashboard/AIInsights.theme-contrast.test.tsx (5 tests) 430ms +stderr | components/dashboard/RadarChart.timezone-boundaries.test.tsx > RadarChart timezone boundaries > limits displayed axes to maximum 6 languages +React does not recognize the `whileInView` prop on a DOM element. If you intentionally want it to appear in the DOM as a custom attribute, spell it as lowercase `whileinview` instead. If you accidentally passed it from a parent component, remove it from the DOM element. + + ✓ components/dashboard/RadarChart.timezone-boundaries.test.tsx (5 tests) 249ms + ✓ components/dashboard/PRInsights/TopMetricsRow.mouse-interactivity.test.tsx (5 tests) 407ms + ✓ app/generator/components/SectionCard.error-resilience.test.tsx (5 tests) 190ms + ✓ components/dashboard/Achievements.test.tsx (8 tests) 545ms + ✓ components/dashboard/ContributionCity3D.mock-integration.test.tsx (10 tests) 577ms + ✓ components/dashboard/AIInsightsSkeleton.responsive-breakpoints.test.tsx (5 tests) 709ms + ✓ renders correctly when window.innerWidth is stubbed to a mobile viewport of 375px 517ms + ✓ components/AnimatedCursor.error-resilience.test.tsx (5 tests) 358ms +stderr | src/utils/__tests__/graphqlSync.test.ts > GraphQL Syncing Utility Integration Tests > should successfully intercept network calls and return mocked contribution data +[CommitPulse API] Empty profile or null repository nodes discovered for user "attardekhushi78-cpu". Falling back to baseline collection. + + ✓ src/utils/__tests__/graphqlSync.test.ts (2 tests) 576ms + ✓ should gracefully handle unexpected GitHub API rate limits or network issues 509ms + ✓ app/(root)/dashboard/layout.timezone-boundaries.test.tsx (2 tests) 730ms + ✓ maintains structural integrity across varying timezones 699ms + ✓ app/components/FeatureCard.type-compiler.test.tsx (5 tests) 507ms + ✓ 5. asserts that runtime parsing fallbacks handle missing attributes safely and complete standard mounting cycles 487ms + ✓ components/dashboard/GithubWrapped.mouse-interactivity.test.tsx (5 tests) 414ms +stderr | components/dashboard/AIInsights.accessibility.test.tsx > AIInsights Accessibility > renders a semantic heading for screen readers +React does not recognize the `whileInView` prop on a DOM element. If you intentionally want it to appear in the DOM as a custom attribute, spell it as lowercase `whileinview` instead. If you accidentally passed it from a parent component, remove it from the DOM element. + + ✓ components/dashboard/AIInsights.accessibility.test.tsx (5 tests) 505ms + ✓ renders a semantic heading for screen readers 411ms + ✓ components/AnimatedCursor.mock-integrations.test.tsx (5 tests) 443ms + ✓ components/dashboard/VisualizationTooltip.timezone-boundaries.test.tsx (5 tests) 249ms + ✓ components/dashboard/DeploymentTracker.timezone-boundaries.test.tsx (12 tests) 755ms + ✓ components/ReturnToTop.empty-fallback.test.tsx (5 tests) 668ms + ✓ becomes visible when scroll position exceeds the visibility threshold 448ms + ✓ components/dashboard/ResumeProfileSection.mock-integrations.test.tsx (5 tests) 282ms +stderr | components/Leaderboard.mock-integrations.test.tsx > Leaderboard mock integrations > renders contributor data from mocked local input without network calls +React does not recognize the `whileInView` prop on a DOM element. If you intentionally want it to appear in the DOM as a custom attribute, spell it as lowercase `whileinview` instead. If you accidentally passed it from a parent component, remove it from the DOM element. +React does not recognize the `whileHover` prop on a DOM element. If you intentionally want it to appear in the DOM as a custom attribute, spell it as lowercase `whilehover` instead. If you accidentally passed it from a parent component, remove it from the DOM element. + + ✓ app/contributors/loading.mock-integrations.test.tsx (5 tests) 590ms + ✓ tests service loading paths to ensure pending state overlays render 472ms + ✓ components/Leaderboard.mock-integrations.test.tsx (5 tests) 535ms + ✓ renders contributor data from mocked local input without network calls 326ms +stderr | app/layout.accessibility.test.tsx > Layout Accessibility Standards & Screen Reader Compliance > Case 1: renders children content inside the layout structure +In HTML, <html> cannot be a child of <div>. +This will cause a hydration error. + + ✓ components/dashboard/RepositoryGraph.responsive-breakpoints.test.tsx (5 tests) 368ms + ✓ app/layout.accessibility.test.tsx (5 tests) 956ms + ✓ Case 2: exposes a semantic navigation landmark 419ms + ✓ app/template.responsive-breakpoints.test.tsx (5 tests) 784ms + ✓ Case 4: Asserts mobile-specific toggle states respond cleanly 643ms + ✓ components/dashboard/PRInsights/Highlights.mouse-interactivity.test.tsx (5 tests) 454ms + ✓ components/dashboard/CollaborationIntelligenceHub.test.tsx (2 tests) 559ms + ✓ renders title correctly 482ms + ✓ models/Notification.theme-contrast.test.ts (5 tests) 237ms +stderr | app/components/FeatureCard.accessibility.test.tsx > FeatureCard — Accessibility & Screen Reader Compliance > renders card as an article landmark labeled by its heading +React does not recognize the `whileHover` prop on a DOM element. If you intentionally want it to appear in the DOM as a custom attribute, spell it as lowercase `whilehover` instead. If you accidentally passed it from a parent component, remove it from the DOM element. + + ✓ app/components/FeatureCard.accessibility.test.tsx (5 tests) 1798ms + ✓ renders card as an article landmark labeled by its heading 1263ms + ✓ hooks/useShareActions.mouse-interactivity.test.ts (5 tests) 1547ms + ✓ triggers simulated mouseenter/hover gestures on active segments or interactive nodes 490ms + ✓ verifies that responsive tooltip layouts display at computed coordinates 453ms + ✓ tests custom click/touch gestures and ensures click events propagate correctly to the underlying handler 314ms +stderr | components/dashboard/StatsCard.test.tsx > StatsCard > should render the title prop text +React does not recognize the `whileInView` prop on a DOM element. If you intentionally want it to appear in the DOM as a custom attribute, spell it as lowercase `whileinview` instead. If you accidentally passed it from a parent component, remove it from the DOM element. +React does not recognize the `whileHover` prop on a DOM element. If you intentionally want it to appear in the DOM as a custom attribute, spell it as lowercase `whilehover` instead. If you accidentally passed it from a parent component, remove it from the DOM element. + + ✓ components/dashboard/StatsCard.test.tsx (7 tests) 973ms + ✓ should render the title prop text 621ms + ✓ components/dashboard/AchievementsSkeleton.error-resilience.test.tsx (5 tests) 450ms + ✓ app/template.mouse-interactivity.test.tsx (5 tests) 437ms + ✓ components/dashboard/DashboardSkeleton.theme-contrast.test.tsx (5 tests) 1711ms + ✓ 1. should emulate both dark and light presets 311ms + ✓ 5. should ensure that background overlays do not clip foreground content colors 1222ms + ✓ components/TopRivalriesTicker.responsive-breakpoints.test.tsx (5 tests) 1660ms + ✓ verifies presence of mobile-safe responsive layout classes in the main container markup 460ms + ✓ asserts mobile-specific typographic scaling: verifies text elements use compact mobile-safe font sizes to prevent layout blowout 471ms +stderr | lib/rate-limit.test.ts > rateLimit > Redis/KV integration > falls back to memory if fetch fails (non-ok response) +Rate limit KV error, falling back to memory + +stderr | lib/rate-limit.test.ts > rateLimit > Redis/KV integration > falls back to memory if fetch fails (non-ok response) +Rate limit KV error, falling back to memory + +stderr | lib/rate-limit.test.ts > rateLimit > Redis/KV integration > falls back to memory if fetch fails (non-ok response) +Rate limit KV error, falling back to memory + +stderr | lib/rate-limit.test.ts > rateLimit > Redis/KV integration > falls back to memory if fetch throws a network error +Rate limit KV error, falling back to memory + +stderr | lib/rate-limit.test.ts > rateLimit > Redis/KV integration > falls back to memory if fetch throws a network error +Rate limit KV error, falling back to memory + +stderr | lib/rate-limit.test.ts > rateLimit > Redis/KV integration > falls back to memory if fetch throws a network error +Rate limit KV error, falling back to memory + + ✓ lib/rate-limit.test.ts (30 tests) 176ms + ✓ components/DiscordButton.mock-integrations.test.tsx (5 tests) 689ms + ✓ renders integration link correctly 584ms + ✓ components/dashboard/ShareSheet.timezone-boundaries.test.tsx (5 tests) 559ms + ✓ components/CherryBlossom.mock-integrations.test.tsx (5 tests) 319ms + ✓ components/dashboard/StatsCardSkeleton.mouse-interactivity.test.tsx (5 tests) 661ms + ✓ triggers mouseenter and mouseleave on the skeleton container without errors 340ms +stderr | components/DiscordButton.empty-fallback.test.tsx > DiscordButton - Edge Cases & Empty/Missing Inputs > renders without crashing with no props +React does not recognize the `whileTap` prop on a DOM element. If you intentionally want it to appear in the DOM as a custom attribute, spell it as lowercase `whiletap` instead. If you accidentally passed it from a parent component, remove it from the DOM element. + + ✓ components/DiscordButton.empty-fallback.test.tsx (5 tests) 259ms + ✓ app/components/CopyRepoButton.responsive-breakpoints.test.tsx (5 tests) 533ms + ✓ mocks standard mobile-width media coordinates correctly 442ms + ✓ components/TopRivalriesTicker.timezone-boundaries.test.tsx (5 tests) 317ms +stdout | app/api/streak/tests/grace.test.ts > Grace Parameter Integration Tests > Test 1: Valid grace parameter parsing and rendering (grace=0) > should return 200 with valid SVG when grace=0 is provided +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"5ba3bf2f-6090-4bb4-9474-cfc62cde97bb"} + +stdout | app/api/streak/tests/grace.test.ts > Grace Parameter Integration Tests > Test 1: Valid grace parameter parsing and rendering (grace=0) > should return 200 with valid SVG when grace=0 is provided +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":86,"requestId":"5ba3bf2f-6090-4bb4-9474-cfc62cde97bb"} + +stdout | app/api/streak/tests/grace.test.ts > Grace Parameter Integration Tests > Test 1: Valid grace parameter parsing and rendering (grace=0) > should include proper Cache-Control header for grace=0 response +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"d07addc5-7fa8-45ea-8a84-eaf3877625be"} + + ✓ components/AnimatedCursor.responsive-breakpoints.test.tsx (5 tests) 301ms +stdout | app/api/streak/tests/grace.test.ts > Grace Parameter Integration Tests > Test 1: Valid grace parameter parsing and rendering (grace=0) > should include proper Cache-Control header for grace=0 response +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":8,"requestId":"d07addc5-7fa8-45ea-8a84-eaf3877625be"} + +stdout | app/api/streak/tests/grace.test.ts > Grace Parameter Integration Tests > Test 1: Valid grace parameter parsing and rendering (grace=0) > should include Content-Security-Policy header for SVG safety +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"15b77aa1-996e-4145-9601-cf66fb7b1bc3"} + +stdout | app/api/streak/tests/grace.test.ts > Grace Parameter Integration Tests > Test 1: Valid grace parameter parsing and rendering (grace=0) > should include Content-Security-Policy header for SVG safety +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":4,"requestId":"15b77aa1-996e-4145-9601-cf66fb7b1bc3"} + +stdout | app/api/streak/tests/grace.test.ts > Grace Parameter Integration Tests > Test 2: Maximum valid grace parameter (grace=7) > should return 200 with valid SVG when grace=7 is provided +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"bda2c26e-df51-421b-bba1-c57f8f18ed32"} + +stdout | app/api/streak/tests/grace.test.ts > Grace Parameter Integration Tests > Test 2: Maximum valid grace parameter (grace=7) > should return 200 with valid SVG when grace=7 is provided +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"bda2c26e-df51-421b-bba1-c57f8f18ed32"} + +stdout | app/api/streak/tests/grace.test.ts > Grace Parameter Integration Tests > Test 2: Maximum valid grace parameter (grace=7) > should allow streak to persist through grace period with grace=7 +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"e0bcc8f9-2c70-45be-94c2-08ed7a12b32b"} + +stdout | app/api/streak/tests/grace.test.ts > Grace Parameter Integration Tests > Test 2: Maximum valid grace parameter (grace=7) > should allow streak to persist through grace period with grace=7 +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"e0bcc8f9-2c70-45be-94c2-08ed7a12b32b"} + +stdout | app/api/streak/tests/grace.test.ts > Grace Parameter Integration Tests > Test 3: Invalid grace parameter values (out of range and non-integer) > should clamp grace=-1 to 0 and return 200 +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"a778c9a8-431c-4380-b151-15afdaad1cb4"} + +stdout | app/api/streak/tests/grace.test.ts > Grace Parameter Integration Tests > Test 3: Invalid grace parameter values (out of range and non-integer) > should clamp grace=-1 to 0 and return 200 +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":3,"requestId":"a778c9a8-431c-4380-b151-15afdaad1cb4"} + +stdout | app/api/streak/tests/grace.test.ts > Grace Parameter Integration Tests > Test 3: Invalid grace parameter values (out of range and non-integer) > should clamp grace=8 to 7 and return 200 +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"6ead72ef-84cc-4816-a505-91c667dc6f33"} + +stdout | app/api/streak/tests/grace.test.ts > Grace Parameter Integration Tests > Test 3: Invalid grace parameter values (out of range and non-integer) > should clamp grace=8 to 7 and return 200 +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"6ead72ef-84cc-4816-a505-91c667dc6f33"} + +stdout | app/api/streak/tests/grace.test.ts > Grace Parameter Integration Tests > Test 3: Invalid grace parameter values (out of range and non-integer) > should call GitHub API even when grace is out of range (clamped) +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"303bbae0-bee7-48a6-997e-0664be2be5a1"} + +stdout | app/api/streak/tests/grace.test.ts > Grace Parameter Integration Tests > Test 3: Invalid grace parameter values (out of range and non-integer) > should call GitHub API even when grace is out of range (clamped) +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"303bbae0-bee7-48a6-997e-0664be2be5a1"} + +stdout | app/api/streak/tests/grace.test.ts > Grace Parameter Integration Tests > Test 4: Default grace value and fallback behavior > should default to grace=1 when grace parameter is missing +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"77420c0f-a383-4b03-8f22-0f4980d7f4b2"} + +stdout | app/api/streak/tests/grace.test.ts > Grace Parameter Integration Tests > Test 4: Default grace value and fallback behavior > should default to grace=1 when grace parameter is missing +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":9,"requestId":"77420c0f-a383-4b03-8f22-0f4980d7f4b2"} + +stdout | app/api/streak/tests/grace.test.ts > Grace Parameter Integration Tests > Test 4: Default grace value and fallback behavior > should handle empty grace parameter gracefully (default to 1) +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"b1a68870-7270-4eec-9322-c44ecdefb628"} + +stdout | app/api/streak/tests/grace.test.ts > Grace Parameter Integration Tests > Test 4: Default grace value and fallback behavior > should handle empty grace parameter gracefully (default to 1) +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":3,"requestId":"b1a68870-7270-4eec-9322-c44ecdefb628"} + +stdout | app/api/streak/tests/grace.test.ts > Grace Parameter Integration Tests > Test 5: SVG rendering variations with different grace values and HTTP headers > should render valid SVG with grace=0 +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"69e7dead-fc7d-4950-ba30-129fed692f00"} + +stdout | app/api/streak/tests/grace.test.ts > Grace Parameter Integration Tests > Test 5: SVG rendering variations with different grace values and HTTP headers > should render valid SVG with grace=0 +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"69e7dead-fc7d-4950-ba30-129fed692f00"} + +stdout | app/api/streak/tests/grace.test.ts > Grace Parameter Integration Tests > Test 5: SVG rendering variations with different grace values and HTTP headers > should render valid SVG with grace=3 (middle value) +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"3ce3ec7c-6c2d-4c2f-954a-34230ce7151b"} + +stdout | app/api/streak/tests/grace.test.ts > Grace Parameter Integration Tests > Test 5: SVG rendering variations with different grace values and HTTP headers > should render valid SVG with grace=3 (middle value) +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"3ce3ec7c-6c2d-4c2f-954a-34230ce7151b"} + +stdout | app/api/streak/tests/grace.test.ts > Grace Parameter Integration Tests > Test 5: SVG rendering variations with different grace values and HTTP headers > should render valid SVG with grace=7 +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"40cc827a-9ea9-449c-ba2b-776f3f88e49c"} + +stdout | app/api/streak/tests/grace.test.ts > Grace Parameter Integration Tests > Test 5: SVG rendering variations with different grace values and HTTP headers > should render valid SVG with grace=7 +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"40cc827a-9ea9-449c-ba2b-776f3f88e49c"} + +stdout | app/api/streak/tests/grace.test.ts > Grace Parameter Integration Tests > Test 5: SVG rendering variations with different grace values and HTTP headers > should include X-Cache-Status header in response +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"29ea871b-e798-4f35-a291-d4a8dff4614e"} + +stdout | app/api/streak/tests/grace.test.ts > Grace Parameter Integration Tests > Test 5: SVG rendering variations with different grace values and HTTP headers > should include X-Cache-Status header in response +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"29ea871b-e798-4f35-a291-d4a8dff4614e"} + +stdout | app/api/streak/tests/grace.test.ts > Grace Parameter Integration Tests > Test 5: SVG rendering variations with different grace values and HTTP headers > should maintain HTTP 200 status for all valid grace values (0-7) +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"7f9752e9-cfe4-4cbe-9a8b-ee8994ee3916"} + +stdout | app/api/streak/tests/grace.test.ts > Grace Parameter Integration Tests > Test 5: SVG rendering variations with different grace values and HTTP headers > should maintain HTTP 200 status for all valid grace values (0-7) +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"7f9752e9-cfe4-4cbe-9a8b-ee8994ee3916"} + +stdout | app/api/streak/tests/grace.test.ts > Grace Parameter Integration Tests > Test 5: SVG rendering variations with different grace values and HTTP headers > should maintain HTTP 200 status for all valid grace values (0-7) +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"86aac1c0-512b-4692-8da3-f4fee02e8573"} + +stdout | app/api/streak/tests/grace.test.ts > Grace Parameter Integration Tests > Test 5: SVG rendering variations with different grace values and HTTP headers > should maintain HTTP 200 status for all valid grace values (0-7) +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":4,"requestId":"86aac1c0-512b-4692-8da3-f4fee02e8573"} + +stdout | app/api/streak/tests/grace.test.ts > Grace Parameter Integration Tests > Test 5: SVG rendering variations with different grace values and HTTP headers > should maintain HTTP 200 status for all valid grace values (0-7) +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"48fd6864-7872-4e1b-8bf7-37211609474f"} + +stdout | app/api/streak/tests/grace.test.ts > Grace Parameter Integration Tests > Test 5: SVG rendering variations with different grace values and HTTP headers > should maintain HTTP 200 status for all valid grace values (0-7) +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":4,"requestId":"48fd6864-7872-4e1b-8bf7-37211609474f"} + +stdout | app/api/streak/tests/grace.test.ts > Grace Parameter Integration Tests > Test 5: SVG rendering variations with different grace values and HTTP headers > should maintain HTTP 200 status for all valid grace values (0-7) +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"75928f63-6789-4b58-b81e-a8a8bdc6d296"} + +stdout | app/api/streak/tests/grace.test.ts > Grace Parameter Integration Tests > Test 5: SVG rendering variations with different grace values and HTTP headers > should maintain HTTP 200 status for all valid grace values (0-7) +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"75928f63-6789-4b58-b81e-a8a8bdc6d296"} + +stdout | app/api/streak/tests/grace.test.ts > Grace Parameter Integration Tests > Test 5: SVG rendering variations with different grace values and HTTP headers > should maintain HTTP 200 status for all valid grace values (0-7) +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"7c393537-7ea7-4c75-91f0-87dea573fa4b"} + +stdout | app/api/streak/tests/grace.test.ts > Grace Parameter Integration Tests > Test 5: SVG rendering variations with different grace values and HTTP headers > should maintain HTTP 200 status for all valid grace values (0-7) +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"7c393537-7ea7-4c75-91f0-87dea573fa4b"} + +stdout | app/api/streak/tests/grace.test.ts > Grace Parameter Integration Tests > Test 5: SVG rendering variations with different grace values and HTTP headers > should maintain HTTP 200 status for all valid grace values (0-7) +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"5014b92a-75ab-42a2-a110-8187c7951834"} + +stdout | app/api/streak/tests/grace.test.ts > Grace Parameter Integration Tests > Test 5: SVG rendering variations with different grace values and HTTP headers > should maintain HTTP 200 status for all valid grace values (0-7) +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":0,"requestId":"5014b92a-75ab-42a2-a110-8187c7951834"} + +stdout | app/api/streak/tests/grace.test.ts > Grace Parameter Integration Tests > Test 5: SVG rendering variations with different grace values and HTTP headers > should maintain HTTP 200 status for all valid grace values (0-7) +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"d3f68c1d-25c1-435a-a5c7-f367b16063d9"} + +stdout | app/api/streak/tests/grace.test.ts > Grace Parameter Integration Tests > Test 5: SVG rendering variations with different grace values and HTTP headers > should maintain HTTP 200 status for all valid grace values (0-7) +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"d3f68c1d-25c1-435a-a5c7-f367b16063d9"} + +stdout | app/api/streak/tests/grace.test.ts > Grace Parameter Integration Tests > Test 5: SVG rendering variations with different grace values and HTTP headers > should maintain HTTP 200 status for all valid grace values (0-7) +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"ccbf54b1-87f8-4f80-8495-a37d334fd509"} + +stdout | app/api/streak/tests/grace.test.ts > Grace Parameter Integration Tests > Test 5: SVG rendering variations with different grace values and HTTP headers > should maintain HTTP 200 status for all valid grace values (0-7) +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":0,"requestId":"ccbf54b1-87f8-4f80-8495-a37d334fd509"} + +stdout | app/api/streak/tests/grace.test.ts > Grace Parameter Integration Tests > Test 5: SVG rendering variations with different grace values and HTTP headers > should preserve Cache-Control header format across grace values +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"bee98827-2840-41b1-a8bd-86571d0b6a85"} + +stdout | app/api/streak/tests/grace.test.ts > Grace Parameter Integration Tests > Test 5: SVG rendering variations with different grace values and HTTP headers > should preserve Cache-Control header format across grace values +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":0,"requestId":"bee98827-2840-41b1-a8bd-86571d0b6a85"} + +stdout | app/api/streak/tests/grace.test.ts > Grace Parameter Integration Tests > Test 5: SVG rendering variations with different grace values and HTTP headers > should preserve Cache-Control header format across grace values +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"1bfe77bb-c8b9-41ad-a52d-d8ab722afdca"} + +stdout | app/api/streak/tests/grace.test.ts > Grace Parameter Integration Tests > Test 5: SVG rendering variations with different grace values and HTTP headers > should preserve Cache-Control header format across grace values +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":4,"requestId":"1bfe77bb-c8b9-41ad-a52d-d8ab722afdca"} + +stdout | app/api/streak/tests/grace.test.ts > Grace Parameter Integration Tests > Test 5: SVG rendering variations with different grace values and HTTP headers > should preserve Cache-Control header format across grace values +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"4e8fb672-a69a-4aba-8c9e-afd91f6b89f1"} + +stdout | app/api/streak/tests/grace.test.ts > Grace Parameter Integration Tests > Test 5: SVG rendering variations with different grace values and HTTP headers > should preserve Cache-Control header format across grace values +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":0,"requestId":"4e8fb672-a69a-4aba-8c9e-afd91f6b89f1"} + +stdout | app/api/streak/tests/grace.test.ts > Grace Parameter Integration Tests > Test 5: SVG rendering variations with different grace values and HTTP headers > should preserve Cache-Control header format across grace values +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"b887ac82-8850-45c3-880b-eba5f2f52ad0"} + +stdout | app/api/streak/tests/grace.test.ts > Grace Parameter Integration Tests > Test 5: SVG rendering variations with different grace values and HTTP headers > should preserve Cache-Control header format across grace values +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"b887ac82-8850-45c3-880b-eba5f2f52ad0"} + + ✓ app/api/streak/tests/grace.test.ts (16 tests) 693ms + ✓ components/TopRivalriesTicker.empty-fallback.test.tsx (5 tests) 376ms + ✓ lib/i18n/badgeLabels.empty-fallback.test.ts (5 tests) 545ms + ✓ Case 3: Assert standard CSS/style classes or properties remain intact on the default empty container element layout state 374ms + ✓ app/contributors/ContributorsSearch.mouse-interactivity.test.tsx (5 tests) 475ms + ✓ lib/validations.test.ts (196 tests) 298ms + ✓ components/dashboard/DashboardSkeleton.accessibility.test.tsx (5 tests) 404ms + ✓ components/dashboard/HistoricalTrendView.error-resilience.test.tsx (5 tests) 416ms +stderr | components/dashboard/ProfileOptimizerModal.mock-integrations.test.tsx > ProfileOptimizerModal - Async Integration Fixed > 2. updates loading text after interval tick +`ReactDOMTestUtils.act` is deprecated in favor of `React.act`. Import `act` from `react` instead of `react-dom/test-utils`. See https://react.dev/warnings/react-dom-test-utils for more info. + + ✓ components/dashboard/GithubWrapped.test.tsx (8 tests) 446ms + ✓ components/dashboard/ProfileOptimizerModal.mock-integrations.test.tsx (5 tests) 466ms + ✓ app/components/HeroSection.mock-integrations.test.tsx (5 tests) 734ms + ✓ renders static content without making real network calls 469ms + ✓ components/dashboard/GrowthTrendChart.responsive-breakpoints.test.tsx (6 tests) 894ms + ✓ mounts cleanly without side-effects inside a narrow 375px mobile display canvas 450ms + ✓ components/dashboard/VisualizationTooltip.responsive-breakpoints.test.tsx (5 tests) 657ms + ✓ renders correctly on a mobile-width viewport 544ms +stderr | components/dashboard/RadarChart.mouse-interactivity.test.tsx > RadarChart mouse interactivity contract > renders chart title and subtitle +React does not recognize the `whileInView` prop on a DOM element. If you intentionally want it to appear in the DOM as a custom attribute, spell it as lowercase `whileinview` instead. If you accidentally passed it from a parent component, remove it from the DOM element. + + ✓ components/dashboard/RadarChart.mouse-interactivity.test.tsx (5 tests) 317ms +stderr | components/dashboard/CommitClock.theme-contrast.test.tsx > CommitClock - Theme Contrast > renders light and dark mode container classes +React does not recognize the `whileInView` prop on a DOM element. If you intentionally want it to appear in the DOM as a custom attribute, spell it as lowercase `whileinview` instead. If you accidentally passed it from a parent component, remove it from the DOM element. + + ✓ components/dashboard/CommitClock.theme-contrast.test.tsx (5 tests) 327ms +stdout | app/api/streak/tests/languages.test.ts > GET /api/streak — languages (lang) parameter > returns 200 with SVG content type when a valid lang=de is given +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"039273a6-7a41-4221-bc4f-b135c669120c"} + +stdout | app/api/streak/tests/languages.test.ts > GET /api/streak — languages (lang) parameter > returns 200 with SVG content type when a valid lang=de is given +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":30,"requestId":"039273a6-7a41-4221-bc4f-b135c669120c"} + +stdout | app/api/streak/tests/languages.test.ts > GET /api/streak — languages (lang) parameter > returns a well-formed SVG body when lang=pt is given +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"e49fa821-7110-4b39-8a4e-f8b03740cc73"} + +stdout | app/api/streak/tests/languages.test.ts > GET /api/streak — languages (lang) parameter > returns a well-formed SVG body when lang=pt is given +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":3,"requestId":"e49fa821-7110-4b39-8a4e-f8b03740cc73"} + +stdout | app/api/streak/tests/languages.test.ts > GET /api/streak — languages (lang) parameter > falls back to English labels when an unrecognised lang=zz is given +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"f4c7073a-2db3-42ea-b67b-2a38ff9fae43"} + +stdout | app/api/streak/tests/languages.test.ts > GET /api/streak — languages (lang) parameter > falls back to English labels when an unrecognised lang=zz is given +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"f4c7073a-2db3-42ea-b67b-2a38ff9fae43"} + +stdout | app/api/streak/tests/languages.test.ts > GET /api/streak — languages (lang) parameter > returns English labels when lang=en is explicitly provided +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"c0b4e5fc-cf46-49cc-8ad7-fa4c1288bb5e"} + +stdout | app/api/streak/tests/languages.test.ts > GET /api/streak — languages (lang) parameter > returns English labels when lang=en is explicitly provided +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"c0b4e5fc-cf46-49cc-8ad7-fa4c1288bb5e"} + +stdout | app/api/streak/tests/languages.test.ts > GET /api/streak — languages (lang) parameter > sets Cache-Control and Content-Security-Policy headers for a valid lang parameter +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"cceb6795-2a33-4c53-94e9-f8e90f4db0bf"} + +stdout | app/api/streak/tests/languages.test.ts > GET /api/streak — languages (lang) parameter > sets Cache-Control and Content-Security-Policy headers for a valid lang parameter +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"cceb6795-2a33-4c53-94e9-f8e90f4db0bf"} + + ✓ app/api/streak/tests/languages.test.ts (5 tests) 141ms + ✓ components/dashboard/PRInsights/Highlights.error-resilience.test.tsx (4 tests) 148ms + ✓ components/dashboard/StatsCard.mouse-interactivity.test.tsx (5 tests) 401ms + ✓ components/AnimatedCursor.test.tsx (6 tests) 458ms + ✓ components/dashboard/PRInsights/PRInsightsClient.empty-fallback.test.tsx (5 tests) 487ms + ✓ components/dashboard/ProfileCard.theme-contrast.test.tsx (5 tests) 501ms + ✓ components/dashboard/PopularPinnnedRepos.error-resilience.test.tsx (5 tests) 304ms + ✓ components/CherryBlossom.mouse-interactivity.test.tsx (5 tests) 463ms + ✓ components/dashboard/PRInsights/ReviewAnalytics.theme-contrast.test.tsx (5 tests) 456ms + ✓ components/dashboard/ProfileCard.mock-integrations.test.tsx (5 tests) 394ms + ✓ app/api/compare/tests/comparisonStats.test.ts (5 tests) 790ms + ✓ returns 200 and JSON structure for valid dual-profile comparison 769ms + ✓ app/template.test.tsx (5 tests) 150ms + ✓ components/CherryBlossom.empty-fallback.test.tsx (5 tests) 159ms + ✓ components/dashboard/Achievements.responsive-breakpoints.test.tsx (5 tests) 381ms + ✓ components/dashboard/LanguageChart.theme-contrast.test.tsx (5 tests) 414ms + ✓ hooks/useRecentSearches.theme-contrast.test.ts (5 tests) 80ms + ✓ components/dashboard/PopularPinnnedRepos.mock-integrations.test.tsx (5 tests) 594ms + ✓ models/User.test.ts (20 tests) 343ms + ✓ app/components/Icons.test.tsx (6 tests) 166ms + ✓ components/dashboard/RepositoryGraph.test.tsx (7 tests) 637ms + ✓ app/contributors/loading.error-resilience.test.tsx (5 tests) 357ms + ✓ components/dashboard/GithubWrapped.theme-contrast.test.tsx (5 tests) 597ms + ✓ preserves bg-black and text-white container colors to maintain high native contrast under all modes 315ms + ✓ components/dashboard/ResumeProfileSection.timezone-boundaries.test.tsx (5 tests) 316ms + ✓ components/dashboard/VisualizationTooltip.test.tsx (5 tests) 717ms + ✓ renders tooltip role 614ms + ✓ app/contributors/ContributorsSearch.error-resilience.test.tsx (5 tests) 627ms + ✓ components/dashboard/Achievements.theme-contrast.test.tsx (5 tests) 364ms + ✓ components/CherryBlossom.accessibility.test.tsx (5 tests) 487ms +stderr | components/dashboard/StatsCard.mock-integrations.test.tsx > StatsCard mock integrations > renders with mocked Flame icon +React does not recognize the `whileInView` prop on a DOM element. If you intentionally want it to appear in the DOM as a custom attribute, spell it as lowercase `whileinview` instead. If you accidentally passed it from a parent component, remove it from the DOM element. +React does not recognize the `whileHover` prop on a DOM element. If you intentionally want it to appear in the DOM as a custom attribute, spell it as lowercase `whilehover` instead. If you accidentally passed it from a parent component, remove it from the DOM element. + + ✓ components/dashboard/StatsCard.mock-integrations.test.tsx (5 tests) 214ms + ✓ app/(root)/dashboard/layout.responsive-breakpoints.test.tsx (5 tests) 120ms +stderr | components/dashboard/PRInsights/PRInsightsClient.responsive-breakpoints.test.tsx > PRInsightsClient Responsive Multi-device Columns & Mobile Viewport Layouts > 1. mocks standard mobile-width media coordinates (e.g. 375px wide viewports) +An update to PRInsightsClient inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act +An update to PRInsightsClient inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act + +stderr | components/dashboard/PRInsights/PRInsightsClient.responsive-breakpoints.test.tsx > PRInsightsClient Responsive Multi-device Columns & Mobile Viewport Layouts > 2. asserts that columns reflow into standard vertical flex lists +TypeError: Cannot read properties of undefined (reading 'toFixed') + at TopMetricsRow (/home/atulupadhyay/Contribution/commitpulse/components/dashboard/PRInsights/TopMetricsRow.tsx:89:31) + at Object.react_stack_bottom_frame (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:25904:20) + at renderWithHooks (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:7662:22) + at updateFunctionComponent (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:10166:19) + at beginWork (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:11778:18) + at runWithFiberInDEV (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:874:13) + at performUnitOfWork (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:17641:22) + at workLoopSync (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:17469:41) + at renderRootSync (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:17450:11) + at performWorkOnRoot (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:16583:35) { + [stack]: [Getter/Setter], + [message]: "Cannot read properties of undefined (reading 'toFixed')" +} + +The above error occurred in the <TopMetricsRow> component. + +React will try to recreate this component tree from scratch using the error boundary you provided, y. + +[ERROR] PRInsightsClient render exception {"message":"Cannot read properties of undefined (reading 'toFixed')","componentStack":"\n at TopMetricsRow (/home/atulupadhyay/Contribution/commitpulse/components/dashboard/PRInsights/TopMetricsRow.tsx:109:26)\n at div (<anonymous>)\n at y (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-error-boundary/dist/react-error-boundary.cjs:1:213)\n at PRInsightsClient (/home/atulupadhyay/Contribution/commitpulse/components/dashboard/PRInsights/PRInsightsClient.tsx:68:29)"} + +stderr | components/dashboard/PRInsights/PRInsightsClient.responsive-breakpoints.test.tsx > PRInsightsClient Responsive Multi-device Columns & Mobile Viewport Layouts > 3. verifies styling values are not absolute widths that cause horizontal scrollbars on smaller viewports +TypeError: Cannot read properties of undefined (reading 'toFixed') + at TopMetricsRow (/home/atulupadhyay/Contribution/commitpulse/components/dashboard/PRInsights/TopMetricsRow.tsx:89:31) + at Object.react_stack_bottom_frame (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:25904:20) + at renderWithHooks (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:7662:22) + at updateFunctionComponent (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:10166:19) + at beginWork (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:11778:18) + at runWithFiberInDEV (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:874:13) + at performUnitOfWork (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:17641:22) + at workLoopSync (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:17469:41) + at renderRootSync (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:17450:11) + at performWorkOnRoot (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:16583:35) { + [stack]: [Getter/Setter], + [message]: "Cannot read properties of undefined (reading 'toFixed')" +} + +The above error occurred in the <TopMetricsRow> component. + +React will try to recreate this component tree from scratch using the error boundary you provided, y. + +[ERROR] PRInsightsClient render exception {"message":"Cannot read properties of undefined (reading 'toFixed')","componentStack":"\n at TopMetricsRow (/home/atulupadhyay/Contribution/commitpulse/components/dashboard/PRInsights/TopMetricsRow.tsx:109:26)\n at div (<anonymous>)\n at y (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-error-boundary/dist/react-error-boundary.cjs:1:213)\n at PRInsightsClient (/home/atulupadhyay/Contribution/commitpulse/components/dashboard/PRInsights/PRInsightsClient.tsx:68:29)"} + +stderr | components/dashboard/PRInsights/PRInsightsClient.responsive-breakpoints.test.tsx > PRInsightsClient Responsive Multi-device Columns & Mobile Viewport Layouts > 4. checks that navigation components scale down gracefully +TypeError: Cannot read properties of undefined (reading 'toFixed') + at TopMetricsRow (/home/atulupadhyay/Contribution/commitpulse/components/dashboard/PRInsights/TopMetricsRow.tsx:89:31) + at Object.react_stack_bottom_frame (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:25904:20) + at renderWithHooks (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:7662:22) + at updateFunctionComponent (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:10166:19) + at beginWork (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:11778:18) + at runWithFiberInDEV (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:874:13) + at performUnitOfWork (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:17641:22) + at workLoopSync (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:17469:41) + at renderRootSync (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:17450:11) + at performWorkOnRoot (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:16583:35) { + [stack]: [Getter/Setter], + [message]: "Cannot read properties of undefined (reading 'toFixed')" +} + +The above error occurred in the <TopMetricsRow> component. + +React will try to recreate this component tree from scratch using the error boundary you provided, y. + +[ERROR] PRInsightsClient render exception {"message":"Cannot read properties of undefined (reading 'toFixed')","componentStack":"\n at TopMetricsRow (/home/atulupadhyay/Contribution/commitpulse/components/dashboard/PRInsights/TopMetricsRow.tsx:109:26)\n at div (<anonymous>)\n at y (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-error-boundary/dist/react-error-boundary.cjs:1:213)\n at PRInsightsClient (/home/atulupadhyay/Contribution/commitpulse/components/dashboard/PRInsights/PRInsightsClient.tsx:68:29)"} + +stderr | components/dashboard/PRInsights/PRInsightsClient.responsive-breakpoints.test.tsx > PRInsightsClient Responsive Multi-device Columns & Mobile Viewport Layouts > 5. asserts mobile-specific toggle states respond cleanly +TypeError: Cannot read properties of undefined (reading 'toFixed') + at TopMetricsRow (/home/atulupadhyay/Contribution/commitpulse/components/dashboard/PRInsights/TopMetricsRow.tsx:89:31) + at Object.react_stack_bottom_frame (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:25904:20) + at renderWithHooks (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:7662:22) + at updateFunctionComponent (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:10166:19) + at beginWork (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:11778:18) + at runWithFiberInDEV (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:874:13) + at performUnitOfWork (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:17641:22) + at workLoopSync (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:17469:41) + at renderRootSync (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:17450:11) + at performWorkOnRoot (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:16583:35) { + [stack]: [Getter/Setter], + [message]: "Cannot read properties of undefined (reading 'toFixed')" +} + +The above error occurred in the <TopMetricsRow> component. + +React will try to recreate this component tree from scratch using the error boundary you provided, y. + +[ERROR] PRInsightsClient render exception {"message":"Cannot read properties of undefined (reading 'toFixed')","componentStack":"\n at TopMetricsRow (/home/atulupadhyay/Contribution/commitpulse/components/dashboard/PRInsights/TopMetricsRow.tsx:109:26)\n at div (<anonymous>)\n at y (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-error-boundary/dist/react-error-boundary.cjs:1:213)\n at PRInsightsClient (/home/atulupadhyay/Contribution/commitpulse/components/dashboard/PRInsights/PRInsightsClient.tsx:68:29)"} + + ✓ components/dashboard/PRInsights/PRInsightsClient.responsive-breakpoints.test.tsx (5 tests) 214ms +stderr | components/dashboard/GrowthTrendChart.theme-contrast.test.tsx > GrowthTrendChart theme contrast > renders heading with dark and light theme text classes +React does not recognize the `whileInView` prop on a DOM element. If you intentionally want it to appear in the DOM as a custom attribute, spell it as lowercase `whileinview` instead. If you accidentally passed it from a parent component, remove it from the DOM element. + + ✓ components/dashboard/GrowthTrendChart.theme-contrast.test.tsx (5 tests) 531ms + ✓ renders heading with dark and light theme text classes 353ms +stderr | components/dashboard/Heatmap.error-resilience.test.tsx > Heatmap Error Resilience > renders fallback UI when nested runtime exception occurs +Error: Simulated runtime crash + at ThrowingComponent (/home/atulupadhyay/Contribution/commitpulse/components/dashboard/Heatmap.error-resilience.test.tsx:61:13) + at Object.react_stack_bottom_frame (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:25904:20) + at renderWithHooks (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:7662:22) + at updateFunctionComponent (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:10166:19) + at beginWork (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:11778:18) + at runWithFiberInDEV (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:874:13) + at performUnitOfWork (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:17641:22) + at workLoopSync (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:17469:41) + at renderRootSync (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:17450:11) + at performWorkOnRoot (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:16583:35) { + [stack]: [Getter/Setter], + [message]: 'Simulated runtime crash' +} + +The above error occurred in the <ThrowingComponent> component. + +React will try to recreate this component tree from scratch using the error boundary you provided, y. + + +stderr | components/dashboard/Heatmap.error-resilience.test.tsx > Heatmap Error Resilience > renders fallback UI for broken components safely +Error: Unexpected failure + at BrokenComponent (/home/atulupadhyay/Contribution/commitpulse/components/dashboard/Heatmap.error-resilience.test.tsx:89:13) + at Object.react_stack_bottom_frame (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:25904:20) + at renderWithHooks (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:7662:22) + at updateFunctionComponent (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:10166:19) + at beginWork (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:11778:18) + at runWithFiberInDEV (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:874:13) + at performUnitOfWork (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:17641:22) + at workLoopSync (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:17469:41) + at renderRootSync (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:17450:11) + at performWorkOnRoot (/home/atulupadhyay/Contribution/commitpulse/node_modules/react-dom/cjs/react-dom-client.development.js:16583:35) { + [stack]: [Getter/Setter], + [message]: 'Unexpected failure' +} + +The above error occurred in the <BrokenComponent> component. + +React will try to recreate this component tree from scratch using the error boundary you provided, y. + + + ✓ components/dashboard/Heatmap.error-resilience.test.tsx (5 tests) 348ms + ✓ components/dashboard/ComparisonStatsCard.timezone-boundaries.test.tsx (5 tests) 400ms + ✓ hooks/useGlowEffect.responsive-breakpoints.test.ts (5 tests) 131ms + ✓ app/template.theme-contrast.test.tsx (5 tests) 199ms + ✓ app/contributors/ContributorsClient.error-resilience.test.tsx (5 tests) 527ms + ✓ components/dashboard/ProfileCard.timezone-boundaries.test.tsx (5 tests) 387ms + ✓ components/dashboard/ResumePreviewForm.type-compiler.test.tsx (5 tests) 539ms + ✓ components/dashboard/ResumeProfileSection.mouse-interactivity.test.tsx (5 tests) 195ms + ✓ components/dashboard/PRInsights/PRStatusDistribution.theme-contrast.test.tsx (5 tests) 519ms + ✓ 1. should emulate both dark and light presets 332ms + ✓ components/AnimatedCursor.theme-contrast.test.tsx (5 tests) 555ms + ✓ maintains static premium styling across light and dark color-scheme environments 335ms + ✓ components/dashboard/LanguageChart.responsive-breakpoints.test.tsx (5 tests) 386ms + ✓ app/generator/components/sections/NameSection.theme-contrast.test.tsx (6 tests) 327ms + ✓ components/TopRivalriesTicker.theme-contrast.test.tsx (5 tests) 642ms + ✓ 2. asserts that visual styling for TopRivalriesTicker adapts properly to current theme settings 399ms + ✓ components/dashboard/ComparisonStatsCard.mouse-interactivity.test.tsx (5 tests) 441ms + ✓ Verify that responsive tooltip layouts display at computed coordinates 336ms + ✓ components/dashboard/AIInsights.timezone-boundaries.test.tsx (5 tests) 285ms + ✓ app/components/Icons.empty-fallback.test.tsx (5 tests) 164ms + ✓ app/generator/components/sections/NameSection.empty-fallback.test.tsx (5 tests) 536ms + ✓ renders NameSection with an empty text configuration string or null values and displays a clear fallback layout placeholder or default username 429ms +stderr | components/dashboard/PRInsights/PRTrendChart.empty-fallback.test.tsx > PRTrendChart Empty/Missing Inputs Verification > renders successfully with empty activity datasets +The tag <stop> is unrecognized in this browser. If you meant to render a React component, start its name with an uppercase letter. +<linearGradient /> is using incorrect casing. Use PascalCase for React components, or lowercase for HTML elements. +The tag <linearGradient> is unrecognized in this browser. If you meant to render a React component, start its name with an uppercase letter. +The tag <defs> is unrecognized in this browser. If you meant to render a React component, start its name with an uppercase letter. + + ✓ app/customize/components/AdvancedSettingsPanel.theme-contrast.test.tsx (5 tests) 363ms +stderr | components/dashboard/PRInsights/PRTrendChart.empty-fallback.test.tsx > PRTrendChart Empty/Missing Inputs Verification > renders chart container when weekly and monthly data are empty +<linearGradient /> is using incorrect casing. Use PascalCase for React components, or lowercase for HTML elements. + +stderr | components/dashboard/PRInsights/PRTrendChart.empty-fallback.test.tsx > PRTrendChart Empty/Missing Inputs Verification > allows switching to weekly view with empty datasets +<linearGradient /> is using incorrect casing. Use PascalCase for React components, or lowercase for HTML elements. + +stderr | components/dashboard/PRInsights/PRTrendChart.empty-fallback.test.tsx > PRTrendChart Empty/Missing Inputs Verification > allows switching back to monthly view with empty datasets +<linearGradient /> is using incorrect casing. Use PascalCase for React components, or lowercase for HTML elements. + +stderr | components/dashboard/PRInsights/PRTrendChart.empty-fallback.test.tsx > PRTrendChart Empty/Missing Inputs Verification > maintains DOM structure with fully zeroed insight data +<linearGradient /> is using incorrect casing. Use PascalCase for React components, or lowercase for HTML elements. + + ✓ components/dashboard/PRInsights/PRTrendChart.empty-fallback.test.tsx (5 tests) 310ms + ✓ components/dashboard/GithubWrapped.mock-integrations.test.tsx (5 tests) 203ms +stderr | app/contributors/page.mouse-interactivity.test.tsx > ContributorsPage Mouse Interactivity > renders successfully when contributor retrieval falls back to an empty state +[ERROR] Failed to fetch contributors {"error":{}} + + ✓ app/contributors/page.mouse-interactivity.test.tsx (5 tests) 98ms + ✓ components/dashboard/StatsCard.responsive-breakpoints.test.tsx (5 tests) 251ms + ✓ components/Leaderboard.responsive-breakpoints.test.tsx (5 tests) 335ms + ✓ hooks/useShareActions.test.ts (8 tests) 464ms + ✓ components/dashboard/StatsCardSkeleton.test.tsx (4 tests) 289ms + ✓ components/dashboard/VisualizationTooltip.error-resilience.test.tsx (5 tests) 618ms + ✓ maintains hydration stability and renders without crashing under default properties 502ms + ✓ hooks/useDebounce.test.ts (7 tests) 89ms + ✓ components/dashboard/StatsCard.accessibility.test.tsx (5 tests) 495ms + ✓ components/dashboard/HistoricalTrendView.mock-integrations.test.tsx (5 tests) 723ms + ✓ 1. Mock standard asynchronous imports and databases using stubs 302ms + ✓ components/Leaderboard.mouse-interactivity.test.tsx (5 tests) 327ms + ✓ app/contributors/ContributorsSearch.responsive-breakpoints.test.tsx (5 tests) 382ms + ✓ components/dashboard/StatsCardSkeleton.empty-fallback.test.tsx (5 tests) 325ms + ✓ components/dashboard/RepositoryGraph.mock-integrations.test.tsx (5 tests) 285ms + ✓ components/dashboard/PRInsights/ReviewAnalytics.mouse-interactivity.test.tsx (5 tests) 227ms +stdout | app/api/streak/route.theme-contrast.test.ts > GET /api/streak theme contrast > renders successfully with dark theme +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"aa1c2d3f-05c8-4fa6-a678-a854bef16c3c"} + +stdout | app/api/streak/route.theme-contrast.test.ts > GET /api/streak theme contrast > renders successfully with dark theme +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":53,"requestId":"aa1c2d3f-05c8-4fa6-a678-a854bef16c3c"} + +stdout | app/api/streak/route.theme-contrast.test.ts > GET /api/streak theme contrast > renders successfully with light theme +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"e0d53ee5-0042-4199-9ac4-2b11cdeae9c3"} + +stdout | app/api/streak/route.theme-contrast.test.ts > GET /api/streak theme contrast > renders successfully with light theme +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":6,"requestId":"e0d53ee5-0042-4199-9ac4-2b11cdeae9c3"} + +stdout | app/api/streak/route.theme-contrast.test.ts > GET /api/streak theme contrast > produces different SVG output for dark and light themes +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"dc393926-6651-468f-aedd-5dc83dbc17a3"} + +stdout | app/api/streak/route.theme-contrast.test.ts > GET /api/streak theme contrast > produces different SVG output for dark and light themes +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":5,"requestId":"dc393926-6651-468f-aedd-5dc83dbc17a3"} + +stdout | app/api/streak/route.theme-contrast.test.ts > GET /api/streak theme contrast > produces different SVG output for dark and light themes +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"694c1371-9b82-4c94-bd45-6ee62c35d89e"} + +stdout | app/api/streak/route.theme-contrast.test.ts > GET /api/streak theme contrast > produces different SVG output for dark and light themes +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"694c1371-9b82-4c94-bd45-6ee62c35d89e"} + +stdout | app/api/streak/route.theme-contrast.test.ts > GET /api/streak theme contrast > uses prefers-color-scheme CSS when theme=auto +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"9916640e-c4d4-4e8f-9f32-5b810a47f861"} + +stdout | app/api/streak/route.theme-contrast.test.ts > GET /api/streak theme contrast > uses prefers-color-scheme CSS when theme=auto +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":5,"requestId":"9916640e-c4d4-4e8f-9f32-5b810a47f861"} + +stdout | app/api/streak/route.theme-contrast.test.ts > GET /api/streak theme contrast > includes CSS variables for automatic theme switching +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"e2f2c3af-6290-4882-9722-307eaada81d9"} + +stdout | app/api/streak/route.theme-contrast.test.ts > GET /api/streak theme contrast > includes CSS variables for automatic theme switching +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":0,"requestId":"e2f2c3af-6290-4882-9722-307eaada81d9"} + + ✓ app/api/streak/route.theme-contrast.test.ts (5 tests) 242ms + ✓ components/dashboard/AIInsights.responsive-breakpoints.test.tsx (5 tests) 416ms + ✓ components/commitpulse-logo.mock-integrations.test.tsx (5 tests) 236ms + ✓ components/dashboard/RadarChart.responsive-breakpoints.test.tsx (5 tests) 568ms + ✓ components/dashboard/GrowthTrendChart.empty-fallback.test.tsx (5 tests) 318ms +stdout | app/api/streak/route.empty-fallback.test.ts > ApiStreakRoute - Edge Cases & Empty/Missing Inputs > renders without breaking when calendar arrays are completely empty +[INFO] Incoming streak request {"source":"streak","user":"emptyuser","view":"default","requestId":"8f4fbe19-5bcf-403c-9402-0145f6ef57c0"} + +stdout | app/api/streak/route.empty-fallback.test.ts > ApiStreakRoute - Edge Cases & Empty/Missing Inputs > renders without breaking when calendar arrays are completely empty +[INFO] Streak request completed {"source":"streak","user":"emptyuser","view":"default","format":"svg","status":200,"durationMs":25,"requestId":"8f4fbe19-5bcf-403c-9402-0145f6ef57c0"} + +stdout | app/api/streak/route.empty-fallback.test.ts > ApiStreakRoute - Edge Cases & Empty/Missing Inputs > returns a fallback error response when required parameters are missing +[INFO] Incoming streak request {"source":"streak","requestId":"1791d6ff-c9fa-4a99-87a3-aa6b4db32170"} + +stdout | app/api/streak/route.empty-fallback.test.ts > ApiStreakRoute - Edge Cases & Empty/Missing Inputs > maintains standard styles when weeks exist but contribution counts are zero +[INFO] Incoming streak request {"source":"streak","user":"zerouser","view":"default","requestId":"a6b9fc25-c212-4cbd-9a2b-63b7a8c0d8ef"} + +stdout | app/api/streak/route.empty-fallback.test.ts > ApiStreakRoute - Edge Cases & Empty/Missing Inputs > maintains standard styles when weeks exist but contribution counts are zero +[INFO] Streak request completed {"source":"streak","user":"zerouser","view":"default","format":"svg","status":200,"durationMs":3,"requestId":"a6b9fc25-c212-4cbd-9a2b-63b7a8c0d8ef"} + +stdout | app/api/streak/route.empty-fallback.test.ts > ApiStreakRoute - Edge Cases & Empty/Missing Inputs > handles offline fallback state from GitHub fetcher gracefully +[INFO] Incoming streak request {"source":"streak","user":"offlineuser","view":"default","requestId":"3873657a-ea7c-4737-8c9d-62cf00f3c174"} + +stdout | app/api/streak/route.empty-fallback.test.ts > ApiStreakRoute - Edge Cases & Empty/Missing Inputs > handles offline fallback state from GitHub fetcher gracefully +[INFO] Streak request completed {"source":"streak","user":"offlineuser","view":"default","format":"svg","status":200,"durationMs":3,"requestId":"3873657a-ea7c-4737-8c9d-62cf00f3c174"} + +stdout | app/api/streak/route.empty-fallback.test.ts > ApiStreakRoute - Edge Cases & Empty/Missing Inputs > returns valid JSON with empty values when format=json and inputs are empty +[INFO] Incoming streak request {"source":"streak","user":"jsonuser","view":"default","requestId":"dd136f8b-5586-4a41-90a1-6655c4cc979c"} + +stdout | app/api/streak/route.empty-fallback.test.ts > ApiStreakRoute - Edge Cases & Empty/Missing Inputs > returns valid JSON with empty values when format=json and inputs are empty +[INFO] Streak request completed {"source":"streak","user":"jsonuser","view":"default","format":"json","status":200,"durationMs":4,"requestId":"dd136f8b-5586-4a41-90a1-6655c4cc979c"} + + ✓ app/api/streak/route.empty-fallback.test.ts (5 tests) 199ms + ✓ components/dashboard/EnterpriseHealth.test.tsx (4 tests) 432ms + ✓ hooks/useGlowEffect.error-resilience.test.ts (5 tests) 129ms + ✓ components/dashboard/DashboardSkeleton.responsive-breakpoints.test.tsx (5 tests) 642ms + ✓ 1. Mock standard mobile-width media coordinates (375px viewport) 396ms + ✓ components/dashboard/PRInsights/ReviewAnalytics.empty-fallback.test.tsx (5 tests) 274ms + ✓ components/dashboard/ContributionCity3D.empty-fallback.test.tsx (7 tests) 503ms + ✓ components/dashboard/ResumeUpload.timezone-boundaries.test.tsx (5 tests) 306ms + ✓ app/customize/components/ExportPanel.mock-integration.test.tsx (5 tests) 476ms + ✓ app/(root)/dashboard/layout.theme-contrast.test.tsx (5 tests) 124ms +stderr | app/api/og/route.test.ts > OG Route > falls back to zeros when github fetch fails +[ERROR] Stats fetch failed {"source":"OG","error":{}} + +stderr | app/api/og/route.test.ts > OG Route > handles missing user query param +[ERROR] Stats fetch failed {"source":"OG","error":{}} + +stderr | app/api/og/route.test.ts > OG Route > returns 429 when rate limit is exceeded +{"timestamp":"2026-07-23T03:33:16.632Z","type":"SECURITY_EVENT","event":"UNTRUSTED_FORWARDED_HEADER_IGNORED","resolvedIp":"unknown","header":"x-forwarded-for"} + + ✓ app/api/og/route.test.ts (8 tests) 181ms + ✓ app/api/student/resume/upload/route.timezone-boundaries.test.ts (5 tests) 141ms +stderr | components/DiscordButton.responsive-breakpoints.test.tsx > DiscordButton - Responsive Breakpoints & Mobile Layouts > Mobile Viewport Simulation: renders without crashing on 375px mobile viewport +React does not recognize the `whileTap` prop on a DOM element. If you intentionally want it to appear in the DOM as a custom attribute, spell it as lowercase `whiletap` instead. If you accidentally passed it from a parent component, remove it from the DOM element. + + ✓ components/DiscordButton.responsive-breakpoints.test.tsx (5 tests) 225ms + ✓ components/dashboard/AchievementsSkeleton.theme-contrast.test.tsx (5 tests) 455ms +stderr | components/dashboard/Achievements.mock-integrations.test.tsx > Achievements - Asynchronous Service Layer Mocking & Local Cache Stubs > Mock standard asynchronous imports and databases using stubs: renders mocked icons without real lucide-react +React does not recognize the `whileInView` prop on a DOM element. If you intentionally want it to appear in the DOM as a custom attribute, spell it as lowercase `whileinview` instead. If you accidentally passed it from a parent component, remove it from the DOM element. + + ✓ components/dashboard/Achievements.mock-integrations.test.tsx (5 tests) 428ms + ✓ app/api/achievements/route.test.ts (20 tests) 151ms + ✓ components/dashboard/GrowthTrendChart.accessibility.test.tsx (5 tests) 533ms + ✓ renders the main heading correctly 319ms + ✓ components/dashboard/PRInsights/RepoPerformanceTable.error-resilience.test.tsx (5 tests) 251ms +Not implemented: navigation to another Document +Not implemented: navigation to another Document +Not implemented: navigation to another Document + ✓ hooks/useShareActions.mock-integrations.test.ts (5 tests) 510ms +stderr | components/dashboard/PRInsights/PRInsightsClient.mock-integrations.test.tsx > PRInsightsClient - Asynchronous Service Layer Mocking & Local Cache Stubs > 1. mocks standard asynchronous imports and databases using stubs +The width(-1) and height(-1) of chart should be greater than 0, + please check the style of container, or the props width(100%) and height(100%), + or add a minWidth(0) or minHeight(undefined) or use aspect(undefined) to control the + height and width. + +stderr | components/dashboard/PRInsights/PRInsightsClient.mock-integrations.test.tsx > PRInsightsClient - Asynchronous Service Layer Mocking & Local Cache Stubs > 3. asserts local cache layers are queried before triggering database retrievals +The width(-1) and height(-1) of chart should be greater than 0, + please check the style of container, or the props width(100%) and height(100%), + or add a minWidth(0) or minHeight(undefined) or use aspect(undefined) to control the + height and width. + +stderr | components/dashboard/PRInsights/PRInsightsClient.mock-integrations.test.tsx > PRInsightsClient - Asynchronous Service Layer Mocking & Local Cache Stubs > 5. asserts complete cache sync is written on success callbacks +The width(-1) and height(-1) of chart should be greater than 0, + please check the style of container, or the props width(100%) and height(100%), + or add a minWidth(0) or minHeight(undefined) or use aspect(undefined) to control the + height and width. + + ✓ components/dashboard/PRInsights/PRInsightsClient.mock-integrations.test.tsx (5 tests) 691ms + ✓ 1. mocks standard asynchronous imports and databases using stubs 441ms + ✓ lib/calculate.empty-calendar-v3.test.ts (5 tests) 365ms + ✓ components/dashboard/PRInsights/PRStatusDistribution.timezone-boundaries.test.tsx (5 tests) 299ms + ✓ app/api/og/route.theme-contrast.test.tsx (5 tests) 413ms + ✓ 1. applies dark theme styling correctly 302ms +stdout | app/api/streak/tests/theme.test.ts > Streak API - theme parameter integration tests > should return 200 OK and render dark theme by default +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"b147c101-5e56-4c52-a8f1-0306ed3c5505"} + +stdout | app/api/streak/tests/theme.test.ts > Streak API - theme parameter integration tests > should return 200 OK and render dark theme by default +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":101,"requestId":"b147c101-5e56-4c52-a8f1-0306ed3c5505"} + +stdout | app/api/streak/tests/theme.test.ts > Streak API - theme parameter integration tests > should return 200 OK and render light theme when theme is light +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"7e45c253-6369-4e60-8c11-fd87c632fa49"} + +stdout | app/api/streak/tests/theme.test.ts > Streak API - theme parameter integration tests > should return 200 OK and render light theme when theme is light +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":3,"requestId":"7e45c253-6369-4e60-8c11-fd87c632fa49"} + +stdout | app/api/streak/tests/theme.test.ts > Streak API - theme parameter integration tests > should return 200 OK when theme is auto +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"ec5fe5f9-d4ac-43ef-ada2-06b06f026b37"} + +stdout | app/api/streak/tests/theme.test.ts > Streak API - theme parameter integration tests > should return 200 OK when theme is auto +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":11,"requestId":"ec5fe5f9-d4ac-43ef-ada2-06b06f026b37"} + +stdout | app/api/streak/tests/theme.test.ts > Streak API - theme parameter integration tests > should return 200 OK when theme is random +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"b5db7af7-bf39-4ea4-a004-757633492bbd"} + +stdout | app/api/streak/tests/theme.test.ts > Streak API - theme parameter integration tests > should return 200 OK when theme is random +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":12,"requestId":"b5db7af7-bf39-4ea4-a004-757633492bbd"} + +stdout | app/api/streak/tests/theme.test.ts > Streak API - theme parameter integration tests > should return 400 Bad Request when theme parameter is invalid +[INFO] Incoming streak request {"source":"streak","requestId":"e5f73d79-b792-44eb-9ee5-b0580660b359"} + +stdout | app/api/streak/tests/theme.test.ts > Streak API - theme parameter integration tests > should produce different SVGs when theme is dark vs light +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"068e4d06-81e2-4af6-a354-497132b93596"} + +stdout | app/api/streak/tests/theme.test.ts > Streak API - theme parameter integration tests > should produce different SVGs when theme is dark vs light +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":4,"requestId":"068e4d06-81e2-4af6-a354-497132b93596"} + +stdout | app/api/streak/tests/theme.test.ts > Streak API - theme parameter integration tests > should produce different SVGs when theme is dark vs light +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"e2815bbb-6c25-4a76-b6a9-0b6e3b62fa92"} + +stdout | app/api/streak/tests/theme.test.ts > Streak API - theme parameter integration tests > should produce different SVGs when theme is dark vs light +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"e2815bbb-6c25-4a76-b6a9-0b6e3b62fa92"} + + ✓ app/api/streak/tests/theme.test.ts (6 tests) 280ms + ✓ components/dashboard/ResumeUpload.error-resilience.test.tsx (5 tests) 487ms + ✓ lib/export3d.error-resilience.test.tsx (5 tests) 152ms + ✓ services/github/refresh-rate-limiter.theme-contrast.test.ts (5 tests) 78ms + ✓ app/generator/components/GitHubImportModal.test.tsx (5 tests) 292ms + ✓ components/dashboard/RadarChart.empty-fallback.test.tsx (5 tests) 313ms + ✓ app/generator/components/sections/NameSection.responsive-breakpoints.test.tsx (5 tests) 215ms + ✓ app/generator/components/SectionCard.timezone-boundaries.test.tsx (5 tests) 353ms + ✓ components/dashboard/LanguageChart.empty-fallback.test.tsx (5 tests) 261ms + ✓ components/dashboard/GithubWrapped.timezone-boundaries.test.tsx (5 tests) 552ms + ✓ renders correctly in UTC timezone 414ms + ✓ hooks/useGitHubUserExists.test.ts (6 tests) 357ms + ✓ app/customize/components/ControlsPanel.mock-integrations.test.tsx (5 tests) 218ms + ✓ components/dashboard/DeploymentTracker.mock-integrations.test.tsx (6 tests) 409ms + ✓ app/generator/GeneratorClient.error-resilience.test.tsx (5 tests) 193ms +stdout | app/api/streak/route.mouse-interactivity.test.ts > ApiStreakRoute Tests > returns 400 Bad Request when the required user parameter is missing +[INFO] Incoming streak request {"source":"streak","requestId":"a1f332da-b8d7-474c-94bb-81d0c4243429"} + +stdout | app/api/streak/route.mouse-interactivity.test.ts > ApiStreakRoute Tests > returns JSON data when format is set to json +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"e21e8635-fc77-4fbb-af06-2738207af4fa"} + +stdout | app/api/streak/route.mouse-interactivity.test.ts > ApiStreakRoute Tests > returns JSON data when format is set to json +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"json","status":200,"durationMs":48,"requestId":"e21e8635-fc77-4fbb-af06-2738207af4fa"} + +stdout | app/api/streak/route.mouse-interactivity.test.ts > ApiStreakRoute Tests > handles ETag / If-None-Match and returns 304 Not Modified +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"f332303e-9bae-4dcc-8d0e-5755e2b8e19a"} + +stdout | app/api/streak/route.mouse-interactivity.test.ts > ApiStreakRoute Tests > handles ETag / If-None-Match and returns 304 Not Modified +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"json","status":200,"durationMs":8,"requestId":"f332303e-9bae-4dcc-8d0e-5755e2b8e19a"} + +stdout | app/api/streak/route.mouse-interactivity.test.ts > ApiStreakRoute Tests > handles ETag / If-None-Match and returns 304 Not Modified +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"316a9d7a-e6d0-4b1d-8848-938316a90e2a"} + +stdout | app/api/streak/route.mouse-interactivity.test.ts > ApiStreakRoute Tests > handles ETag / If-None-Match and returns 304 Not Modified +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"json","status":200,"durationMs":2,"requestId":"316a9d7a-e6d0-4b1d-8848-938316a90e2a"} + +stdout | app/api/streak/route.mouse-interactivity.test.ts > ApiStreakRoute Tests > bypasses the cache and sets Cache-Control: no-store when refresh is true +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"7fe66d38-3a7c-4408-8d2c-a2eda3858076"} + +stdout | app/api/streak/route.mouse-interactivity.test.ts > ApiStreakRoute Tests > bypasses the cache and sets Cache-Control: no-store when refresh is true +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"json","status":200,"durationMs":3,"requestId":"7fe66d38-3a7c-4408-8d2c-a2eda3858076"} + +stdout | app/api/streak/route.mouse-interactivity.test.ts > ApiStreakRoute Tests > returns SVG image content with Content-Security-Policy header by default +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"bcd47566-1d3e-4ff6-9a90-c89dee043e02"} + +stdout | app/api/streak/route.mouse-interactivity.test.ts > ApiStreakRoute Tests > returns SVG image content with Content-Security-Policy header by default +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"bcd47566-1d3e-4ff6-9a90-c89dee043e02"} + + ✓ app/api/streak/route.mouse-interactivity.test.ts (5 tests) 325ms + ✓ components/ShareButtons.responsive-breakpoints.test.tsx (5 tests) 277ms + ✓ app/customize/components/SectionLabel.mock-integrations.test.tsx (5 tests) 389ms + ✓ lib/validations.empty-fallback.test.ts (8 tests) 479ms + ✓ renders validation fallback warning UI with correct error messages and styles when empty 384ms + ✓ app/api/notify/route.mouse-interactivity.test.ts (5 tests) 336ms +stderr | components/dashboard/CommitClock.mock-integrations.test.tsx > CommitClock: Asynchronous Service Layer Mocking & Local Cache Stubs > Test 1: should mock standard asynchronous imports and databases using stubs +Each child in a list should have a unique "key" prop. + +Check the render method of `svg`. It was passed a child from CommitClock. See https://react.dev/link/warning-keys for more information. + + ✓ components/TopRivalriesTicker.mock-integrations.test.tsx (5 tests) 414ms + ✓ components/dashboard/CommitClock.mock-integrations.test.tsx (5 tests) 356ms + ✓ app/api/streak/animated/route.test.ts (9 tests) 108ms + ✓ app/generator/components/SectionCard.mock-integrations.test.tsx (5 tests) 830ms + ✓ renders pending state overlay when service loading paths are active 498ms +stderr | components/dashboard/ComparisonStatsCard.error-resilience.test.tsx > ComparisonStatsCard Error Resilience > maintains hydration stability and renders without crashing under default properties +React does not recognize the `whileInView` prop on a DOM element. If you intentionally want it to appear in the DOM as a custom attribute, spell it as lowercase `whileinview` instead. If you accidentally passed it from a parent component, remove it from the DOM element. +React does not recognize the `whileHover` prop on a DOM element. If you intentionally want it to appear in the DOM as a custom attribute, spell it as lowercase `whilehover` instead. If you accidentally passed it from a parent component, remove it from the DOM element. + + ✓ components/dashboard/ComparisonStatsCard.error-resilience.test.tsx (5 tests) 791ms + ✓ maintains hydration stability and renders without crashing under default properties 506ms + ✓ components/dashboard/ActivityLandscape.mock-integrations.test.tsx (5 tests) 878ms + ✓ Test 1: should mock all async service calls using vi.fn() and execute without errors 320ms + ✓ components/dashboard/ResumeProfileSection.test.tsx (6 tests) 748ms + ✓ renders upload state initially 429ms + ✓ components/dashboard/RadarChart.error-resilience.test.tsx (5 tests) 560ms +stdout | app/api/streak/route.mock-integrations.test.ts > Asynchronous Service Layer Mocking & Local Cache Stubs > 1. Mock standard asynchronous imports and databases using stubs +[INFO] Incoming streak request {"source":"streak","user":"testuser","view":"default","requestId":"f52cc1f4-8ddd-4f8d-b40b-b2f6af75c7e1"} + + ✓ components/dashboard/PopularPinnnedRepos.timezone-boundaries.test.tsx (5 tests) 382ms + ✓ normalizes same UTC timestamp correctly across UTC, EST, IST and JST 324ms +stdout | app/api/streak/route.mock-integrations.test.ts > Asynchronous Service Layer Mocking & Local Cache Stubs > 1. Mock standard asynchronous imports and databases using stubs +[INFO] Streak request completed {"source":"streak","user":"testuser","view":"default","format":"svg","status":200,"durationMs":90,"requestId":"f52cc1f4-8ddd-4f8d-b40b-b2f6af75c7e1"} + +stderr | app/layout.empty-fallback.test.tsx > Edge Cases & Empty/Missing Inputs Verification > 1. Render the target module or component with empty arrays or null parameters +In HTML, <html> cannot be a child of <div>. +This will cause a hydration error. + +stdout | app/api/streak/route.mock-integrations.test.ts > Asynchronous Service Layer Mocking & Local Cache Stubs > 2. Test service loading paths to ensure pending state overlays render +[INFO] Incoming streak request {"source":"streak","user":"testuser","view":"default","requestId":"84d50b11-f1c0-4e17-82e4-d1baafb2e179"} + +stdout | app/api/streak/route.mock-integrations.test.ts > Asynchronous Service Layer Mocking & Local Cache Stubs > 2. Test service loading paths to ensure pending state overlays render +[INFO] Streak request completed {"source":"streak","user":"testuser","view":"default","format":"svg","status":200,"durationMs":17,"requestId":"84d50b11-f1c0-4e17-82e4-d1baafb2e179"} + +stdout | app/api/streak/route.mock-integrations.test.ts > Asynchronous Service Layer Mocking & Local Cache Stubs > 3. Assert local cache layers are queried before triggering database retrievals +[INFO] Incoming streak request {"source":"streak","user":"cacheduser","view":"default","requestId":"6bd20e0a-fa88-4be0-ae31-1da8f23f2eb4"} + +stdout | app/api/streak/route.mock-integrations.test.ts > Asynchronous Service Layer Mocking & Local Cache Stubs > 3. Assert local cache layers are queried before triggering database retrievals +[INFO] Streak request completed {"source":"streak","user":"cacheduser","view":"default","format":"svg","status":200,"durationMs":13,"requestId":"6bd20e0a-fa88-4be0-ae31-1da8f23f2eb4"} + +stdout | app/api/streak/route.mock-integrations.test.ts > Asynchronous Service Layer Mocking & Local Cache Stubs > 3. Assert local cache layers are queried before triggering database retrievals +[INFO] Incoming streak request {"source":"streak","user":"cacheduser","view":"default","requestId":"22108513-be4a-40da-b9bb-09afa60cfa09"} + +stdout | app/api/streak/route.mock-integrations.test.ts > Asynchronous Service Layer Mocking & Local Cache Stubs > 3. Assert local cache layers are queried before triggering database retrievals +[INFO] Streak request completed {"source":"streak","user":"cacheduser","view":"default","format":"svg","status":200,"durationMs":39,"requestId":"22108513-be4a-40da-b9bb-09afa60cfa09"} + +stdout | app/api/streak/route.mock-integrations.test.ts > Asynchronous Service Layer Mocking & Local Cache Stubs > 4. Verify correct fallback procedures during fake endpoint timeout blocks +[INFO] Incoming streak request {"source":"streak","user":"timeoutuser","view":"default","requestId":"736b37eb-9d4a-4dcb-866c-5e29d8f61130"} + +stdout | app/api/streak/route.mock-integrations.test.ts > Asynchronous Service Layer Mocking & Local Cache Stubs > 4. Verify correct fallback procedures during fake endpoint timeout blocks +[INFO] Streak request completed {"source":"streak","user":"timeoutuser","view":"default","format":"svg","status":200,"durationMs":17,"requestId":"736b37eb-9d4a-4dcb-866c-5e29d8f61130"} + +stdout | app/api/streak/route.mock-integrations.test.ts > Asynchronous Service Layer Mocking & Local Cache Stubs > 5. Assert complete cache sync is written on success callbacks +[INFO] Incoming streak request {"source":"streak","user":"syncuser","view":"default","requestId":"666d6f26-ce62-4e90-b49a-cc321357f153"} + + ✓ app/layout.empty-fallback.test.tsx (5 tests) 678ms + ✓ 1. Render the target module or component with empty arrays or null parameters 368ms +stdout | app/api/streak/route.mock-integrations.test.ts > Asynchronous Service Layer Mocking & Local Cache Stubs > 5. Assert complete cache sync is written on success callbacks +[INFO] Streak request completed {"source":"streak","user":"syncuser","view":"default","format":"svg","status":200,"durationMs":17,"requestId":"666d6f26-ce62-4e90-b49a-cc321357f153"} + + ✓ app/api/streak/route.mock-integrations.test.ts (5 tests) 1212ms + ✓ 1. Mock standard asynchronous imports and databases using stubs 796ms + ✓ components/dashboard/AIInsights.test.tsx (5 tests) 346ms +stderr | middleware.test.ts > middleware > ignores spoofed X-Forwarded-For when request.ip is present +{"timestamp":"2026-07-23T03:33:48.338Z","type":"SECURITY_EVENT","event":"SPOOFED_HEADER_ATTEMPT","claimedIp":"1.2.3.4","resolvedIp":"203.0.113.10","header":"x-forwarded-for"} + +stderr | middleware.test.ts > middleware integration tests (rate-limit spoofing prevention) > Scenario 1: Default (No trusted proxies) ignores spoofed headers and locks rate limit to default/connection IP +{"timestamp":"2026-06-26T06:32:00.000Z","type":"SECURITY_EVENT","event":"UNTRUSTED_FORWARDED_HEADER_IGNORED","resolvedIp":"unknown","header":"x-forwarded-for"} + +stderr | middleware.test.ts > middleware integration tests (rate-limit spoofing prevention) > Scenario 1b: Default (No trusted proxies) uses connection IP (request.ip) and ignores spoofed X-Forwarded-For +{"timestamp":"2026-06-26T06:34:00.000Z","type":"SECURITY_EVENT","event":"SPOOFED_HEADER_ATTEMPT","claimedIp":"1.2.3.0","resolvedIp":"192.0.2.200","header":"x-forwarded-for"} + + ✓ hooks/useGlowEffect.timezone-boundaries.test.ts (5 tests) 303ms + ✓ components/dashboard/RadarChart.theme-contrast.test.tsx (5 tests) 599ms + ✓ middleware.test.ts (13 tests) 434ms + ✓ utils/urls.theme-contrast.test.ts (5 tests) 165ms +stdout | app/api/streak/tests/dimensions.test.ts > Integration Test: API Streak Dimensions Parameter Group > Test 1: should return 200 OK for valid custom dimensions +[INFO] Incoming streak request {"source":"streak","user":"JhaSourav07","view":"default","requestId":"76c0d12d-6723-4dda-a70c-94aae06b1c88"} + +stderr | app/api/streak/tests/dimensions.test.ts > Integration Test: API Streak Dimensions Parameter Group > Test 1: should return 200 OK for valid custom dimensions +[CommitPulse API] Empty profile or null repository nodes discovered for user "JhaSourav07". Falling back to baseline collection. + +stdout | app/api/streak/tests/dimensions.test.ts > Integration Test: API Streak Dimensions Parameter Group > Test 1: should return 200 OK for valid custom dimensions +[INFO] Streak request completed {"source":"streak","user":"JhaSourav07","view":"default","format":"svg","status":200,"durationMs":73,"requestId":"76c0d12d-6723-4dda-a70c-94aae06b1c88"} + +stdout | app/api/streak/tests/dimensions.test.ts > Integration Test: API Streak Dimensions Parameter Group > Test 2: should reflect dimension changes directly in the rendered SVG +[INFO] Incoming streak request {"source":"streak","user":"JhaSourav07","view":"default","requestId":"c5daed26-3e72-421a-835c-63d6e91559eb"} + +stderr | app/api/streak/tests/dimensions.test.ts > Integration Test: API Streak Dimensions Parameter Group > Test 2: should reflect dimension changes directly in the rendered SVG +[CommitPulse API] Empty profile or null repository nodes discovered for user "JhaSourav07". Falling back to baseline collection. + +stdout | app/api/streak/tests/dimensions.test.ts > Integration Test: API Streak Dimensions Parameter Group > Test 2: should reflect dimension changes directly in the rendered SVG +[INFO] Streak request completed {"source":"streak","user":"JhaSourav07","view":"default","format":"svg","status":200,"durationMs":9,"requestId":"c5daed26-3e72-421a-835c-63d6e91559eb"} + +stdout | app/api/streak/tests/dimensions.test.ts > Integration Test: API Streak Dimensions Parameter Group > Test 3: should reject negative dimensions with a 400 Bad Request +[INFO] Incoming streak request {"source":"streak","requestId":"0bb303da-8bbf-4e2a-984d-87336a664e19"} + +stdout | app/api/streak/tests/dimensions.test.ts > Integration Test: API Streak Dimensions Parameter Group > Test 4: should handle completely invalid string inputs by rejecting with 400 +[INFO] Incoming streak request {"source":"streak","requestId":"0ae7b629-09d5-4f50-bb96-d215e86c8115"} + +stdout | app/api/streak/tests/dimensions.test.ts > Integration Test: API Streak Dimensions Parameter Group > Test 5: should return appropriate HTTP headers for SVG rendering +[INFO] Incoming streak request {"source":"streak","user":"JhaSourav07","view":"default","requestId":"187eaf74-7e20-460b-97e5-c5526e8e3c10"} + +stderr | app/api/streak/tests/dimensions.test.ts > Integration Test: API Streak Dimensions Parameter Group > Test 5: should return appropriate HTTP headers for SVG rendering +[CommitPulse API] Empty profile or null repository nodes discovered for user "JhaSourav07". Falling back to baseline collection. + +stdout | app/api/streak/tests/dimensions.test.ts > Integration Test: API Streak Dimensions Parameter Group > Test 5: should return appropriate HTTP headers for SVG rendering +[INFO] Streak request completed {"source":"streak","user":"JhaSourav07","view":"default","format":"svg","status":200,"durationMs":22,"requestId":"187eaf74-7e20-460b-97e5-c5526e8e3c10"} + + ✓ app/api/streak/tests/dimensions.test.ts (5 tests) 239ms +stderr | lib/cache.test.ts > DistributedCache > fails closed on incr() when Redis errors, instead of using an unsynced local counter +[ERROR] Cache INCR failed — failing closed to avoid bypassing distributed rate limits {"component":"DistributedCache","key":"[REDACTED]","error":{}} + +stderr | lib/cache.test.ts > DistributedCache > fails closed on incr() when Redis errors, instead of using an unsynced local counter +[ERROR] Cache INCR failed — failing closed to avoid bypassing distributed rate limits {"component":"DistributedCache","key":"[REDACTED]","error":{}} + +stderr | lib/cache.test.ts > DistributedCache > localLocks memory leak prevention > Behavior 3: Safety Eviction (Fixes #6177) +[ERROR] Safety eviction triggered for hanging lock {"component":"DistributedCache","key":"[REDACTED]"} + + ✓ lib/cache.test.ts (72 tests) 129ms + ✓ components/dashboard/DependencyIntelligenceCenter.test.tsx (2 tests) 265ms + ✓ app/api/student/resume/upload/route.empty-fallback.test.ts (5 tests) 26ms + ✓ app/customize/components/SectionLabel.error-resilience.test.tsx (5 tests) 227ms + ✓ components/dashboard/AIInsightsSkeleton.mouse-interactivity.test.tsx (5 tests) 275ms + ✓ components/TopRivalriesTicker.error-resilience.test.tsx (5 tests) 334ms + ✓ utils/dashboardPeriod.theme-contrast.test.ts (5 tests) 163ms + ✓ components/dashboard/PRInsights/Highlights.responsive-breakpoints.test.tsx (5 tests) 608ms + ✓ 1. mocks standard mobile-width media coordinates (e.g. 375px wide viewports) 403ms + ✓ components/dashboard/PopularPinnnedRepos.responsive-breakpoints.test.tsx (5 tests) 206ms + ✓ components/ReturnToTop.error-resilience.test.tsx (5 tests) 464ms + ✓ components/dashboard/ResumeUpload.test.tsx (5 tests) 619ms + ✓ shows error for invalid file type 327ms +stderr | app/api/stats/route.mouse-interactivity.test.ts > ApiStatsRoute Tests > returns 400 Bad Request when required user parameter is missing or invalid +{"timestamp":"2026-07-23T03:33:57.362Z","type":"SECURITY_EVENT","event":"UNTRUSTED_FORWARDED_HEADER_IGNORED","resolvedIp":"unknown","header":"x-forwarded-for"} + +stderr | app/api/stats/route.mouse-interactivity.test.ts > ApiStatsRoute Tests > returns 429 when refresh is requested and quota monitor is low +{"timestamp":"2026-07-23T03:33:57.411Z","type":"SECURITY_EVENT","event":"LOW_QUOTA_STATS_REFRESH_BLOCKED","user":"octocat","ip":"127.0.0.1","remainingQuota":5000} + +stderr | app/api/stats/route.mouse-interactivity.test.ts > ApiStatsRoute Tests > returns 429 when refresh is requested and rate limit check fails +{"timestamp":"2026-07-23T03:33:57.416Z","type":"SECURITY_EVENT","event":"STATS_REFRESH_RATE_LIMIT_EXCEEDED","user":"octocat","ip":"127.0.0.1","limit":10} + +stderr | app/api/stats/route.mouse-interactivity.test.ts > ApiStatsRoute Tests > serves cached data and returns Cooldown-Served-Cached header if refresh is requested during cooldown window +{"timestamp":"2026-07-23T03:33:57.421Z","type":"SECURITY_EVENT","event":"STATS_REFRESH_COOLDOWN_VIOLATION","user":"octocat","ip":"127.0.0.1","remainingMs":0} + + ✓ app/api/stats/route.mouse-interactivity.test.ts (6 tests) 90ms + ✓ components/Leaderboard.empty-fallback.test.tsx (5 tests) 367ms + ✓ app/api/wrapped/route.responsive-breakpoints.test.tsx (5 tests) 301ms + ✓ app/generator/data/technologies.mouse-interactivity.test.tsx (5 tests) 261ms + ✓ components/dashboard/ProfileOptimizerModal.error-resilience.test.tsx (5 tests) 423ms + ✓ components/TopRivalriesTicker.test.tsx (2 tests) 278ms + ✓ components/dashboard/StatsCard.empty-fallback.test.tsx (5 tests) 413ms + ✓ uses fallback icon when icon name is unknown 309ms + ✓ components/dashboard/RadarChart.mock-integrations.test.tsx (5 tests) 333ms + ✓ components/commitpulse-logo.mouse-interactivity.test.tsx (5 tests) 356ms + ✓ app/api/stats/route.timezone-boundaries.test.ts (6 tests) 84ms + ✓ components/AnimatedCursor.timezone-boundaries.test.tsx (5 tests) 255ms + ✓ utils/time.test.ts (39 tests) 120ms + ✓ models/Notification.mock-integrations.test.ts (5 tests) 74ms + ✓ app/api/compare/tests/validation.test.ts (5 tests) 53ms + ✓ app/compare/page.responsive-breakpoints.test.tsx (5 tests) 271ms + ✓ components/dashboard/ResumePreviewForm.theme-contrast.test.tsx (5 tests) 268ms + ✓ components/dashboard/StatsCardSkeleton.mock-integrations.test.tsx (5 tests) 283ms + ✓ app/contributors/loading.responsive-breakpoints.test.tsx (3 tests) 111ms + ✓ lib/calculate.multiyear-scaling.test.ts (5 tests) 171ms +stdout | app/api/github/route.test.ts > Unrestricted Cache Bypass & Abuse Mitigation (Issue #1978) > Scenario 1: serves cached data and checks SWR background refresh +[BackgroundRefresh] Queuing background refresh for: torvalds + +stdout | app/api/github/route.test.ts > Unrestricted Cache Bypass & Abuse Mitigation (Issue #1978) > Scenario 1: serves cached data and checks SWR background refresh +[BackgroundRefresh] Successfully completed background refresh for: torvalds + +stderr | app/api/github/route.test.ts > Unrestricted Cache Bypass & Abuse Mitigation (Issue #1978) > Scenario 3: serves cached response for repeated refresh requests within cooldown +[WARN] Security event {"type":"SECURITY_EVENT","event":"REFRESH_COOLDOWN_VIOLATION","username":"torvalds","ip":"127.0.0.1","remainingMs":29997} + +stderr | app/api/github/route.test.ts > Unrestricted Cache Bypass & Abuse Mitigation (Issue #1978) > Scenario 4: returns 429 when client refresh rate limit is exceeded +{"timestamp":"2026-07-23T03:34:05.739Z","type":"SECURITY_EVENT","event":"UNTRUSTED_FORWARDED_HEADER_IGNORED","resolvedIp":"unknown","header":"x-real-ip"} + +stderr | app/api/github/route.test.ts > Unrestricted Cache Bypass & Abuse Mitigation (Issue #1978) > Scenario 4: returns 429 when client refresh rate limit is exceeded +[WARN] Security event {"type":"SECURITY_EVENT","event":"REFRESH_RATE_LIMIT_EXCEEDED","username":"torvalds","ip":"127.0.0.1","limit":2} + +stderr | app/api/github/route.test.ts > Unrestricted Cache Bypass & Abuse Mitigation (Issue #1978) > Scenario 5: blocks manual refresh when remaining GitHub quota is low (<10%) +[WARN] Security event {"type":"SECURITY_EVENT","event":"LOW_QUOTA_REFRESH_BLOCKED","username":"torvalds","ip":"127.0.0.1","remainingQuota":400} + +stdout | app/api/github/route.test.ts > Unrestricted Cache Bypass & Abuse Mitigation (Issue #1978) > Scenario 6: asynchronous background refresh completes successfully +[BackgroundRefresh] Queuing background refresh for: torvalds + +stdout | app/api/github/route.test.ts > Unrestricted Cache Bypass & Abuse Mitigation (Issue #1978) > Scenario 6: asynchronous background refresh completes successfully +[BackgroundRefresh] Successfully completed background refresh for: torvalds + + ✓ app/api/github/route.test.ts (14 tests) 192ms + ✓ components/dashboard/ProfileOptimizerModal.responsive-breakpoints.test.tsx (5 tests) 227ms +stderr | app/api/student/resume/tests/confirm.test.ts > POST /api/student/resume/confirm > returns 500 when database update fails +[ERROR] Failed to save student profile {"error":{}} + + ✓ app/api/student/resume/tests/confirm.test.ts (11 tests) 94ms + ✓ lib/calculate.empty-fallback.test.ts (21 tests) 157ms + ✓ app/customize/components/AdvancedSettingsPanel.test.tsx (2 tests) 298ms + ✓ app/api/og/route.timezone-boundaries.test.tsx (5 tests) 330ms +stderr | components/dashboard/AIInsights.type-compiler.test.tsx > AIInsights — TypeScript Compiler Validation & Schema Constraints Stability > validates that AIInsight fields id, icon, and text are all required strings +React does not recognize the `whileInView` prop on a DOM element. If you intentionally want it to appear in the DOM as a custom attribute, spell it as lowercase `whileinview` instead. If you accidentally passed it from a parent component, remove it from the DOM element. + + ✓ components/ShareButtons.timezone-boundaries.test.tsx (5 tests) 310ms + ✓ components/dashboard/AIInsights.type-compiler.test.tsx (5 tests) 247ms + ✓ app/api/og/route.error-resilience.test.tsx (5 tests) 392ms + ✓ components/dashboard/PRInsights/ReviewAnalytics.responsive-breakpoints.test.tsx (5 tests) 297ms + ✓ app/api/og/route.empty-fallback.test.tsx (5 tests) 287ms + ✓ lib/graph/types.accessibility.test.ts (5 tests) 93ms + ✓ app/compare/page.error-resilience.test.tsx (5 tests) 111ms + ✓ app/components/Icons.timezone-boundaries.test.tsx (5 tests) 133ms + ✓ lib/svg/generator.opacity.test.ts (16 tests) 105ms + ✓ components/dashboard/StatsCardSkeleton.error-resilience.test.tsx (5 tests) 211ms + ✓ locales/parity.test.ts (34 tests) 50ms +stdout | app/api/streak/tests/views.test.ts > GET /api/streak view parameter integration > returns 200 and the standard SVG headers for view=default +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"30602de2-103f-40b6-9fc5-24eb64adcb8a"} + +stdout | app/api/streak/tests/views.test.ts > GET /api/streak view parameter integration > returns 200 and the standard SVG headers for view=default +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":29,"requestId":"30602de2-103f-40b6-9fc5-24eb64adcb8a"} + +stdout | app/api/streak/tests/views.test.ts > GET /api/streak view parameter integration > returns 200 and renders monthly dimensions for view=monthly +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"monthly","requestId":"610cfed4-f109-4300-8d3f-d5c52030818b"} + +stdout | app/api/streak/tests/views.test.ts > GET /api/streak view parameter integration > returns 200 and renders monthly dimensions for view=monthly +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"monthly","format":"svg","status":200,"durationMs":4,"requestId":"610cfed4-f109-4300-8d3f-d5c52030818b"} + +stdout | app/api/streak/tests/views.test.ts > GET /api/streak view parameter integration > falls back to the default layout when view is omitted +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"97b872e2-6b52-46a4-904a-d42d8f941a24"} + +stdout | app/api/streak/tests/views.test.ts > GET /api/streak view parameter integration > falls back to the default layout when view is omitted +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"97b872e2-6b52-46a4-904a-d42d8f941a24"} + +stdout | app/api/streak/tests/views.test.ts > GET /api/streak view parameter integration > treats an invalid view value as default without crashing +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"a7d09200-a997-44b2-abdd-d2083032ac3c"} + +stdout | app/api/streak/tests/views.test.ts > GET /api/streak view parameter integration > treats an invalid view value as default without crashing +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"a7d09200-a997-44b2-abdd-d2083032ac3c"} + +stdout | app/api/streak/tests/views.test.ts > GET /api/streak view parameter integration > returns 200 and renders radar map for view=radar +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"radar","requestId":"fe5a719d-69c2-4536-a089-4bf63f91c338"} + +stdout | app/api/streak/tests/views.test.ts > GET /api/streak view parameter integration > returns 200 and renders radar map for view=radar +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"radar","format":"svg","status":200,"durationMs":2,"requestId":"fe5a719d-69c2-4536-a089-4bf63f91c338"} + +stdout | app/api/streak/tests/views.test.ts > GET /api/streak view parameter integration > exposes stable caching headers on the SVG response +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"8c11a701-7722-4e4d-bdb3-7353bb090457"} + +stdout | app/api/streak/tests/views.test.ts > GET /api/streak view parameter integration > exposes stable caching headers on the SVG response +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"8c11a701-7722-4e4d-bdb3-7353bb090457"} + + ✓ app/api/streak/tests/views.test.ts (6 tests) 165ms + ✓ components/dashboard/StatsCardSkeleton.timezone-boundaries.test.tsx (5 tests) 173ms + ✓ app/components/theme-switch.theme-contrast.test.ts (5 tests) 296ms +stderr | app/api/notify/route.delete.test.ts > DELETE /api/notify > bypasses gracefully when MONGODB_URI is not set in development +MONGODB_URI is not set. Bypassing notification deletion for local development. + + ✓ app/api/notify/route.delete.test.ts (4 tests) 60ms + ✓ services/github/background-refresh.empty-fallback.test.ts (5 tests) 83ms + ✓ components/dashboard/AchievementsSkeleton.test.tsx (4 tests) 254ms +stdout | app/api/streak/tests/refresh.test.ts > GET /api/streak - refresh parameter group > returns status 200 for valid requests with custom refresh values +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"79c034a7-3a75-4dcc-b584-7b4e31538ecc"} + +stdout | app/api/streak/tests/refresh.test.ts > GET /api/streak - refresh parameter group > returns status 200 for valid requests with custom refresh values +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":31,"requestId":"79c034a7-3a75-4dcc-b584-7b4e31538ecc"} + +stdout | app/api/streak/tests/refresh.test.ts > GET /api/streak - refresh parameter group > correctly reflects changes dictated by the parameter by forwarding bypassCache to the fetcher +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"3ced25dd-b0c2-431e-903a-53ad65c29f2d"} + +stdout | app/api/streak/tests/refresh.test.ts > GET /api/streak - refresh parameter group > correctly reflects changes dictated by the parameter by forwarding bypassCache to the fetcher +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"3ced25dd-b0c2-431e-903a-53ad65c29f2d"} + +stdout | app/api/streak/tests/refresh.test.ts > GET /api/streak - refresh parameter group > tests negative and fallback edge cases for invalid inputs of refresh +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"423b8c6c-a2b9-45f4-93a0-3747dd8263ff"} + +stdout | app/api/streak/tests/refresh.test.ts > GET /api/streak - refresh parameter group > tests negative and fallback edge cases for invalid inputs of refresh +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":4,"requestId":"423b8c6c-a2b9-45f4-93a0-3747dd8263ff"} + +stdout | app/api/streak/tests/refresh.test.ts > GET /api/streak - refresh parameter group > tests negative and fallback edge cases for invalid inputs of refresh +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"69f00bb6-50ce-49b1-a6f0-17f8a77ce6b4"} + +stdout | app/api/streak/tests/refresh.test.ts > GET /api/streak - refresh parameter group > tests negative and fallback edge cases for invalid inputs of refresh +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"69f00bb6-50ce-49b1-a6f0-17f8a77ce6b4"} + +stdout | app/api/streak/tests/refresh.test.ts > GET /api/streak - refresh parameter group > tests negative and fallback edge cases for invalid inputs of refresh +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"2718d81f-19c3-4521-be22-9e952d061119"} + +stdout | app/api/streak/tests/refresh.test.ts > GET /api/streak - refresh parameter group > tests negative and fallback edge cases for invalid inputs of refresh +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":5,"requestId":"2718d81f-19c3-4521-be22-9e952d061119"} + +stdout | app/api/streak/tests/refresh.test.ts > GET /api/streak - refresh parameter group > tests negative and fallback edge cases for invalid inputs of refresh +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"ea793ae6-4ddb-4858-b1fe-44154839a19a"} + +stdout | app/api/streak/tests/refresh.test.ts > GET /api/streak - refresh parameter group > tests negative and fallback edge cases for invalid inputs of refresh +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":4,"requestId":"ea793ae6-4ddb-4858-b1fe-44154839a19a"} + +stdout | app/api/streak/tests/refresh.test.ts > GET /api/streak - refresh parameter group > tests negative and fallback edge cases for invalid inputs of refresh +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"da27c25c-cfbc-45fc-ae8e-e9dc9602a1d7"} + +stdout | app/api/streak/tests/refresh.test.ts > GET /api/streak - refresh parameter group > tests negative and fallback edge cases for invalid inputs of refresh +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":4,"requestId":"da27c25c-cfbc-45fc-ae8e-e9dc9602a1d7"} + +stdout | app/api/streak/tests/refresh.test.ts > GET /api/streak - refresh parameter group > asserts that appropriate HTTP headers are returned in responses (cache bypass) +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"3a47f6d7-d6d1-455c-9d80-8c5101d6a815"} + +stdout | app/api/streak/tests/refresh.test.ts > GET /api/streak - refresh parameter group > asserts that appropriate HTTP headers are returned in responses (cache bypass) +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"3a47f6d7-d6d1-455c-9d80-8c5101d6a815"} + +stdout | app/api/streak/tests/refresh.test.ts > GET /api/streak - refresh parameter group > asserts that appropriate HTTP headers are returned in responses (normal cache fallback) +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"90d458e9-e411-4afa-888a-b01024dd27c5"} + +stdout | app/api/streak/tests/refresh.test.ts > GET /api/streak - refresh parameter group > asserts that appropriate HTTP headers are returned in responses (normal cache fallback) +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"90d458e9-e411-4afa-888a-b01024dd27c5"} + +stdout | app/api/streak/tests/refresh.test.ts > GET /api/streak - refresh parameter group > returns rate limit status when GitHub API quota is low +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"45c88e58-c1b7-40b7-abe2-709b257a777a"} + +stdout | app/api/streak/tests/refresh.test.ts > GET /api/streak - refresh parameter group > returns rate limit status when IP refresh limit is exceeded +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"dd88b591-0435-407a-9d27-38305ccaba12"} + +stderr | app/api/streak/tests/refresh.test.ts > GET /api/streak - refresh parameter group > returns rate limit status when IP refresh limit is exceeded +{"timestamp":"2026-07-23T03:34:17.208Z","type":"SECURITY_EVENT","event":"UNTRUSTED_FORWARDED_HEADER_IGNORED","resolvedIp":"unknown","header":"x-forwarded-for"} + +stdout | app/api/streak/tests/refresh.test.ts > GET /api/streak - refresh parameter group > returns rate limit status when IP refresh limit is exceeded +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"dd88b591-0435-407a-9d27-38305ccaba12"} + +stdout | app/api/streak/tests/refresh.test.ts > GET /api/streak - refresh parameter group > returns rate limit status when IP refresh limit is exceeded +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"b6a502cd-30d1-441e-b167-ba49c349c822"} + +stdout | app/api/streak/tests/refresh.test.ts > GET /api/streak - refresh parameter group > falls back to cached data when per-username cooldown is active +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"84106655-5598-4ae1-9f2d-0d44f71b7976"} + +stdout | app/api/streak/tests/refresh.test.ts > GET /api/streak - refresh parameter group > falls back to cached data when per-username cooldown is active +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"84106655-5598-4ae1-9f2d-0d44f71b7976"} + +stdout | app/api/streak/tests/refresh.test.ts > GET /api/streak - refresh parameter group > falls back to cached data when per-username cooldown is active +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"ec0bc585-59c2-4b35-ae4a-48aeb19e52f3"} + +stdout | app/api/streak/tests/refresh.test.ts > GET /api/streak - refresh parameter group > falls back to cached data when per-username cooldown is active +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":0,"requestId":"ec0bc585-59c2-4b35-ae4a-48aeb19e52f3"} + +stdout | app/api/streak/tests/refresh.test.ts > GET /api/streak - refresh parameter group > returns JSON error response when JSON format is requested and rate limit is hit +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"ef7ee724-ba83-44b6-8d58-2c71c3fc6e3e"} + + ✓ app/api/streak/tests/refresh.test.ts (9 tests) 292ms + ✓ components/dashboard/ResumePreviewForm.timezone-boundaries.test.tsx (5 tests) 116ms + ✓ app/api/compare/route.mouse-interactivity.test.ts (6 tests) 78ms + ✓ components/dashboard/ActivityLandscape.responsive-breakpoints.test.tsx (5 tests) 256ms + ✓ components/dashboard/PRInsights/PRStatusDistribution.empty-fallback.test.tsx (5 tests) 384ms + ✓ components/dashboard/ProfileOptimizerModal.mouse-interactivity.test.tsx (5 tests) 245ms + ✓ components/ShareButtons.mock-integrations.test.tsx (5 tests) 247ms + ✓ components/commitpulse-logo.responsive-breakpoints.test.tsx (5 tests) 235ms +stderr | components/Leaderboard.theme-contrast.test.tsx > Leaderboard theme contrast behavior > renders leaderboard container +React does not recognize the `whileInView` prop on a DOM element. If you intentionally want it to appear in the DOM as a custom attribute, spell it as lowercase `whileinview` instead. If you accidentally passed it from a parent component, remove it from the DOM element. +React does not recognize the `whileHover` prop on a DOM element. If you intentionally want it to appear in the DOM as a custom attribute, spell it as lowercase `whilehover` instead. If you accidentally passed it from a parent component, remove it from the DOM element. + + ✓ components/Leaderboard.theme-contrast.test.tsx (5 tests) 268ms + ✓ components/dashboard/PRInsights/RepoPerformanceTable.empty-fallback.test.tsx (5 tests) 139ms + ✓ app/components/Icons.theme-contrast.test.tsx (5 tests) 155ms +stderr | components/dashboard/AIInsights.error-resilience.test.tsx > AIInsights Error Resilience & Robustness > handles insights with missing id field gracefully +Each child in a list should have a unique "key" prop. + +Check the render method of `AIInsights`. See https://react.dev/link/warning-keys for more information. +React does not recognize the `whileInView` prop on a DOM element. If you intentionally want it to appear in the DOM as a custom attribute, spell it as lowercase `whileinview` instead. If you accidentally passed it from a parent component, remove it from the DOM element. + + ✓ components/dashboard/AIInsights.error-resilience.test.tsx (5 tests) 221ms + ✓ hooks/useLocalStorage.test.ts (6 tests) 209ms +stderr | app/api/repo-burnout/route.test.ts > GET /api/repo-burnout > returns 400 when owner or repo is missing +{"timestamp":"2026-07-23T03:34:23.040Z","type":"SECURITY_EVENT","event":"UNTRUSTED_FORWARDED_HEADER_IGNORED","resolvedIp":"unknown","header":"x-forwarded-for"} + +stderr | app/api/repo-burnout/route.test.ts > GET /api/repo-burnout > returns 429 when GitHub API quota is low and refresh is requested +[Quota Low] Blocked manual refresh from IP 127.0.0.1 for octocat/hello-world + +stderr | app/api/repo-burnout/route.test.ts > GET /api/repo-burnout > returns 429 when IP refresh limit is exceeded +[Rate Limit Exceeded] Blocked manual refresh from IP 127.0.0.1 for octocat/hello-world + +stderr | app/api/repo-burnout/route.test.ts > GET /api/repo-burnout > returns 429 when GitHub API quota is low and bypassCache is requested +[Quota Low] Blocked manual refresh from IP 127.0.0.1 for octocat/hello-world + +stderr | app/api/repo-burnout/route.test.ts > GET /api/repo-burnout > returns 429 when IP refresh limit is exceeded for bypassCache +[Rate Limit Exceeded] Blocked manual refresh from IP 127.0.0.1 for octocat/hello-world + +stderr | app/api/repo-burnout/route.test.ts > GET /api/repo-burnout > shares rate limit between refresh and bypassCache parameters +[Rate Limit Exceeded] Blocked manual refresh from IP 127.0.0.1 for octocat/hello-world + +stderr | app/api/repo-burnout/route.test.ts > GET /api/repo-burnout > returns 404 when repository is not found +Error in /api/repo-burnout for octocat/nonexistent: Error: not found + at /home/atulupadhyay/Contribution/commitpulse/app/api/repo-burnout/route.test.ts:189:55 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:302:11 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:1903:26 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2326:20 + at new Promise (<anonymous>) + at runWithCancel (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2323:10) + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2305:20 + at new Promise (<anonymous>) + at runWithTimeout (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2272:10) + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2955:64 + +stderr | app/api/repo-burnout/route.test.ts > GET /api/repo-burnout > returns 500 with generic error message for unexpected errors +Error in /api/repo-burnout for octocat/hello-world: Error: Database connection failed + at /home/atulupadhyay/Contribution/commitpulse/app/api/repo-burnout/route.test.ts:197:55 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:302:11 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:1903:26 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2326:20 + at new Promise (<anonymous>) + at runWithCancel (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2323:10) + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2305:20 + at new Promise (<anonymous>) + at runWithTimeout (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2272:10) + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2955:64 + +stderr | app/api/repo-burnout/route.test.ts > GET /api/repo-burnout > returns 500 with generic error message for non-Error thrown values +Error in /api/repo-burnout for octocat/hello-world: unexpected failure + + ✓ app/api/repo-burnout/route.test.ts (14 tests) 171ms + ✓ components/dashboard/ComparisonStatsCard.empty-fallback.test.tsx (4 tests) 290ms + ✓ types/network.empty-fallback.test.ts (5 tests) 44ms + ✓ lib/svg/themes/lumos.test.ts (5 tests) 297ms + ✓ components/dashboard/ResumeUpload.empty-fallback.test.tsx (6 tests) 375ms + ✓ hooks/useDebounce.empty-fallback.test.ts (5 tests) 248ms + ✓ hooks/useLocalStorage.error-resilience.test.ts (5 tests) 200ms + ✓ models/Notification.timezone-boundaries.test.ts (5 tests) 149ms + ✓ components/dashboard/StatsCardSkeleton.responsive-breakpoints.test.tsx (5 tests) 241ms + ✓ app/components/Icons.responsive-breakpoints.test.tsx (5 tests) 201ms + ✓ scripts/benchmark-svg.test.ts (8 tests) 173ms +stderr | app/contributors/page.error-resilience.test.tsx > ContributorsPage Error Resilience > handles failed contributor fetches without crashing +[ERROR] Failed to fetch contributors {"error":{}} + +stderr | app/contributors/page.error-resilience.test.tsx > ContributorsPage Error Resilience > handles rate limit responses gracefully +[ERROR] Failed to fetch contributors {"error":{}} + +stderr | app/contributors/page.error-resilience.test.tsx > ContributorsPage Error Resilience > passes empty contributor collections after fetch failures +[ERROR] Failed to fetch contributors {"error":{}} + +stderr | app/contributors/page.error-resilience.test.tsx > ContributorsPage Error Resilience > continues rendering when unexpected service exceptions occur +[ERROR] Failed to fetch contributors {"error":{}} + + ✓ app/contributors/page.error-resilience.test.tsx (5 tests) 122ms + ✓ app/api/wakatime/route.test.ts (3 tests) 96ms + ✓ components/dashboard/ResumeProfileSection.empty-fallback.test.tsx (5 tests) 533ms + ✓ renders successfully with empty github username 357ms +stdout | app/api/streak/tests/staleWatermark.test.ts > GET /api/streak stale watermark > adds the stale watermark when the fetcher returns offline fallback data +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"276b9cd9-9eaa-429e-af42-3bba0f9d277c"} + +stdout | app/api/streak/tests/staleWatermark.test.ts > GET /api/streak stale watermark > adds the stale watermark when the fetcher returns offline fallback data +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":103,"requestId":"276b9cd9-9eaa-429e-af42-3bba0f9d277c"} + +stdout | app/api/streak/tests/staleWatermark.test.ts > GET /api/streak stale watermark > does not add the stale watermark for a live fetch +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"2a6d32f1-c47e-4177-a1d1-914a2f19490b"} + +stdout | app/api/streak/tests/staleWatermark.test.ts > GET /api/streak stale watermark > does not add the stale watermark for a live fetch +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":5,"requestId":"2a6d32f1-c47e-4177-a1d1-914a2f19490b"} + + ✓ app/api/streak/tests/staleWatermark.test.ts (2 tests) 725ms + ✓ adds the stale watermark when the fetcher returns offline fallback data 629ms + ✓ app/template.empty-fallback.test.tsx (10 tests) 475ms + ✓ components/dashboard/PRInsights/Highlights.mock-integrations.test.tsx (5 tests) 520ms + ✓ 2. simulates pending service state before rendering 348ms + ✓ lib/svg/generator.additional.test.ts (81 tests) 565ms + ✓ app/api/compare/route.timezone-boundaries.test.ts (6 tests) 180ms + ✓ components/dashboard/AchievementsSkeleton.responsive-breakpoints.test.tsx (5 tests) 427ms + ✓ components/ShareButtons.error-resilience.test.tsx (5 tests) 190ms +stderr | components/dashboard/Achievements.type-compiler.test.tsx > Achievements - TypeScript Compiler Validation & Schema Constraints Stability > Validate Achievement type fields are correctly typed: renders component without TypeScript schema violations +React does not recognize the `whileInView` prop on a DOM element. If you intentionally want it to appear in the DOM as a custom attribute, spell it as lowercase `whileinview` instead. If you accidentally passed it from a parent component, remove it from the DOM element. + + ✓ components/ShareButtons.theme-contrast.test.tsx (5 tests) 168ms + ✓ components/dashboard/Achievements.type-compiler.test.tsx (5 tests) 202ms +stderr | components/dashboard/AIInsights.empty-fallback.test.tsx > AIInsights > renders with an empty insights array +React does not recognize the `whileInView` prop on a DOM element. If you intentionally want it to appear in the DOM as a custom attribute, spell it as lowercase `whileinview` instead. If you accidentally passed it from a parent component, remove it from the DOM element. + + ✓ components/dashboard/AIInsights.empty-fallback.test.tsx (5 tests) 230ms + ✓ app/generator/data/socials.empty-fallback.test.ts (5 tests) 37ms + ✓ components/dashboard/AIInsightsSkeleton.theme-contrast.test.tsx (5 tests) 305ms + ✓ lib/calculate.dst-boundary.test.ts (5 tests) 64ms + ✓ components/dashboard/StatsCardSkeleton.theme-contrast.test.tsx (6 tests) 233ms + ✓ components/dashboard/PRInsights/RepoPerformanceTable.mouse-interactivity.test.tsx (5 tests) 369ms + ✓ app/generator/types.error-resilience.test.ts (5 tests) 186ms + ✓ app/api/wrapped/route.theme-contrast.test.tsx (5 tests) 163ms + ✓ components/dashboard/ActivityLandscape.error-resilience.test.tsx (6 tests) 471ms + ✓ renders without crashing on hydration with valid empty data 344ms +stdout | app/api/streak/tests/timezone.test.ts > Streak API — tz parameter > invalid timezone > returns 400 for a completely invalid timezone string +[INFO] Incoming streak request {"source":"streak","requestId":"bf783035-0920-46b7-92eb-149fded3cbc6"} + +stdout | app/api/streak/tests/timezone.test.ts > Streak API — tz parameter > invalid timezone > returns a JSON error body with fieldErrors for an invalid timezone +[INFO] Incoming streak request {"source":"streak","requestId":"3d7ed4fc-9594-44cb-84d5-4e92efa2948b"} + +stdout | app/api/streak/tests/timezone.test.ts > Streak API — tz parameter > invalid timezone > does not call the GitHub API when the timezone is invalid +[INFO] Incoming streak request {"source":"streak","requestId":"c09515bb-3328-4125-b5f2-9754feee69d7"} + +stdout | app/api/streak/tests/timezone.test.ts > Streak API — tz parameter > invalid timezone > returns 400 for a timezone that is clearly garbage +[INFO] Incoming streak request {"source":"streak","requestId":"622e2aee-a6e5-4295-8f37-fb988ef0ab7c"} + +stdout | app/api/streak/tests/timezone.test.ts > Streak API — tz parameter > invalid timezone > sets Cache-Control: no-store on the error response +[INFO] Incoming streak request {"source":"streak","requestId":"0ae68a8c-e39c-4ee1-9ab1-f6e4c3e7f591"} + +stdout | app/api/streak/tests/timezone.test.ts > Streak API — tz parameter > valid timezone > returns 200 with SVG for a valid IANA timezone +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"bf829a20-707d-4e6b-aee2-09b7b556505d"} +[INFO] Streak request completed {"source":"streak","requestId":"bf829a20-707d-4e6b-aee2-09b7b556505d"} + +stdout | app/api/streak/tests/timezone.test.ts > Streak API — tz parameter > valid timezone > returns 200 with SVG for a valid IANA timezone +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":7} + +stdout | app/api/streak/tests/timezone.test.ts > Streak API — tz parameter > valid timezone > returns 200 for Asia/Kolkata +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"691d5f79-5604-41f2-872e-1f460544ade5"} +[INFO] Streak request completed {"source":"streak","requestId":"691d5f79-5604-41f2-872e-1f460544ade5"} + +stdout | app/api/streak/tests/timezone.test.ts > Streak API — tz parameter > valid timezone > returns 200 for Asia/Kolkata +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":5} + +stdout | app/api/streak/tests/timezone.test.ts > Streak API — tz parameter > valid timezone > returns 200 for UTC +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"1c4ebf3a-84c1-45b0-a02e-1563ee746311"} +[INFO] Streak request completed {"source":"streak","requestId":"1c4ebf3a-84c1-45b0-a02e-1563ee746311"} + +stdout | app/api/streak/tests/timezone.test.ts > Streak API — tz parameter > valid timezone > returns 200 for UTC +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":4} + +stdout | app/api/streak/tests/timezone.test.ts > Streak API — tz parameter > valid timezone > uses getSecondsUntilMidnightInTimezone when a valid tz is provided +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"8ea3cdce-ef5d-4dfd-a40d-1977445a6107"} +[INFO] Streak request completed {"source":"streak","requestId":"8ea3cdce-ef5d-4dfd-a40d-1977445a6107"} + +stdout | app/api/streak/tests/timezone.test.ts > Streak API — tz parameter > valid timezone > uses getSecondsUntilMidnightInTimezone when a valid tz is provided +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2} + +stdout | app/api/streak/tests/timezone.test.ts > Streak API — tz parameter > omitted timezone > returns 200 when no tz param is provided +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"a6f4e445-2f1a-4da2-b7f6-0f5c7fca0e92"} + +stdout | app/api/streak/tests/timezone.test.ts > Streak API — tz parameter > omitted timezone > returns 200 when no tz param is provided +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"a6f4e445-2f1a-4da2-b7f6-0f5c7fca0e92"} + +stdout | app/api/streak/tests/timezone.test.ts > Streak API — tz parameter > omitted timezone > uses getSecondsUntilUTCMidnight when tz is omitted +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"7d6ebf38-d4b6-4680-bf26-0a1b14ea51de"} + +stdout | app/api/streak/tests/timezone.test.ts > Streak API — tz parameter > omitted timezone > uses getSecondsUntilUTCMidnight when tz is omitted +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"7d6ebf38-d4b6-4680-bf26-0a1b14ea51de"} + + ✓ app/api/streak/tests/timezone.test.ts (11 tests) 243ms + ✓ app/components/Icons.mouse-interactivity.test.tsx (5 tests) 203ms + ✓ components/dashboard/DashboardSkeleton.empty-fallback.test.tsx (5 tests) 289ms + ✓ components/dashboard/ResumeProfileSection.theme-contrast.test.tsx (5 tests) 398ms +stderr | components/dashboard/ComparisonStatsCard.theme-contrast.test.tsx > ComparisonStatsCard — Theme & Color Cohesion > renders light and dark mode surface and border classes on card container +React does not recognize the `whileInView` prop on a DOM element. If you intentionally want it to appear in the DOM as a custom attribute, spell it as lowercase `whileinview` instead. If you accidentally passed it from a parent component, remove it from the DOM element. +React does not recognize the `whileHover` prop on a DOM element. If you intentionally want it to appear in the DOM as a custom attribute, spell it as lowercase `whilehover` instead. If you accidentally passed it from a parent component, remove it from the DOM element. + + ✓ components/dashboard/ComparisonStatsCard.theme-contrast.test.tsx (5 tests) 292ms + ✓ app/components/Icons.error-resilience.test.tsx (5 tests) 177ms + ✓ lib/github.contributed-repos-pagination.test.ts (2 tests) 133ms + ✓ app/customize/components/SectionLabel.responsive-breakpoints.test.tsx (5 tests) 468ms + ✓ hooks/useLocalStorage.mock-integrations.test.ts (5 tests) 126ms + ✓ app/generator/data/technologies.empty-fallback.test.ts (5 tests) 102ms +stderr | utils/getClientIp.test.ts > getClientIp > ignores spoofed X-Forwarded-For when request.ip is present +{"timestamp":"2026-07-23T03:34:50.327Z","type":"SECURITY_EVENT","event":"SPOOFED_HEADER_ATTEMPT","claimedIp":"198.51.100.5","resolvedIp":"203.0.113.10","header":"x-forwarded-for"} + +stderr | utils/getClientIp.test.ts > getClientIp > ignores direct client-supplied custom priority headers +{"timestamp":"2026-07-23T03:34:50.337Z","type":"SECURITY_EVENT","event":"UNTRUSTED_FORWARDED_HEADER_IGNORED","resolvedIp":"unknown","header":"cf-connecting-ip"} + +stderr | utils/getClientIp.test.ts > getClientIp > stops at the first untrusted proxy in the chain +{"timestamp":"2026-07-23T03:34:50.355Z","type":"SECURITY_EVENT","event":"SPOOFED_HEADER_ATTEMPT","claimedIp":"198.51.100.5","resolvedIp":"8.8.8.8","header":"x-forwarded-for"} + +stderr | utils/getClientIp.test.ts > getClientIp > supports wildcards to trust all proxies (trust-all behavior) +{"timestamp":"2026-07-23T03:34:50.356Z","type":"SECURITY_EVENT","event":"WILDCARD_TRUST_USED","resolvedIp":"198.51.100.5","chain":["198.51.100.5","203.0.113.10"],"header":"x-forwarded-for"} + +stderr | utils/getClientIp.test.ts > getClientIp > sanitizes multi-IP lists and traverses untrusted hops from right to left +{"timestamp":"2026-07-23T03:34:50.361Z","type":"SECURITY_EVENT","event":"SPOOFED_HEADER_ATTEMPT","claimedIp":"203.0.113.195","resolvedIp":"198.51.100.10","header":"x-forwarded-for"} + +stderr | utils/getClientIp.test.ts > getClientIp > does not return a trusted proxy as the client IP when it is the only hop in the chain +{"timestamp":"2026-07-23T03:34:50.385Z","type":"SECURITY_EVENT","event":"SPOOFED_HEADER_ATTEMPT","claimedIp":"203.0.113.5","resolvedIp":"127.0.0.1","header":"x-forwarded-for"} + + ✓ utils/getClientIp.test.ts (12 tests) 82ms + ✓ components/dashboard/AchievementsSkeleton.empty-fallback.test.tsx (5 tests) 203ms +stderr | services/wakatime/api.test.ts > WakaTime API Service > getWakaTimeStats > handles non-ok responses gracefully +Error fetching WakaTime stats: 401 Unauthorized + +stderr | services/wakatime/api.test.ts > WakaTime API Service > getWakaTimeStats > handles fetch errors gracefully +Error fetching WakaTime stats: Error: Network error + at /home/atulupadhyay/Contribution/commitpulse/services/wakatime/api.test.ts:97:46 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:302:11 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:1903:26 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2326:20 + at new Promise (<anonymous>) + at runWithCancel (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2323:10) + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2305:20 + at new Promise (<anonymous>) + at runWithTimeout (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2272:10) + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2955:64 + + ✓ services/wakatime/api.test.ts (6 tests) 79ms +stdout | services/github/background-refresh.error-resilience.test.ts > BackgroundRefresh - Error Resilience (Hydration Stability, Exception Safety & Error Fallbacks) > Exception Safety: does not throw or crash when getFullDashboardData rejects with an unexpected runtime exception +[BackgroundRefresh] Queuing background refresh for: crash_user + +stderr | services/github/background-refresh.error-resilience.test.ts > BackgroundRefresh - Error Resilience (Hydration Stability, Exception Safety & Error Fallbacks) > Exception Safety: does not throw or crash when getFullDashboardData rejects with an unexpected runtime exception +[BackgroundRefresh] Background refresh failed for: crash_user Error: Unexpected runtime exception: database connection refused + at /home/atulupadhyay/Contribution/commitpulse/services/github/background-refresh.error-resilience.test.ts:20:7 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:302:11 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:1903:26 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2326:20 + at new Promise (<anonymous>) + at runWithCancel (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2323:10) + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2305:20 + at new Promise (<anonymous>) + at runWithTimeout (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2272:10) + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2955:64 + +stdout | services/github/background-refresh.error-resilience.test.ts > BackgroundRefresh - Error Resilience (Hydration Stability, Exception Safety & Error Fallbacks) > Error Fallback: logs error to dev-telemetry (console.error) when background refresh fails +[BackgroundRefresh] Queuing background refresh for: telemetry_user + +stdout | services/github/background-refresh.error-resilience.test.ts > BackgroundRefresh - Error Resilience (Hydration Stability, Exception Safety & Error Fallbacks) > Hydration Stability: active job set is fully cleared after exception so subsequent refresh attempts are not blocked +[BackgroundRefresh] Queuing background refresh for: hydration_user + +stderr | services/github/background-refresh.error-resilience.test.ts > BackgroundRefresh - Error Resilience (Hydration Stability, Exception Safety & Error Fallbacks) > Hydration Stability: active job set is fully cleared after exception so subsequent refresh attempts are not blocked +[BackgroundRefresh] Background refresh failed for: hydration_user Error: First call fails + at /home/atulupadhyay/Contribution/commitpulse/services/github/background-refresh.error-resilience.test.ts:51:58 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:302:11 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:1903:26 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2326:20 + at new Promise (<anonymous>) + at runWithCancel (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2323:10) + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2305:20 + at new Promise (<anonymous>) + at runWithTimeout (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2272:10) + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2955:64 + +stdout | services/github/background-refresh.error-resilience.test.ts > BackgroundRefresh - Error Resilience (Hydration Stability, Exception Safety & Error Fallbacks) > Hydration Stability: active job set is fully cleared after exception so subsequent refresh attempts are not blocked +[BackgroundRefresh] Queuing background refresh for: hydration_user + +stdout | services/github/background-refresh.error-resilience.test.ts > BackgroundRefresh - Error Resilience (Hydration Stability, Exception Safety & Error Fallbacks) > Hydration Stability: active job set is fully cleared after exception so subsequent refresh attempts are not blocked +[BackgroundRefresh] Successfully completed background refresh for: hydration_user + +stdout | services/github/background-refresh.error-resilience.test.ts > BackgroundRefresh - Error Resilience (Hydration Stability, Exception Safety & Error Fallbacks) > Exception Safety: handles non-Error throws (strings, objects) without crashing +[BackgroundRefresh] Queuing background refresh for: non_error_user + +stdout | services/github/background-refresh.error-resilience.test.ts > BackgroundRefresh - Error Resilience (Hydration Stability, Exception Safety & Error Fallbacks) > Error Fallback: reset() provides a clean recovery path clearing all active jobs including stuck ones +[BackgroundRefresh] Queuing background refresh for: stuck_user_1 +[BackgroundRefresh] Queuing background refresh for: stuck_user_2 + + ✓ services/github/background-refresh.error-resilience.test.ts (5 tests) 83ms + ✓ lib/structured-clone-regression.test.ts (1 test) 25ms +stdout | app/api/streak/route.error-resilience.test.ts > GET /api/streak — error resilience & exception safety > quota / refresh guard rails fail closed without crashing > returns a 429 fallback instead of throwing when GitHub quota is low on a refresh request +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"2f95b991-b0de-4230-9bde-6cebab4f6e6d"} + +stdout | app/api/streak/route.error-resilience.test.ts > GET /api/streak — error resilience & exception safety > quota / refresh guard rails fail closed without crashing > returns a 429 fallback instead of throwing when the refresh rate limiter rejects the request +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"6738a5ca-4b80-4f36-aa7b-6f70c155755c"} + +stdout | app/api/streak/route.error-resilience.test.ts > GET /api/streak — error resilience & exception safety > quota / refresh guard rails fail closed without crashing > degrades gracefully to cached data (200 OK) instead of erroring when a refresh cooldown is active +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"8a15b5e6-b711-49ff-83b6-9f367cf98566"} + +stdout | app/api/streak/route.error-resilience.test.ts > GET /api/streak — error resilience & exception safety > quota / refresh guard rails fail closed without crashing > degrades gracefully to cached data (200 OK) instead of erroring when a refresh cooldown is active +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"8a15b5e6-b711-49ff-83b6-9f367cf98566"} + +stdout | app/api/streak/route.error-resilience.test.ts > GET /api/streak — error resilience & exception safety > JSON output mode error fallbacks (format=json) > returns a structured 500 JSON error, not a crash, for an unrecognised upstream failure +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"250ecff4-6d50-474c-9a67-2029ca4710a8"} + +stdout | app/api/streak/route.error-resilience.test.ts > GET /api/streak — error resilience & exception safety > JSON output mode error fallbacks (format=json) > returns a structured 500 JSON error, not a crash, for an unrecognised upstream failure +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"json","status":200,"durationMs":2,"requestId":"250ecff4-6d50-474c-9a67-2029ca4710a8"} + +stdout | app/api/streak/route.error-resilience.test.ts > GET /api/streak — error resilience & exception safety > JSON output mode error fallbacks (format=json) > returns a structured 404 JSON error for an unknown user +[INFO] Incoming streak request {"source":"streak","user":"ghost","view":"default","requestId":"ffc429d9-a80d-4ead-9392-7c3872889fcb"} + +stdout | app/api/streak/route.error-resilience.test.ts > GET /api/streak — error resilience & exception safety > JSON output mode error fallbacks (format=json) > returns a structured 404 JSON error for an unknown user +[INFO] Streak request completed {"source":"streak","user":"ghost","view":"default","format":"json","status":200,"durationMs":2,"requestId":"ffc429d9-a80d-4ead-9392-7c3872889fcb"} + +stdout | app/api/streak/route.error-resilience.test.ts > GET /api/streak — error resilience & exception safety > JSON output mode error fallbacks (format=json) > returns a structured 429 JSON error with Retry-After for a rate limit failure +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"eafb0c4c-f8c8-435c-8375-85aba91bb38e"} + +stdout | app/api/streak/route.error-resilience.test.ts > GET /api/streak — error resilience & exception safety > JSON output mode error fallbacks (format=json) > returns a structured 429 JSON error with Retry-After for a rate limit failure +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"json","status":200,"durationMs":2,"requestId":"eafb0c4c-f8c8-435c-8375-85aba91bb38e"} + +stdout | app/api/streak/route.error-resilience.test.ts > GET /api/streak — error resilience & exception safety > JSON output mode error fallbacks (format=json) > returns a structured 400 JSON error with sanitized text for a validation failure +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"e761fc8e-bdbb-4766-8b23-8e4a6d4bab7d"} + +stdout | app/api/streak/route.error-resilience.test.ts > GET /api/streak — error resilience & exception safety > JSON output mode error fallbacks (format=json) > returns a structured 400 JSON error with sanitized text for a validation failure +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"json","status":200,"durationMs":1,"requestId":"e761fc8e-bdbb-4766-8b23-8e4a6d4bab7d"} + +stdout | app/api/streak/route.error-resilience.test.ts > GET /api/streak — error resilience & exception safety > JSON output mode error fallbacks (format=json) > produces a clean JSON 500 fallback when a non-Error value (plain object) is thrown +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"efbb0bd0-72a6-4f91-8310-fe729e1e1c46"} + +stdout | app/api/streak/route.error-resilience.test.ts > GET /api/streak — error resilience & exception safety > JSON output mode error fallbacks (format=json) > produces a clean JSON 500 fallback when a non-Error value (plain object) is thrown +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"json","status":200,"durationMs":1,"requestId":"efbb0bd0-72a6-4f91-8310-fe729e1e1c46"} + +stdout | app/api/streak/route.error-resilience.test.ts > GET /api/streak — error resilience & exception safety > SVG output mode: internal error details are never leaked > replaces a Zod/schema-flavoured validation message with a generic one in the fallback SVG +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"ef7d6d08-a2d7-4b38-b4f9-25d08df7a651"} + +stdout | app/api/streak/route.error-resilience.test.ts > GET /api/streak — error resilience & exception safety > SVG output mode: internal error details are never leaked > replaces a Zod/schema-flavoured validation message with a generic one in the fallback SVG +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"ef7d6d08-a2d7-4b38-b4f9-25d08df7a651"} + +stdout | app/api/streak/route.error-resilience.test.ts > GET /api/streak — error resilience & exception safety > SVG output mode: internal error details are never leaked > does not crash when a not-found error message has no quoted username to extract +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"519a4f75-0873-4121-b4ba-8c8034b210eb"} + +stdout | app/api/streak/route.error-resilience.test.ts > GET /api/streak — error resilience & exception safety > SVG output mode: internal error details are never leaked > does not crash when a not-found error message has no quoted username to extract +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"519a4f75-0873-4121-b4ba-8c8034b210eb"} + +stdout | app/api/streak/route.error-resilience.test.ts > GET /api/streak — error resilience & exception safety > SVG output mode: internal error details are never leaked > falls back to a 500 error SVG instead of crashing when the org dashboard throws an unexpected error +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"1285febd-3fc4-48d1-aabe-e95da1880688"} + +stderr | app/api/streak/route.error-resilience.test.ts > GET /api/streak — error resilience & exception safety > SVG output mode: internal error details are never leaked > falls back to a 500 error SVG instead of crashing when the org dashboard throws an unexpected error +[ERROR] Unhandled error {"source":"streak","message":"Something went wrong. Please try again later.","requestId":"1285febd-3fc4-48d1-aabe-e95da1880688"} + +stdout | app/api/streak/route.error-resilience.test.ts > GET /api/streak — error resilience & exception safety > SVG output mode: internal error details are never leaked > falls back to a 500 error SVG instead of crashing when the org dashboard throws an unexpected error +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":3,"requestId":"1285febd-3fc4-48d1-aabe-e95da1880688"} + +stdout | app/api/streak/route.error-resilience.test.ts > GET /api/streak — error resilience & exception safety > timeout / abort handling (isAbortError) > returns a 504 timeout SVG when the rejection has name "AbortError" +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"ab8e97d5-aeba-48cd-9ed3-a106d9961fb2"} + +stdout | app/api/streak/route.error-resilience.test.ts > GET /api/streak — error resilience & exception safety > timeout / abort handling (isAbortError) > returns a 504 timeout SVG when the rejection has name "AbortError" +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"ab8e97d5-aeba-48cd-9ed3-a106d9961fb2"} + +stdout | app/api/streak/route.error-resilience.test.ts > GET /api/streak — error resilience & exception safety > timeout / abort handling (isAbortError) > returns a 504 timeout SVG when the rejection has name "TimeoutError" +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"09e57625-cbce-411f-afa2-7a8f00195d65"} + +stdout | app/api/streak/route.error-resilience.test.ts > GET /api/streak — error resilience & exception safety > timeout / abort handling (isAbortError) > returns a 504 timeout SVG when the rejection has name "TimeoutError" +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"09e57625-cbce-411f-afa2-7a8f00195d65"} + +stdout | app/api/streak/route.error-resilience.test.ts > GET /api/streak — error resilience & exception safety > timeout / abort handling (isAbortError) > returns a 504 timeout SVG when a plain Error message mentions "timed out" with no name field +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"ba7d99ff-a946-4dde-8dc5-498dd7716716"} + +stdout | app/api/streak/route.error-resilience.test.ts > GET /api/streak — error resilience & exception safety > timeout / abort handling (isAbortError) > returns a 504 timeout SVG when a plain Error message mentions "timed out" with no name field +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"ba7d99ff-a946-4dde-8dc5-498dd7716716"} + +stdout | app/api/streak/route.error-resilience.test.ts > GET /api/streak — error resilience & exception safety > timeout / abort handling (isAbortError) > returns a structured 504 JSON error when the rejection has name "AbortError" +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"58a5a0d1-595c-48f4-9a25-4209e7281015"} + +stdout | app/api/streak/route.error-resilience.test.ts > GET /api/streak — error resilience & exception safety > timeout / abort handling (isAbortError) > returns a structured 504 JSON error when the rejection has name "AbortError" +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"json","status":200,"durationMs":1,"requestId":"58a5a0d1-595c-48f4-9a25-4209e7281015"} + +stdout | app/api/streak/route.error-resilience.test.ts > GET /api/streak — error resilience & exception safety > asymmetric multi-target resilience > fails the whole request cleanly (not a partial/corrupt SVG) when the ?versus= comparison user fails to load +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"400f4306-711c-4fcf-9d8f-b002ea175c74"} + +stderr | app/api/streak/route.error-resilience.test.ts > GET /api/streak — error resilience & exception safety > asymmetric multi-target resilience > fails the whole request cleanly (not a partial/corrupt SVG) when the ?versus= comparison user fails to load +[ERROR] Unhandled error {"source":"streak","message":"Something went wrong. Please try again later.","requestId":"400f4306-711c-4fcf-9d8f-b002ea175c74"} + +stdout | app/api/streak/route.error-resilience.test.ts > GET /api/streak — error resilience & exception safety > asymmetric multi-target resilience > fails the whole request cleanly (not a partial/corrupt SVG) when the ?versus= comparison user fails to load +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":4,"requestId":"400f4306-711c-4fcf-9d8f-b002ea175c74"} + +stdout | app/api/streak/route.error-resilience.test.ts > GET /api/streak — error resilience & exception safety > dev-telemetry logging on unhandled errors > logs unexpected errors with a sanitized message and the "streak" source tag +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"58a6b04b-7749-482f-a0e7-12b90378db46"} + +stdout | app/api/streak/route.error-resilience.test.ts > GET /api/streak — error resilience & exception safety > dev-telemetry logging on unhandled errors > logs unexpected errors with a sanitized message and the "streak" source tag +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"58a6b04b-7749-482f-a0e7-12b90378db46"} + +stdout | app/api/streak/route.error-resilience.test.ts > GET /api/streak — error resilience & exception safety > dev-telemetry logging on unhandled errors > does not invoke dev-telemetry logging for expected, user-facing validation errors +[INFO] Incoming streak request {"source":"streak","requestId":"c1e4bcf5-1185-4210-906a-4fccc16f0419"} + +stdout | app/api/streak/route.error-resilience.test.ts > GET /api/streak — error resilience & exception safety > Cache-Control on error paths not covered by route.test.ts > returns a 400 with no-store caching for validation errors so a corrected reload is never served stale data +[INFO] Incoming streak request {"source":"streak","requestId":"374c5e1c-ea66-46c5-ac5a-95a89ae0a826"} + +stdout | app/api/streak/route.error-resilience.test.ts > GET /api/streak — error resilience & exception safety > Cache-Control on error paths not covered by route.test.ts > never lets a client cache a 404 not-found error response +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"a8e411ac-ba14-4a22-a58e-834afbadb469"} + +stdout | app/api/streak/route.error-resilience.test.ts > GET /api/streak — error resilience & exception safety > Cache-Control on error paths not covered by route.test.ts > never lets a client cache a 404 not-found error response +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"a8e411ac-ba14-4a22-a58e-834afbadb469"} + +stdout | app/api/streak/route.error-resilience.test.ts > GET /api/streak — error resilience & exception safety > internal fallback catches keep dependent views healthy > still returns a valid 200 commit-clock SVG when the commit-hour distribution fetch fails internally +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"commit_clock","requestId":"8a88a82a-3287-46a4-b694-3df16c471318"} + +stdout | app/api/streak/route.error-resilience.test.ts > GET /api/streak — error resilience & exception safety > internal fallback catches keep dependent views healthy > still returns a valid 200 commit-clock SVG when the commit-hour distribution fetch fails internally +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"commit_clock","format":"svg","status":200,"durationMs":1,"requestId":"8a88a82a-3287-46a4-b694-3df16c471318"} + + ✓ app/api/streak/route.error-resilience.test.ts (21 tests) 302ms + ✓ app/compare/page.mock-integrations.test.tsx (5 tests) 202ms + ✓ app/customize/components/SectionLabel.accessibility.test.tsx (7 tests) 164ms + ✓ hooks/useRecentSearches.test.ts (16 tests) 159ms +stderr | app/api/student/resume/confirm/route.responsive-breakpoints.test.ts > ApiStudentResumeConfirmRoute - Responsive Breakpoints & Viewport Layouts > Mock standard mobile-width media coordinates (e.g. 375px wide viewports) +[WARN] Student profile save bypassed: MONGODB_URI is not set {"environment":"test"} + + ✓ app/api/student/resume/confirm/route.responsive-breakpoints.test.ts (5 tests) 177ms +stderr | app/api/notify/route.test.ts > POST /api/notify > returns 500 when MONGODB_URI is not set in production +[ERROR] Notification registration disabled: MONGODB_URI is not set {"environment":"production"} + +stderr | app/api/notify/route.test.ts > POST /api/notify > bypasses gracefully when MONGODB_URI is not set in development +[WARN] Notification registration bypassed: MONGODB_URI is not set {"environment":"development"} + +stderr | app/api/notify/route.test.ts > GET /api/notify > returns 500 when MONGODB_URI is not set in production +[ERROR] Notification lookup disabled: MONGODB_URI is not set {"environment":"production"} + +stderr | app/api/notify/route.test.ts > GET /api/notify > bypasses gracefully when MONGODB_URI is not set in development +[WARN] Notification lookup bypassed: MONGODB_URI is not set {"environment":"development"} + + ✓ app/api/notify/route.test.ts (32 tests) 416ms + ✓ app/compare/page.empty-fallback.test.tsx (5 tests) 140ms + ✓ app/(root)/dashboard/layout.error-resilience.test.tsx (2 tests) 106ms + ✓ components/dashboard/Heatmap.empty-fallback.test.tsx (5 tests) 144ms + ✓ hooks/useGlowEffect.mouse-interactivity.test.ts (5 tests) 166ms +stdout | app/api/streak/tests/scale.test.ts > Integration Test: API Streak Scale Parameter Group > Test 1: should return 200 OK for valid scale=log +[INFO] Incoming streak request {"source":"streak","user":"JhaSourav07","view":"default","requestId":"5a84dc5a-943a-4555-b6fb-9732e539f923"} + +stderr | app/api/streak/tests/scale.test.ts > Integration Test: API Streak Scale Parameter Group > Test 1: should return 200 OK for valid scale=log +[CommitPulse API] Empty profile or null repository nodes discovered for user "JhaSourav07". Falling back to baseline collection. + +stdout | app/api/streak/tests/scale.test.ts > Integration Test: API Streak Scale Parameter Group > Test 1: should return 200 OK for valid scale=log +[INFO] Streak request completed {"source":"streak","user":"JhaSourav07","view":"default","format":"svg","status":200,"durationMs":58,"requestId":"5a84dc5a-943a-4555-b6fb-9732e539f923"} + +stdout | app/api/streak/tests/scale.test.ts > Integration Test: API Streak Scale Parameter Group > Test 2: should return 200 OK for valid scale=linear +[INFO] Incoming streak request {"source":"streak","user":"JhaSourav07","view":"default","requestId":"08a98e2a-7a6e-4983-837f-2e2140bdfb92"} + +stderr | app/api/streak/tests/scale.test.ts > Integration Test: API Streak Scale Parameter Group > Test 2: should return 200 OK for valid scale=linear +[CommitPulse API] Empty profile or null repository nodes discovered for user "JhaSourav07". Falling back to baseline collection. + +stdout | app/api/streak/tests/scale.test.ts > Integration Test: API Streak Scale Parameter Group > Test 2: should return 200 OK for valid scale=linear +[INFO] Streak request completed {"source":"streak","user":"JhaSourav07","view":"default","format":"svg","status":200,"durationMs":7,"requestId":"08a98e2a-7a6e-4983-837f-2e2140bdfb92"} + +stdout | app/api/streak/tests/scale.test.ts > Integration Test: API Streak Scale Parameter Group > Test 3: should render different SVGs for linear vs log scaling +[INFO] Incoming streak request {"source":"streak","user":"JhaSourav07","view":"default","requestId":"eaa5febf-09d5-4474-a1b1-ec2cd855ec6f"} + +stderr | app/api/streak/tests/scale.test.ts > Integration Test: API Streak Scale Parameter Group > Test 3: should render different SVGs for linear vs log scaling +[CommitPulse API] Empty profile or null repository nodes discovered for user "JhaSourav07". Falling back to baseline collection. + +stdout | app/api/streak/tests/scale.test.ts > Integration Test: API Streak Scale Parameter Group > Test 3: should render different SVGs for linear vs log scaling +[INFO] Streak request completed {"source":"streak","user":"JhaSourav07","view":"default","format":"svg","status":200,"durationMs":6,"requestId":"eaa5febf-09d5-4474-a1b1-ec2cd855ec6f"} + +stdout | app/api/streak/tests/scale.test.ts > Integration Test: API Streak Scale Parameter Group > Test 3: should render different SVGs for linear vs log scaling +[INFO] Incoming streak request {"source":"streak","user":"JhaSourav07","view":"default","requestId":"975891ca-4dcb-46f7-9dd2-1a73ce5d9830"} + +stderr | app/api/streak/tests/scale.test.ts > Integration Test: API Streak Scale Parameter Group > Test 3: should render different SVGs for linear vs log scaling +[CommitPulse API] Empty profile or null repository nodes discovered for user "JhaSourav07". Falling back to baseline collection. + +stdout | app/api/streak/tests/scale.test.ts > Integration Test: API Streak Scale Parameter Group > Test 3: should render different SVGs for linear vs log scaling +[INFO] Streak request completed {"source":"streak","user":"JhaSourav07","view":"default","format":"svg","status":200,"durationMs":6,"requestId":"975891ca-4dcb-46f7-9dd2-1a73ce5d9830"} + +stdout | app/api/streak/tests/scale.test.ts > Integration Test: API Streak Scale Parameter Group > Test 4: should fallback gracefully to linear behavior for invalid scale inputs +[INFO] Incoming streak request {"source":"streak","user":"JhaSourav07","view":"default","requestId":"e85b9a69-45aa-4307-bc50-f1d178453bae"} + +stderr | app/api/streak/tests/scale.test.ts > Integration Test: API Streak Scale Parameter Group > Test 4: should fallback gracefully to linear behavior for invalid scale inputs +[CommitPulse API] Empty profile or null repository nodes discovered for user "JhaSourav07". Falling back to baseline collection. + +stdout | app/api/streak/tests/scale.test.ts > Integration Test: API Streak Scale Parameter Group > Test 4: should fallback gracefully to linear behavior for invalid scale inputs +[INFO] Streak request completed {"source":"streak","user":"JhaSourav07","view":"default","format":"svg","status":200,"durationMs":12,"requestId":"e85b9a69-45aa-4307-bc50-f1d178453bae"} + +stdout | app/api/streak/tests/scale.test.ts > Integration Test: API Streak Scale Parameter Group > Test 4: should fallback gracefully to linear behavior for invalid scale inputs +[INFO] Incoming streak request {"source":"streak","user":"JhaSourav07","view":"default","requestId":"4ebb6f2d-84cb-404c-aff1-aa0afd3fba5c"} + +stderr | app/api/streak/tests/scale.test.ts > Integration Test: API Streak Scale Parameter Group > Test 4: should fallback gracefully to linear behavior for invalid scale inputs +[CommitPulse API] Empty profile or null repository nodes discovered for user "JhaSourav07". Falling back to baseline collection. + +stdout | app/api/streak/tests/scale.test.ts > Integration Test: API Streak Scale Parameter Group > Test 4: should fallback gracefully to linear behavior for invalid scale inputs +[INFO] Streak request completed {"source":"streak","user":"JhaSourav07","view":"default","format":"svg","status":200,"durationMs":9,"requestId":"4ebb6f2d-84cb-404c-aff1-aa0afd3fba5c"} + +stdout | app/api/streak/tests/scale.test.ts > Integration Test: API Streak Scale Parameter Group > Test 5: should return appropriate HTTP headers for SVG rendering +[INFO] Incoming streak request {"source":"streak","user":"JhaSourav07","view":"default","requestId":"38fa4275-4d96-4e08-b1f7-78b332124b6d"} + +stderr | app/api/streak/tests/scale.test.ts > Integration Test: API Streak Scale Parameter Group > Test 5: should return appropriate HTTP headers for SVG rendering +[CommitPulse API] Empty profile or null repository nodes discovered for user "JhaSourav07". Falling back to baseline collection. + +stdout | app/api/streak/tests/scale.test.ts > Integration Test: API Streak Scale Parameter Group > Test 5: should return appropriate HTTP headers for SVG rendering +[INFO] Streak request completed {"source":"streak","user":"JhaSourav07","view":"default","format":"svg","status":200,"durationMs":7,"requestId":"38fa4275-4d96-4e08-b1f7-78b332124b6d"} + + ✓ app/api/streak/tests/scale.test.ts (5 tests) 289ms +stdout | app/api/streak/tests/shading.test.ts > Streak API - shading parameter integration tests > should return 200 OK and apply shading when shading is true +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"7c94fc06-c041-4bba-b3a8-f9b7d522767b"} + +stdout | app/api/streak/tests/shading.test.ts > Streak API - shading parameter integration tests > should return 200 OK and apply shading when shading is true +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":53,"requestId":"7c94fc06-c041-4bba-b3a8-f9b7d522767b"} + +stdout | app/api/streak/tests/shading.test.ts > Streak API - shading parameter integration tests > should return 200 OK and not apply shading when shading is false +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"55beb3c1-d196-4209-b908-2b28aa77d029"} + +stdout | app/api/streak/tests/shading.test.ts > Streak API - shading parameter integration tests > should return 200 OK and not apply shading when shading is false +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":3,"requestId":"55beb3c1-d196-4209-b908-2b28aa77d029"} + +stdout | app/api/streak/tests/shading.test.ts > Streak API - shading parameter integration tests > should fallback to false and return 200 OK when shading is invalid +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"d5ba72c5-2d17-46f4-ae62-ce190d06472e"} + +stdout | app/api/streak/tests/shading.test.ts > Streak API - shading parameter integration tests > should fallback to false and return 200 OK when shading is invalid +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":3,"requestId":"d5ba72c5-2d17-46f4-ae62-ce190d06472e"} + +stdout | app/api/streak/tests/shading.test.ts > Streak API - shading parameter integration tests > should default to false and return 200 OK when shading is missing +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"168ed108-e61d-446f-876a-18dd80f9e589"} + +stdout | app/api/streak/tests/shading.test.ts > Streak API - shading parameter integration tests > should default to false and return 200 OK when shading is missing +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"168ed108-e61d-446f-876a-18dd80f9e589"} + +stdout | app/api/streak/tests/shading.test.ts > Streak API - shading parameter integration tests > should produce different SVGs when shading is true vs false +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"82979ce6-dce3-41a8-b307-7bbfaa752286"} + +stdout | app/api/streak/tests/shading.test.ts > Streak API - shading parameter integration tests > should produce different SVGs when shading is true vs false +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"82979ce6-dce3-41a8-b307-7bbfaa752286"} + +stdout | app/api/streak/tests/shading.test.ts > Streak API - shading parameter integration tests > should produce different SVGs when shading is true vs false +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"77d54b32-9cb5-4732-89cd-b73feedfb6ae"} + +stdout | app/api/streak/tests/shading.test.ts > Streak API - shading parameter integration tests > should produce different SVGs when shading is true vs false +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":1,"requestId":"77d54b32-9cb5-4732-89cd-b73feedfb6ae"} + + ✓ app/api/streak/tests/shading.test.ts (5 tests) 177ms + ✓ lib/calculate.unsorted-calendar.test.ts (5 tests) 141ms + ✓ lib/validations.year.test.ts (28 tests) 215ms + ✓ components/dashboard/AchievementsSkeleton.timezone-boundaries.test.tsx (5 tests) 278ms + ✓ components/dashboard/StatsCard.timezone-boundaries.test.tsx (5 tests) 254ms + ✓ components/dashboard/PopularPinnnedRepos.empty-fallback.test.tsx (6 tests) 313ms + ✓ app/components/Icons.mock-integrations.test.tsx (5 tests) 144ms + ✓ app/template.timezone-boundaries.test.tsx (5 tests) 132ms + ✓ app/(root)/dashboard/layout.mock-integrations.test.tsx (2 tests) 154ms + ✓ components/dashboard/AchievementsSkeleton.mock-integrations.test.tsx (5 tests) 159ms +stderr | components/dashboard/CommitClock.empty-fallback.test.tsx > CommitClock - Empty Fallback > renders fallback UI when data array is empty +React does not recognize the `whileInView` prop on a DOM element. If you intentionally want it to appear in the DOM as a custom attribute, spell it as lowercase `whileinview` instead. If you accidentally passed it from a parent component, remove it from the DOM element. + + ✓ components/dashboard/CommitClock.empty-fallback.test.tsx (5 tests) 203ms + ✓ components/commitpulse-logo.timezone-boundaries.test.tsx (5 tests) 353ms + ✓ components/dashboard/RepositoryGraph.empty-fallback.test.tsx (5 tests) 316ms + ✓ lib/calculate.year-boundary-v4.test.ts (5 tests) 160ms +stdout | app/api/wrapped/route.test.ts > GET /api/wrapped > cache-control header > bypasses the cache entirely when refresh=true is specified +recordRefresh executed + +stderr | app/api/wrapped/route.test.ts > GET /api/wrapped > error handling > returns 500 with SVG error structure when fetch throws +[ERROR] Unhandled error {"source":"wrapped","message":"GitHub is down"} + +stdout | app/api/wrapped/route.test.ts > GET /api/wrapped > cache bypass security > returns 429 when IP refresh limit is exceeded +recordRefresh executed + +stdout | app/api/wrapped/route.test.ts > GET /api/wrapped > cache bypass security > falls back to cached data when per-username cooldown is active +recordRefresh executed + + ✓ app/api/wrapped/route.test.ts (27 tests) 287ms + ✓ components/dashboard/AIInsightsSkeleton.empty-fallback.test.tsx (5 tests) 172ms + ✓ app/api/wrapped/tests/validation.test.ts (5 tests) 49ms +(node:75079) [MONGOOSE] Warning: Mongoose: `Document.prototype.validateSync()` is deprecated and will be removed in Mongoose 10. Use `Document.prototype.validate()` instead. +(Use `node-22 --trace-warnings ...` to show where the warning was created) +(node:75079) [MONGOOSE] Warning: Mongoose: `Document.prototype.validateSync()` is deprecated and will be removed in Mongoose 10. Use `Document.prototype.validate()` instead. + ✓ models/Notification.error-resilience.test.ts (5 tests) 65ms + ✓ components/dashboard/DashboardSkeleton.test.tsx (3 tests) 252ms + ✓ components/commitpulse-logo.accessibility.test.tsx (5 tests) 228ms + ✓ components/dashboard/AIInsightsSkeleton.mock-integrations.test.tsx (5 tests) 124ms + ✓ components/dashboard/DashboardSkeleton.timezone-boundaries.test.tsx (5 tests) 252ms + ✓ app/api/pr-insights/route.error-resilience.test.ts (5 tests) 97ms +stdout | app/api/streak/tests/weekday.test.ts > GET /api/streak?view=weekday > returns 200 and the standard SVG headers for view=weekday +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"weekday","requestId":"2f35dd44-87b7-446c-8f08-90dcb5276c4b"} + +stdout | app/api/streak/tests/weekday.test.ts > GET /api/streak?view=weekday > returns 200 and the standard SVG headers for view=weekday +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"weekday","format":"svg","status":200,"durationMs":86,"requestId":"2f35dd44-87b7-446c-8f08-90dcb5276c4b"} + +stdout | app/api/streak/tests/weekday.test.ts > GET /api/streak?view=weekday > renders all seven weekday labels +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"weekday","requestId":"37fb33ee-3b98-4ea7-93ce-abdf02e9d393"} + +stdout | app/api/streak/tests/weekday.test.ts > GET /api/streak?view=weekday > renders all seven weekday labels +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"weekday","format":"svg","status":200,"durationMs":1,"requestId":"37fb33ee-3b98-4ea7-93ce-abdf02e9d393"} + +stdout | app/api/streak/tests/weekday.test.ts > GET /api/streak?view=weekday > shows the total contributions count as a subtitle +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"weekday","requestId":"6f6d1d33-0777-44db-b431-8d6707340a98"} + +stdout | app/api/streak/tests/weekday.test.ts > GET /api/streak?view=weekday > shows the total contributions count as a subtitle +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"weekday","format":"svg","status":200,"durationMs":3,"requestId":"6f6d1d33-0777-44db-b431-8d6707340a98"} + +stdout | app/api/streak/tests/weekday.test.ts > GET /api/streak?view=weekday > exposes stable caching headers on the weekday SVG response +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"weekday","requestId":"046c6f0b-8058-49d2-bc37-9d3d98a3bd62"} + +stdout | app/api/streak/tests/weekday.test.ts > GET /api/streak?view=weekday > exposes stable caching headers on the weekday SVG response +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"weekday","format":"svg","status":200,"durationMs":3,"requestId":"046c6f0b-8058-49d2-bc37-9d3d98a3bd62"} + +stdout | app/api/streak/tests/weekday.test.ts > GET /api/streak?view=weekday > respects the tz parameter without crashing +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"weekday","requestId":"cebcefe3-8791-4d98-b08e-eea567f18dbe"} +[INFO] Streak request completed {"source":"streak","requestId":"cebcefe3-8791-4d98-b08e-eea567f18dbe"} + +stdout | app/api/streak/tests/weekday.test.ts > GET /api/streak?view=weekday > respects the tz parameter without crashing +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"weekday","format":"svg","status":200,"durationMs":5} + + ✓ app/api/streak/tests/weekday.test.ts (6 tests) 268ms + ✓ components/dashboard/StatsCard.utc-disclaimer.test.tsx (1 test) 170ms + ✓ app/components/heroTitle.test.tsx (4 tests) 189ms + ✓ services/github/validate-user.timezone-boundaries.test.ts (5 tests) 70ms + ✓ lib/svg/radar.nightOwl.test.ts (4 tests) 50ms + ✓ app/components/FeatureCard.theme-contrast.test.tsx (5 tests) 226ms + ✓ app/customize/components/ExportPanel.timezone-boundaries.test.tsx (5 tests) 69ms + ✓ app/api/user-details/route.timezone-boundaries.test.ts (5 tests) 108ms +stderr | app/contributors/page.accessibility.test.tsx > ContributorsPage Accessibility > renders successfully when contributor data is empty +[ERROR] Failed to fetch contributors {"error":{}} + + ✓ app/contributors/page.accessibility.test.tsx (5 tests) 131ms +stderr | app/api/stats/route.test.ts > GET /api/stats > serves cached stats instead of bypassing cache during refresh cooldown +{"timestamp":"2026-07-23T03:35:12.949Z","type":"SECURITY_EVENT","event":"STATS_REFRESH_COOLDOWN_VIOLATION","user":"testuser","ip":"127.0.0.1","remainingMs":29984} + +stderr | app/api/stats/route.test.ts > GET /api/stats > returns 429 when stats refresh exceeds the client refresh rate limit +{"timestamp":"2026-07-23T03:35:12.986Z","type":"SECURITY_EVENT","event":"UNTRUSTED_FORWARDED_HEADER_IGNORED","resolvedIp":"unknown","header":"x-real-ip"} + +stderr | app/api/stats/route.test.ts > GET /api/stats > returns 429 when stats refresh exceeds the client refresh rate limit +{"timestamp":"2026-07-23T03:35:13.007Z","type":"SECURITY_EVENT","event":"STATS_REFRESH_RATE_LIMIT_EXCEEDED","user":"octocat","ip":"127.0.0.1","limit":1} + +stderr | app/api/stats/route.test.ts > GET /api/stats > blocks stats refresh when the shared GitHub quota is low +{"timestamp":"2026-07-23T03:35:13.019Z","type":"SECURITY_EVENT","event":"LOW_QUOTA_STATS_REFRESH_BLOCKED","user":"testuser","ip":"127.0.0.1","remainingQuota":400} + +stderr | app/api/stats/route.test.ts > GET /api/stats > returns 500 when the GitHub API throws +[ERROR] Unhandled error in /api/stats {"error":{}} + +stderr | app/api/stats/route.test.ts > GET /api/stats > returns 500 with a generic message for non-Error throws +[ERROR] Unhandled error in /api/stats {"error":"something went wrong"} + + ✓ app/api/stats/route.test.ts (21 tests) 318ms + ✓ hooks/useShareActions.empty-fallback.test.ts (5 tests) 98ms + ✓ services/github/quota-monitor.mouse-interactivity.test.ts (7 tests) 194ms +stderr | app/api/track-user/route.test.ts > POST /api/track-user > returns 429 with rate limit headers when rate limited +{"timestamp":"2026-07-23T03:35:14.019Z","type":"SECURITY_EVENT","event":"UNTRUSTED_FORWARDED_HEADER_IGNORED","resolvedIp":"unknown","header":"x-real-ip"} + +stderr | app/api/track-user/route.test.ts > POST /api/track-user > applies rate limiting to localhost requests +[WARN] User tracking bypassed: MONGODB_URI is not set {"environment":"test"} + + ✓ app/api/track-user/route.test.ts (16 tests) 218ms +stderr | components/Leaderboard.error-resilience.test.tsx > Leaderboard error resilience > renders without crashing with valid contributor data +React does not recognize the `whileInView` prop on a DOM element. If you intentionally want it to appear in the DOM as a custom attribute, spell it as lowercase `whileinview` instead. If you accidentally passed it from a parent component, remove it from the DOM element. + + ✓ components/Leaderboard.error-resilience.test.tsx (5 tests) 198ms + ✓ hooks/useShareActions.error-resilience.test.ts (5 tests) 208ms +stderr | app/layout.mock-integrations.test.tsx > Layout Asynchronous Service Layer Mocking & Local Cache Stubs > mocks standard asynchronous imports and databases using stubs +In HTML, <html> cannot be a child of <div>. +This will cause a hydration error. + + ✓ app/layout.mock-integrations.test.tsx (5 tests) 196ms + ✓ utils/color.test.ts (36 tests) 70ms + ✓ hooks/useRecentSearches.timezone-boundaries.test.ts (5 tests) 185ms +stdout | app/api/streak/tests/layout.test.ts > Streak API - layout parameter integration tests > should return 200 OK and render default layout when layout parameter is default +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"172929e0-cddd-453b-8401-652a9a0b2f08"} + +stdout | app/api/streak/tests/layout.test.ts > Streak API - layout parameter integration tests > should return 200 OK and render default layout when layout parameter is default +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":75,"requestId":"172929e0-cddd-453b-8401-652a9a0b2f08"} + + ✓ app/(root)/dashboard/loading.mouse-interactivity.test.tsx (5 tests) 362ms +stdout | app/api/streak/tests/layout.test.ts > Streak API - layout parameter integration tests > should return 200 OK and render compact layout when layout parameter is compact +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"2e162958-87ba-4532-b143-74e5901a1c88"} + +stdout | app/api/streak/tests/layout.test.ts > Streak API - layout parameter integration tests > should return 200 OK and render compact layout when layout parameter is compact +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":10,"requestId":"2e162958-87ba-4532-b143-74e5901a1c88"} + +stdout | app/api/streak/tests/layout.test.ts > Streak API - layout parameter integration tests > should return 200 OK and render full layout when layout parameter is full +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"8d732905-9149-4176-8167-b8726c721fb3"} + +stdout | app/api/streak/tests/layout.test.ts > Streak API - layout parameter integration tests > should return 200 OK and render full layout when layout parameter is full +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":6,"requestId":"8d732905-9149-4176-8167-b8726c721fb3"} + +stdout | app/api/streak/tests/layout.test.ts > Streak API - layout parameter integration tests > should return 400 Bad Request when layout parameter is invalid +[INFO] Incoming streak request {"source":"streak","requestId":"e616c405-e289-4d30-9bf6-cbfbacde5299"} + +stdout | app/api/streak/tests/layout.test.ts > Streak API - layout parameter integration tests > should fall back to default layout when layout is empty +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"e98b54ee-1bf3-4505-826f-a2125bfdb4b0"} + +stdout | app/api/streak/tests/layout.test.ts > Streak API - layout parameter integration tests > should fall back to default layout when layout is empty +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":2,"requestId":"e98b54ee-1bf3-4505-826f-a2125bfdb4b0"} + + ✓ app/api/streak/tests/layout.test.ts (5 tests) 552ms + ✓ should return 200 OK and render default layout when layout parameter is default 430ms + ✓ lib/search/fuzzySearch.test.ts (13 tests) 44ms + ✓ app/contributors/ContributorsClient.type-compiler.test.tsx (5 tests) 37ms +stderr | lib/calculate.error-resilience.test.ts > calculate-error-resilience > should gracefully fallback to UTC when Intl.DateTimeFormat throws in convertLocalToUtc +[vitest] The DateTimeFormat mock did not use 'function' or 'class' in its implementation, see https://vitest.dev/api/vi#vi-spyon for examples. + +stderr | lib/calculate.error-resilience.test.ts > calculate-error-resilience > should fallback safely when Intl formatter crashes inside getLocalTodayStr +[vitest] The DateTimeFormat mock did not use 'function' or 'class' in its implementation, see https://vitest.dev/api/vi#vi-spyon for examples. +[vitest] The DateTimeFormat mock did not use 'function' or 'class' in its implementation, see https://vitest.dev/api/vi#vi-spyon for examples. +[vitest] The DateTimeFormat mock did not use 'function' or 'class' in its implementation, see https://vitest.dev/api/vi#vi-spyon for examples. +[vitest] The DateTimeFormat mock did not use 'function' or 'class' in its implementation, see https://vitest.dev/api/vi#vi-spyon for examples. + + ✓ lib/calculate.error-resilience.test.ts (5 tests) 326ms + ✓ app/generator/types.mock-integrations.test.ts (5 tests) 107ms + ✓ app/template.type-compiler.test.tsx (5 tests) 200ms + ✓ app/api/spotify/route.test.ts (4 tests) 124ms + ✓ test-utils/timezone-mock.test.ts (26 tests) 88ms + ✓ utils/dashboardPeriod.test.ts (8 tests) 90ms + ✓ models/StudentProfile.timezone-boundaries.test.ts (5 tests) 155ms + ✓ app/components/Icons.accessibility.test.tsx (6 tests) 180ms + ✓ hooks/useKeyboardShortcuts.test.ts (4 tests) 117ms + ✓ lib/calculate.mouse-interactivity.test.ts (5 tests) 208ms + ✓ services/security/track-user-protection.mock-integrations.test.ts (5 tests) 21ms + ✓ app/generator/types.timezone-boundaries.test.ts (5 tests) 29ms +stdout | app/api/wrapped/route.mock-integrations.test.ts > GET /api/wrapped validation > Test Case 1: refresh=true checks rate limiter and bypasses cache +recordRefresh executed + +stdout | app/api/wrapped/route.mock-integrations.test.ts > GET /api/wrapped validation > Test Case 5: successful refresh records cache update +recordRefresh executed + + ✓ app/api/wrapped/route.mock-integrations.test.ts (5 tests) 82ms + ✓ app/customize/components/SectionLabel.empty-fallback.test.tsx (5 tests) 91ms + ✓ components/dashboard/AchievementsSkeleton.accessibility.test.tsx (5 tests) 109ms + ✓ app/api/notify/route.timezone-boundaries.test.ts (5 tests) 87ms + ✓ app/generator/utils/readmeGenerator.accessibility.test.ts (5 tests) 310ms + ✓ app/generator/components/ReadmeInsight.test.tsx (4 tests) 266ms + ✓ app/template.mock-integrations.test.tsx (5 tests) 220ms + ✓ app/components/ScrollRestoration.timezone-boundaries.test.tsx (5 tests) 88ms + ✓ app/generator/types.theme-contrast.test.ts (5 tests) 92ms + ✓ app/customize/components/SectionLabel.test.tsx (5 tests) 172ms + ✓ components/dashboard/DeveloperCollaborationIntelligenceHub.test.tsx (1 test) 200ms + ✓ app/api/stats/route.empty-fallback.test.ts (5 tests) 137ms + ✓ services/github/refresh-rate-limiter.empty-fallback.test.ts (5 tests) 84ms +stderr | app/api/track-user/route.error-resilience.test.ts > app/api/track-user/route - error resilience > returns a structured fallback when the database operation times out +Database operation failed or timed out. Bypassing user tracking: Error: Database operation timed out + at /home/atulupadhyay/Contribution/commitpulse/app/api/track-user/route.ts:137:41 + at callTimer (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/vitest/dist/chunks/test.DNmyFkvJ.js:1773:25) + at doTickInner (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/vitest/dist/chunks/test.DNmyFkvJ.js:2444:30) + at doTick (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/vitest/dist/chunks/test.DNmyFkvJ.js:2525:21) + at Immediate.<anonymous> (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/vitest/dist/chunks/test.DNmyFkvJ.js:2546:34) + at processImmediate (node:internal/timers:484:21) + +stderr | app/api/track-user/route.error-resilience.test.ts > app/api/track-user/route - error resilience > survives a mid-stream database write failure without hard-crashing the endpoint +Database operation failed or timed out. Bypassing user tracking: Error: write interruption + at /home/atulupadhyay/Contribution/commitpulse/app/api/track-user/route.error-resilience.test.ts:161:53 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:302:11 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:1903:26 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2326:20 + at new Promise (<anonymous>) + at runWithCancel (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2323:10) + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2305:20 + at new Promise (<anonymous>) + at runWithTimeout (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2272:10) + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2955:64 + + ✓ app/api/track-user/route.error-resilience.test.ts (5 tests) 203ms +stdout | app/api/wrapped/route.timezone-boundaries.test.ts > Timezone normalization & calendar boundary alignment > passes bypassCache=true when refresh=true is provided +recordRefresh executed + + ✓ app/api/wrapped/route.timezone-boundaries.test.ts (5 tests) 101ms + ✓ app/components/ScrollRestoration.test.tsx (5 tests) 142ms +stderr | app/api/notify/route.mock-integrations.test.ts > POST /api/notify - mock integration tests > database failure returns 500 +[ERROR] Failed to save notification preferences {"route":"/api/notify","error":{}} + + ✓ app/api/notify/route.mock-integrations.test.ts (5 tests) 70ms + ✓ lib/validations.normalizeTimezone.test.ts (21 tests) 83ms +stdout | services/github/background-refresh.mouse-interactivity.test.ts > BackgroundRefresh - Mouse Interactivity & Click Handling > prevents duplicate refresh triggers from rapid double-click interactions +[BackgroundRefresh] Queuing background refresh for: double-click-user +[BackgroundRefresh] Refresh already active for: double-click-user + +stdout | services/github/background-refresh.mouse-interactivity.test.ts > BackgroundRefresh - Mouse Interactivity & Click Handling > verifies click handlers invoke refresh exactly once +[BackgroundRefresh] Queuing background refresh for: click-user + +stderr | services/github/background-refresh.mouse-interactivity.test.ts > BackgroundRefresh - Mouse Interactivity & Click Handling > verifies click handlers invoke refresh exactly once +[BackgroundRefresh] Background refresh failed for: click-user Error: [GitHub API] Failed to fetch contributions for user "click-user" + at getFullDashboardData (/home/atulupadhyay/Contribution/commitpulse/lib/github.ts:2349:11) + at processTicksAndRejections (node:internal/process/task_queues:103:5) + at /home/atulupadhyay/Contribution/commitpulse/services/github/background-refresh.ts:110:11 { + [cause]: TypeError: res.clone is not a function + at fetchGraphQLWithRetry (/home/atulupadhyay/Contribution/commitpulse/lib/github.ts:474:6) + at processTicksAndRejections (node:internal/process/task_queues:103:5) + at fetchContributionsUncached (/home/atulupadhyay/Contribution/commitpulse/lib/github.ts:1154:15) + at loadWithTimeout (/home/atulupadhyay/Contribution/commitpulse/lib/github.ts:933:14) + at fetchGitHubContributions (/home/atulupadhyay/Contribution/commitpulse/lib/github.ts:1016:22) + at async Promise.allSettled (index 2) + at getFullDashboardData (/home/atulupadhyay/Contribution/commitpulse/lib/github.ts:2333:7) + at /home/atulupadhyay/Contribution/commitpulse/services/github/background-refresh.ts:110:11 +} + +stdout | services/github/background-refresh.mouse-interactivity.test.ts > BackgroundRefresh - Mouse Interactivity & Click Handling > applies pointer cursor state while refresh job is active +[BackgroundRefresh] Queuing background refresh for: hover-user + +stdout | services/github/background-refresh.mouse-interactivity.test.ts > BackgroundRefresh - Mouse Interactivity & Click Handling > hides temporary overlay state after mouseleave refresh completion +[BackgroundRefresh] Queuing background refresh for: mouseleave-user + +stdout | services/github/background-refresh.mouse-interactivity.test.ts > BackgroundRefresh - Mouse Interactivity & Click Handling > hides temporary overlay state after mouseleave refresh completion +[BackgroundRefresh] Successfully completed background refresh for: mouseleave-user + + ✓ services/github/background-refresh.mouse-interactivity.test.ts (5 tests) 138ms +stderr | app/contributors/page.mock-integrations.test.tsx > ContributorsPage Mock Integrations > falls back to empty contributor data on failed endpoint responses +[ERROR] Failed to fetch contributors {"error":{}} + + ✓ app/contributors/page.mock-integrations.test.tsx (5 tests) 221ms + ✓ lib/cache.timezone-boundaries.test.ts (5 tests) 154ms + ✓ app/api/track-user/route.empty-fallback.test.ts (5 tests) 38ms + ✓ app/api/ci-analytics/route.test.ts (4 tests) 50ms + ✓ components/dashboard/RadarChart.type-compiler.test.tsx (5 tests) 38ms + ✓ app/api/track-user/route.timezone-boundaries.test.ts (5 tests) 188ms + ✓ hooks/useDebounce.timezone-boundaries.test.ts (5 tests) 136ms + ✓ hooks/useShareActions.responsive-breakpoints.test.ts (5 tests) 150ms + ✓ context/TranslationContext.test.tsx (2 tests) 111ms + ✓ hooks/useLocalStorage.theme-contrast.test.ts (5 tests) 75ms + ✓ lib/svg/components/VersusPanel.test.tsx (4 tests) 347ms + ✓ components/dashboard/AIInsightsSkeleton.test.tsx (4 tests) 181ms + ✓ lib/resume-parser.mock-integrations.test.ts (5 tests) 42ms +stdout | app/api/streak/route.timezone-boundaries.test.ts > ApiStreakRoute Timezone Normalization & Calendar Boundary Alignment > accepts UTC timezone and returns a valid SVG +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"0bb3939c-f83e-49bd-a390-d655d2ead4b9"} +[INFO] Streak request completed {"source":"streak","requestId":"0bb3939c-f83e-49bd-a390-d655d2ead4b9"} + +stdout | app/api/streak/route.timezone-boundaries.test.ts > ApiStreakRoute Timezone Normalization & Calendar Boundary Alignment > accepts UTC timezone and returns a valid SVG +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":65} + +stdout | app/api/streak/route.timezone-boundaries.test.ts > ApiStreakRoute Timezone Normalization & Calendar Boundary Alignment > accepts Asia/Kolkata timezone and uses timezone-aware cache calculation +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"b2c67273-9224-46db-a4d4-84bf1ef38700"} +[INFO] Streak request completed {"source":"streak","requestId":"b2c67273-9224-46db-a4d4-84bf1ef38700"} + +stdout | app/api/streak/route.timezone-boundaries.test.ts > ApiStreakRoute Timezone Normalization & Calendar Boundary Alignment > accepts Asia/Kolkata timezone and uses timezone-aware cache calculation +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"svg","status":200,"durationMs":5} + +stdout | app/api/streak/route.timezone-boundaries.test.ts > ApiStreakRoute Timezone Normalization & Calendar Boundary Alignment > returns 400 for an invalid timezone and skips GitHub fetching +[INFO] Incoming streak request {"source":"streak","requestId":"576fcc1e-abcf-47fe-b538-391981904292"} + +stdout | app/api/streak/route.timezone-boundaries.test.ts > ApiStreakRoute Timezone Normalization & Calendar Boundary Alignment > uses timezone cache duration in JSON responses +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"44d8c4a9-1ea2-4c1f-b271-d2aa6deff908"} +[INFO] Streak request completed {"source":"streak","requestId":"44d8c4a9-1ea2-4c1f-b271-d2aa6deff908"} + +stdout | app/api/streak/route.timezone-boundaries.test.ts > ApiStreakRoute Timezone Normalization & Calendar Boundary Alignment > uses timezone cache duration in JSON responses +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"json","status":200,"durationMs":5} + +stdout | app/api/streak/route.timezone-boundaries.test.ts > ApiStreakRoute Timezone Normalization & Calendar Boundary Alignment > preserves leap-year boundary dates across timezone-aware JSON responses +[INFO] Incoming streak request {"source":"streak","user":"octocat","view":"default","requestId":"fb2192e0-47b4-4179-89ae-bddc53a84ff4"} +[INFO] Streak request completed {"source":"streak","requestId":"fb2192e0-47b4-4179-89ae-bddc53a84ff4"} + +stdout | app/api/streak/route.timezone-boundaries.test.ts > ApiStreakRoute Timezone Normalization & Calendar Boundary Alignment > preserves leap-year boundary dates across timezone-aware JSON responses +[INFO] Streak request completed {"source":"streak","user":"octocat","view":"default","format":"json","status":200,"durationMs":10} + + ✓ app/api/streak/route.timezone-boundaries.test.ts (5 tests) 250ms + ✓ lib/analytics/authorAttribution.test.ts (12 tests) 31ms +stderr | app/api/student/resume/confirm/route.theme-contrast.test.ts > ApiStudentResumeConfirmRoute - Theme Contrast > dark mode: returns success response with consistent shape +[WARN] Student profile save bypassed: MONGODB_URI is not set {"environment":"test"} + +stderr | app/api/student/resume/confirm/route.theme-contrast.test.ts > ApiStudentResumeConfirmRoute - Theme Contrast > light mode: returns success response with consistent shape +[WARN] Student profile save bypassed: MONGODB_URI is not set {"environment":"test"} + + ✓ app/api/student/resume/confirm/route.theme-contrast.test.ts (5 tests) 54ms + ✓ lib/svg/themes.test.ts (193 tests) 300ms + ✓ app/generator/data/socials.timezone-boundaries.test.ts (6 tests) 333ms + ✓ app/api/github/route.responsive-breakpoints.test.ts (5 tests) 266ms + ✓ lib/svg/sanitizer.test.ts (75 tests) 320ms + ✓ app/api/compare/githubFetch.test.ts (5 tests) 259ms + ✓ app/api/user-details/route.test.ts (8 tests) 422ms +stderr | lib/cache.mock-integrations.test.ts > Asynchronous Service Layer Mocking & Local Cache Stubs > 1. Mock standard asynchronous imports and databases using stubs +[ERROR] Cache GET failed {"component":"DistributedCache","key":"[REDACTED]","error":{}} + +stderr | lib/cache.mock-integrations.test.ts > Asynchronous Service Layer Mocking & Local Cache Stubs > 1. Mock standard asynchronous imports and databases using stubs +[ERROR] Cache lock failed {"component":"DistributedCache","key":"[REDACTED]","error":{}} + +stderr | lib/cache.mock-integrations.test.ts > Asynchronous Service Layer Mocking & Local Cache Stubs > 1. Mock standard asynchronous imports and databases using stubs +[ERROR] Cache SET failed {"component":"DistributedCache","key":"[REDACTED]","error":{}} + +stderr | lib/cache.mock-integrations.test.ts > Asynchronous Service Layer Mocking & Local Cache Stubs > 2. Test service loading paths to ensure pending state overlays render +[ERROR] Cache GET failed {"component":"DistributedCache","key":"[REDACTED]","error":{}} + +stderr | lib/cache.mock-integrations.test.ts > Asynchronous Service Layer Mocking & Local Cache Stubs > 2. Test service loading paths to ensure pending state overlays render +[ERROR] Cache lock failed {"component":"DistributedCache","key":"[REDACTED]","error":{}} + +stderr | lib/cache.mock-integrations.test.ts > Asynchronous Service Layer Mocking & Local Cache Stubs > 2. Test service loading paths to ensure pending state overlays render +[ERROR] Cache SET failed {"component":"DistributedCache","key":"[REDACTED]","error":{}} + +stderr | lib/cache.mock-integrations.test.ts > Asynchronous Service Layer Mocking & Local Cache Stubs > 3. Assert local cache layers are queried before triggering database retrievals +[ERROR] Cache GET failed {"component":"DistributedCache","key":"[REDACTED]","error":{}} + +stderr | lib/cache.mock-integrations.test.ts > Asynchronous Service Layer Mocking & Local Cache Stubs > 3. Assert local cache layers are queried before triggering database retrievals +[ERROR] Cache lock failed {"component":"DistributedCache","key":"[REDACTED]","error":{}} + +stderr | lib/cache.mock-integrations.test.ts > Asynchronous Service Layer Mocking & Local Cache Stubs > 3. Assert local cache layers are queried before triggering database retrievals +[ERROR] Cache SET failed {"component":"DistributedCache","key":"[REDACTED]","error":{}} + +stderr | lib/cache.mock-integrations.test.ts > Asynchronous Service Layer Mocking & Local Cache Stubs > 4. Verify correct fallback procedures during fake endpoint timeout blocks +[ERROR] Cache GET failed {"component":"DistributedCache","key":"[REDACTED]","error":{}} + +stderr | lib/cache.mock-integrations.test.ts > Asynchronous Service Layer Mocking & Local Cache Stubs > 4. Verify correct fallback procedures during fake endpoint timeout blocks +[ERROR] Cache lock failed {"component":"DistributedCache","key":"[REDACTED]","error":{}} + +stderr | lib/cache.mock-integrations.test.ts > Asynchronous Service Layer Mocking & Local Cache Stubs > 4. Verify correct fallback procedures during fake endpoint timeout blocks +[ERROR] Cache SET failed {"component":"DistributedCache","key":"[REDACTED]","error":{}} + +stderr | lib/cache.mock-integrations.test.ts > Asynchronous Service Layer Mocking & Local Cache Stubs > 5. Assert complete cache sync is written on success callbacks +[ERROR] Cache GET failed {"component":"DistributedCache","key":"[REDACTED]","error":{}} + +stderr | lib/cache.mock-integrations.test.ts > Asynchronous Service Layer Mocking & Local Cache Stubs > 5. Assert complete cache sync is written on success callbacks +[ERROR] Cache lock failed {"component":"DistributedCache","key":"[REDACTED]","error":{}} + +stderr | lib/cache.mock-integrations.test.ts > Asynchronous Service Layer Mocking & Local Cache Stubs > 5. Assert complete cache sync is written on success callbacks +[ERROR] Cache SET failed {"component":"DistributedCache","key":"[REDACTED]","error":{}} + + ✓ lib/cache.mock-integrations.test.ts (5 tests) 347ms + ✓ hooks/useLocalStorage.mouse-interactivity.test.ts (5 tests) 166ms + ✓ lib/github.empty-fallback.test.ts (5 tests) 109ms + ✓ hooks/useRecentSearches.error-resilience.test.ts (5 tests) 379ms + ✓ services/github/__tests__/org-bot-filtering.test.ts (2 tests) 179ms +stderr | components/DiscordButton.theme-contrast.test.tsx > DiscordButton - Dark and Light Theme Contrast > renders correctly in dark mode +React does not recognize the `whileTap` prop on a DOM element. If you intentionally want it to appear in the DOM as a custom attribute, spell it as lowercase `whiletap` instead. If you accidentally passed it from a parent component, remove it from the DOM element. + + ✓ hooks/useDebounce.boundary-robustness.test.ts (5 tests) 100ms + ✓ components/DiscordButton.theme-contrast.test.tsx (5 tests) 155ms + ✓ components/dashboard/AIInsightsSkeleton.type-compiler.test.tsx (5 tests) 92ms + ✓ hooks/useShareActions.timezone-boundaries.test.ts (5 tests) 226ms + ✓ app/(root)/dashboard/[username]/loading.mouse-interactivity.test.tsx (5 tests) 225ms +Not implemented: HTMLCanvasElement's toDataURL() method: without installing the canvas npm package +Not implemented: HTMLCanvasElement's toDataURL() method: without installing the canvas npm package +Not implemented: HTMLCanvasElement's toDataURL() method: without installing the canvas npm package +Not implemented: HTMLCanvasElement's toDataURL() method: without installing the canvas npm package + ✓ lib/pdf-export.test.ts (4 tests) 66ms + ✓ app/api/github/route.error-resilience.test.ts (5 tests) 70ms + ✓ lib/export3d.theme-contrast.test.ts (5 tests) 155ms + ✓ hooks/useRecentSearches.mock-integrations.test.ts (5 tests) 206ms + ✓ lib/svg/accentConsistency.test.ts (3 tests) 52ms + ✓ components/dashboard/heatmapUtils.responsive-breakpoints.test.ts (5 tests) 166ms + ✓ lib/svg/constellation.test.ts (9 tests) 148ms +stdout | services/github/background-refresh.test.ts > BackgroundRefresh Unit Tests > triggerRefresh > sanitizes username (trims and converts to lowercase) +[BackgroundRefresh] Queuing background refresh for: testuser + +stdout | services/github/background-refresh.test.ts > BackgroundRefresh Unit Tests > triggerRefresh > sanitizes username (trims and converts to lowercase) +[BackgroundRefresh] Successfully completed background refresh for: testuser + +stdout | services/github/background-refresh.test.ts > BackgroundRefresh Unit Tests > triggerRefresh > prevents concurrent duplicate jobs for the same user +[BackgroundRefresh] Queuing background refresh for: user1 +[BackgroundRefresh] Refresh already active for: user1 + +stdout | services/github/background-refresh.test.ts > BackgroundRefresh Unit Tests > triggerRefresh > prevents concurrent duplicate jobs for the same user +[BackgroundRefresh] Successfully completed background refresh for: user1 + +stdout | services/github/background-refresh.test.ts > BackgroundRefresh Unit Tests > triggerRefresh > removes the user from active jobs on failure +[BackgroundRefresh] Queuing background refresh for: user-fail + +stdout | services/github/background-refresh.test.ts > BackgroundRefresh Unit Tests > triggerRefresh > handles expired tokens or authentication errors gracefully +[BackgroundRefresh] Queuing background refresh for: invalid_token_user + +stdout | services/github/background-refresh.test.ts > BackgroundRefresh Unit Tests > triggerRefresh > recovers correctly from network dropouts during synchronization +[BackgroundRefresh] Queuing background refresh for: offline_user + +stdout | services/github/background-refresh.test.ts > BackgroundRefresh Unit Tests > reset > clears all currently active jobs +[BackgroundRefresh] Queuing background refresh for: active-user + + ✓ services/github/background-refresh.test.ts (11 tests) 61ms + ✓ components/commitpulse-logo.test.tsx (5 tests) 96ms + ✓ app/generator/components/PreviewPanel.security.test.tsx (3 tests) 216ms +stderr | app/api/github/route.mouse-interactivity.test.ts > GET /api/github - Interactive Tooltips, Cursor Hovers & Touch Event Propagation > verifies that responsive tooltip layouts display at computed coordinates mapped through metadata headers +{"timestamp":"2026-07-23T03:36:01.329Z","type":"SECURITY_EVENT","event":"UNTRUSTED_FORWARDED_HEADER_IGNORED","resolvedIp":"unknown","header":"x-real-ip"} + +stderr | app/api/github/route.mouse-interactivity.test.ts > GET /api/github - Interactive Tooltips, Cursor Hovers & Touch Event Propagation > verifies that responsive tooltip layouts display at computed coordinates mapped through metadata headers +[WARN] Security event {"type":"SECURITY_EVENT","event":"REFRESH_RATE_LIMIT_EXCEEDED","username":"torvalds","ip":"127.0.0.1","limit":1} + +stderr | app/api/github/route.mouse-interactivity.test.ts > GET /api/github - Interactive Tooltips, Cursor Hovers & Touch Event Propagation > blocks refresh interactions when quota becomes critically low +[WARN] Security event {"type":"SECURITY_EVENT","event":"LOW_QUOTA_REFRESH_BLOCKED","username":"octocat","ip":"127.0.0.1","remainingQuota":100} + +stderr | app/api/github/route.mouse-interactivity.test.ts > GET /api/github - Interactive Tooltips, Cursor Hovers & Touch Event Propagation > checks that simulated mouseleave cooldown events successfully hide temporary overlay visuals by returning cached data +[WARN] Security event {"type":"SECURITY_EVENT","event":"REFRESH_COOLDOWN_VIOLATION","username":"octocat","ip":"127.0.0.1","remainingMs":29999} + + ✓ app/api/github/route.mouse-interactivity.test.ts (5 tests) 73ms + ✓ models/User.connection-state-0-v4.test.ts (5 tests) 62ms + ✓ app/api/compare/route.theme-contrast.test.ts (5 tests) 237ms + ✓ lib/export3d.empty-fallback.test.ts (7 tests) 52ms + ✓ services/github/pr-insights.theme-contrast.test.ts (5 tests) 140ms + ✓ lib/resume-parser.test.ts (9 tests) 59ms + ✓ app/api/team-attribution/route.test.ts (6 tests) 79ms + ✓ components/commitpulse-logo.empty-fallback.test.tsx (5 tests) 192ms + ✓ app/api/student/resume/upload/route.theme-contrast.test.ts (5 tests) 50ms + ✓ hooks/useFetchCache.test.ts (6 tests) 264ms + ✓ app/components/ScrollRestoration.error-resilience.test.tsx (5 tests) 96ms + ✓ hooks/useDebounce.theme-contrast.test.ts (5 tests) 160ms + ✓ app/api/wrapped/tests/statsCalculation.test.ts (5 tests) 115ms + ✓ lib/svg/radar.test.ts (7 tests) 114ms + ✓ lib/export3d.responsive-breakpoints.test.ts (5 tests) 141ms + ✓ app/generator/data/technologies.type-compiler.test.ts (5 tests) 49ms + ✓ components/dashboard/PRInsights/PRTrendChart.mock-integrations.test.tsx (5 tests) 97ms + ✓ app/api/achievements/route.empty-fallback.test.ts (10 tests) 60ms + ✓ services/github/refresh-policy.mock-integrations.test.ts (5 tests) 105ms + ✓ hooks/useLocalStorage.responsive-breakpoints.test.ts (5 tests) 196ms + ✓ app/api/streak/png/route.test.ts (3 tests) 82ms + ✓ hooks/useRecentSearches.empty-fallback.test.ts (5 tests) 115ms + ✓ hooks/useLocalStorage.empty-fallback.test.ts (5 tests) 68ms + ✓ app/api/compare/route.empty-fallback.test.ts (6 tests) 62ms + ✓ app/api/health/route.test.ts (4 tests) 93ms + ✓ app/api/stats/route.mock-integrations.test.ts (5 tests) 119ms + ✓ lib/export3d.test.ts (12 tests) 52ms + ✓ app/api/compare/route.test.ts (20 tests) 108ms + ✓ models/StudentProfile.mock-integrations.test.ts (5 tests) 108ms + ✓ hooks/useLocalStorage.timezone-boundaries.test.ts (5 tests) 83ms + ✓ app/api/og/route.mock-integrations.test.tsx (5 tests) 65ms + ✓ app/generator/components/sections/TechnologyGraph.mock-integrations.test.tsx (5 tests) 22ms + ✓ components/dashboard/GrowthTrendChart.type-compiler.test.tsx (5 tests) 45ms + ✓ lib/github.theme-contrast.test.ts (5 tests) 43ms + ✓ lib/export3d.mouse-interactivity.test.ts (5 tests) 134ms +stderr | app/api/student/resume/confirm/route.test.ts > POST /api/student/resume/confirm Extra Scenarios > returns 200 and bypasses database update when MONGODB_URI is not configured +[WARN] Student profile save bypassed: MONGODB_URI is not set {"environment":"test"} + + ✓ app/api/student/resume/confirm/route.test.ts (11 tests) 165ms + ✓ app/customize/config-io.test.ts (37 tests) 85ms + ✓ lib/graph/recommendationEngine.accessibility.test.ts (5 tests) 37ms + ✓ hooks/useGlowEffect.mock-integrations.test.ts (5 tests) 192ms + ✓ app/components/ScrollRestoration.mouse-interactivity.test.tsx (5 tests) 95ms +stderr | app/api/stats/route.validation.test.ts > GET /api/stats additional runtime coverage > treats bypassCache=true as a refresh request +{"timestamp":"2026-07-23T03:36:19.001Z","type":"SECURITY_EVENT","event":"UNTRUSTED_FORWARDED_HEADER_IGNORED","resolvedIp":"unknown","header":"x-forwarded-for"} + +stderr | app/api/stats/route.validation.test.ts > GET /api/stats additional runtime coverage > records refresh requests through bypassCache=true +{"timestamp":"2026-07-23T03:36:19.164Z","type":"SECURITY_EVENT","event":"STATS_REFRESH_COOLDOWN_VIOLATION","user":"octocat","ip":"127.0.0.1","remainingMs":29987} + + ✓ lib/validations.streakParamsSchema.test.ts (24 tests) 126ms + ✓ app/api/stats/route.validation.test.ts (5 tests) 312ms +stderr | app/api/webhooks/github/route.test.ts > POST /api/webhooks/github > returns 500 when the webhook secret is not configured +[ERROR] Push webhook rejected: GITHUB_WEBHOOK_SECRET is not configured {"route":"/api/webhooks/github"} + +stdout | app/api/webhooks/github/route.test.ts > POST /api/webhooks/github > invalidates the default and current-year contribution cache on push +[INFO] Push webhook invalidated contribution cache {"route":"/api/webhooks/github","username":"octocat","invalidatedKeys":"[REDACTED]"} + + ✓ app/api/webhooks/github/route.test.ts (9 tests) 86ms + ✓ app/api/compare/route.error-resilience.test.ts (5 tests) 67ms + ✓ app/api/achievements/route.accessibility.test.ts (6 tests) 66ms + ✓ app/components/ScrollRestoration.responsive-breakpoints.test.tsx (5 tests) 62ms + ✓ lib/mongodb.test.ts (10 tests) 64ms + ✓ hooks/useDebounce.mock-integrations.test.ts (5 tests) 158ms + ✓ lib/svg/layout.test.ts (45 tests) 74ms + ✓ models/User.empty-fallback.test.ts (5 tests) 31ms + ✓ utils/time.theme-contrast.test.ts (5 tests) 64ms + ✓ app/components/ScrollRestoration.mock-integrations.test.tsx (5 tests) 74ms + ✓ app/api/notify/route.responsive-breakpoints.test.ts (6 tests) 73ms + ✓ app/api/compare/route.mock-integrations.test.ts (5 tests) 68ms + ✓ app/components/ScrollRestoration.empty-fallback.test.tsx (5 tests) 185ms + ✓ hooks/useDebounce.type-compiler.test.ts (5 tests) 128ms + ✓ app/api/github/route.mock-integrations.test.ts (5 tests) 94ms +stderr | utils/getClientIp.theme-contrast.test.ts > getClientIp — Dark & Light Prefers-Color-Scheme Visual Cohesion (Variation 3) > should reject spoofed X-Forwarded-For headers with correct contrast-boundary IP resolution +{"timestamp":"2026-07-23T03:36:26.646Z","type":"SECURITY_EVENT","event":"SPOOFED_HEADER_ATTEMPT","claimedIp":"198.51.100.5","resolvedIp":"203.0.113.10","header":"x-forwarded-for"} + + ✓ utils/getClientIp.theme-contrast.test.ts (5 tests) 28ms + ✓ app/(root)/dashboard/error.type-compiler.test.tsx (5 tests) 9ms + ✓ lib/calculate.timezone-boundaries.test.ts (5 tests) 69ms + ✓ app/contributors/page.top-contributors.test.tsx (1 test) 125ms +stderr | app/api/track-user/route.mouse-interactivity.test.ts > ApiTrack-userRoute Mouse Interactivity & Touch Events (Backend Metaphor) > 5. Verify interactive nodes fallback gracefully: handles MONGODB_URI disconnection overlay gracefully +[WARN] User tracking bypassed: MONGODB_URI is not set {"environment":"development"} + + ✓ app/api/track-user/route.mouse-interactivity.test.ts (5 tests) 76ms +stderr | app/api/pr-insights/route.mock-integrations.test.ts > GET /api/pr-insights - Asynchronous Service Layer Mocking & Local Cache Stubs > falls back to a 504 timeout response when the upstream endpoint aborts +Error fetching PR insights: Error [AbortError]: The operation was aborted. + at /home/atulupadhyay/Contribution/commitpulse/app/api/pr-insights/route.mock-integrations.test.ts:101:24 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:302:11 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:1903:26 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2326:20 + at new Promise (<anonymous>) + at runWithCancel (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2323:10) + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2305:20 + at new Promise (<anonymous>) + at runWithTimeout (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2272:10) + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2955:64 + +stderr | app/api/pr-insights/route.mock-integrations.test.ts > GET /api/pr-insights - Asynchronous Service Layer Mocking & Local Cache Stubs > propagates a 500 error response when the async service layer throws a non-abort error +Error fetching PR insights: Error: Database retrieval failed + at /home/atulupadhyay/Contribution/commitpulse/app/api/pr-insights/route.mock-integrations.test.ts:135:54 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:302:11 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:1903:26 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2326:20 + at new Promise (<anonymous>) + at runWithCancel (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2323:10) + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2305:20 + at new Promise (<anonymous>) + at runWithTimeout (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2272:10) + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2955:64 + + ✓ app/api/pr-insights/route.mock-integrations.test.ts (5 tests) 147ms + ✓ components/dashboard/heatmapUtils.timezone-boundaries.test.ts (5 tests) 151ms + ✓ lib/validations.compareParamsSchema.test.ts (6 tests) 71ms + ✓ app/api/student/resume/confirm/route.empty-fallback.test.ts (5 tests) 110ms + ✓ app/documentation/code-block.timezone-boundaries.test.tsx (5 tests) 51ms + ✓ lib/resume-parser.theme-contrast.test.ts (5 tests) 35ms + ✓ app/components/ScrollRestoration.theme-contrast.test.tsx (5 tests) 153ms + ✓ utils/calculateBurnoutRisk.test.ts (27 tests) 36ms +stderr | app/api/student/resume/upload/route.mock-integrations.test.ts > API Route: Student Resume Upload (Mock Integrations) > 3. should verify correct fallback procedures during fake endpoint/parsing errors +[ERROR] Failed to parse resume {"error":{}} + +stderr | app/api/student/resume/upload/route.mock-integrations.test.ts > API Route: Student Resume Upload (Mock Integrations) > 3. should verify correct fallback procedures during fake endpoint/parsing errors +[ERROR] Failed to parse resume {"error":{}} + + ✓ app/api/student/resume/upload/route.mock-integrations.test.ts (10 tests) 171ms + ✓ lib/i18n/badgeLabels.test.ts (30 tests) 38ms + ✓ lib/calculate.year-boundary.test.ts (5 tests) 93ms + ✓ app/api/compare/route.responsive-breakpoints.test.ts (5 tests) 89ms +(node:77584) [MONGOOSE] Warning: Mongoose: `Document.prototype.validateSync()` is deprecated and will be removed in Mongoose 10. Use `Document.prototype.validate()` instead. +(Use `node-22 --trace-warnings ...` to show where the warning was created) +(node:77584) [MONGOOSE] Warning: Mongoose: `Document.prototype.validateSync()` is deprecated and will be removed in Mongoose 10. Use `Document.prototype.validate()` instead. +(node:77584) [MONGOOSE] Warning: Mongoose: `Document.prototype.validateSync()` is deprecated and will be removed in Mongoose 10. Use `Document.prototype.validate()` instead. +(node:77584) [MONGOOSE] Warning: Mongoose: `Document.prototype.validateSync()` is deprecated and will be removed in Mongoose 10. Use `Document.prototype.validate()` instead. + ✓ models/StudentProfile.error-resilience.test.ts (5 tests) 60ms +stderr | app/api/streak/png/route.error-resilience.test.ts > GET /api/streak/png - Error Resilience > returns fallback SVG when PNG conversion fails +[vitest] The vi.fn() mock did not use 'function' or 'class' in its implementation, see https://vitest.dev/api/vi#vi-spyon for examples. + +stderr | app/api/streak/png/route.error-resilience.test.ts > GET /api/streak/png - Error Resilience > logs conversion errors +[vitest] The vi.fn() mock did not use 'function' or 'class' in its implementation, see https://vitest.dev/api/vi#vi-spyon for examples. + +stderr | app/api/streak/png/route.error-resilience.test.ts > GET /api/streak/png - Error Resilience > handles non Error exceptions safely +[vitest] The vi.fn() mock did not use 'function' or 'class' in its implementation, see https://vitest.dev/api/vi#vi-spyon for examples. + + ✓ app/api/streak/png/route.error-resilience.test.ts (5 tests) 55ms + ✓ app/api/student/resume/upload/route.error-resilience.test.ts (5 tests) 62ms + ✓ app/(root)/dashboard/loading.test.tsx (3 tests) 46ms + ✓ services/github/refresh-rate-limiter.timezone-boundaries.test.ts (5 tests) 145ms + ✓ app/api/github/route.timezone-boundaries.test.ts (5 tests) 102ms + ✓ hooks/useGlowEffect.empty-fallback.test.ts (6 tests) 158ms + ✓ hooks/useGlowEffect.test.ts (4 tests) 70ms + ✓ services/security/track-user-protection.test.ts (12 tests) 31ms + ✓ app/generator/utils/readmeGenerator.mock-integrations.test.ts (5 tests) 28ms + ✓ app/api/github/route.theme-contrast.test.ts (5 tests) 46ms +stderr | utils/tracking.test.ts > trackUser > handles non-serializable input gracefully without throwing +Failed to format tracking payload TypeError: Converting circular structure to JSON + at JSON.<anonymous> (/home/atulupadhyay/Contribution/commitpulse/utils/tracking.test.ts:149:13) + at JSON.stringify (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/spy/dist/index.js:332:34) + at trackUser (/home/atulupadhyay/Contribution/commitpulse/utils/tracking.ts:33:20) + at /home/atulupadhyay/Contribution/commitpulse/utils/tracking.test.ts:152:18 + at Proxy.assertThrows (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/chai/index.js:2798:5) + at Proxy.methodWrapper (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/chai/index.js:1700:25) + at Proxy.<anonymous> (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/expect/dist/index.js:1216:12) + at Proxy.overwritingMethodWrapper (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/chai/index.js:1750:33) + at Proxy.<anonymous> (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/expect/dist/index.js:1552:16) + at Proxy.<anonymous> (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/expect/dist/index.js:1156:15) + + ✓ utils/tracking.test.ts (12 tests) 141ms + ✓ app/api/user-details/route.mouse-interactivity.test.ts (5 tests) 53ms + ✓ app/contributors/page.pagination.test.tsx (2 tests) 138ms + ✓ lib/svg/sanitizer.theme-contrast.test.ts (32 tests) 19ms + ✓ lib/api-contract/extractBadgeParams.test.ts (4 tests) 37ms + ✓ lib/cache.error-resilience.test.ts (5 tests) 55ms +stderr | app/api/student/resume/confirm/route.mouse-interactivity.test.ts > ApiStudentResumeConfirmRoute Mouse Interactivity > returns bypass response when MONGODB_URI is not configured +[WARN] Student profile save bypassed: MONGODB_URI is not set {"environment":"test"} + + ✓ app/api/student/resume/confirm/route.mouse-interactivity.test.ts (5 tests) 42ms + ✓ lib/logger.test.ts (5 tests) 45ms + ✓ lib/mongodb.empty-fallback.test.ts (6 tests) 27ms + ✓ lib/svg/themes/neon.test.ts (5 tests) 33ms + ✓ components/reviewform.type-compiler.test.tsx (5 tests) 18ms + ✓ models/Notification.responsive-breakpoints.test.ts (5 tests) 144ms + ✓ app/api/pr-insights/route.timezone-boundaries.test.ts (5 tests) 122ms +stderr | lib/resume-parser.error-resilience.test.ts > resume-parser-error-resilience > should handle buffer toString failures gracefully (exception safety) +Failed to parse PDF using pdf-parse, falling back to UTF-8 decoding: Error: Buffer conversion failed + at Buffer.<anonymous> (/home/atulupadhyay/Contribution/commitpulse/lib/resume-parser.error-resilience.test.ts:43:13) + at Buffer.toString (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/spy/dist/index.js:332:34) + at extractTextFromBuffer (/home/atulupadhyay/Contribution/commitpulse/lib/resume-parser.ts:140:18) + at parseResume (/home/atulupadhyay/Contribution/commitpulse/lib/resume-parser.ts:205:25) + at /home/atulupadhyay/Contribution/commitpulse/lib/resume-parser.error-resilience.test.ts:46:18 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:302:11 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:1903:26 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2326:20 + at new Promise (<anonymous>) + at runWithCancel (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2323:10) + + ✓ lib/resume-parser.error-resilience.test.ts (7 tests) 119ms +stderr | app/api/pr-insights/route.mouse-interactivity.test.ts > pr-insights mouse interactivity contract > uses per-IP rate limiting so different IPs get independent buckets +{"timestamp":"2026-07-23T03:36:47.159Z","type":"SECURITY_EVENT","event":"UNTRUSTED_FORWARDED_HEADER_IGNORED","resolvedIp":"unknown","header":"x-forwarded-for"} + +stderr | app/api/pr-insights/route.mouse-interactivity.test.ts > pr-insights mouse interactivity contract > returns error message from thrown Error +Error fetching PR insights: Error: Service failed + at /home/atulupadhyay/Contribution/commitpulse/app/api/pr-insights/route.mouse-interactivity.test.ts:93:50 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:302:11 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:1903:26 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2326:20 + at new Promise (<anonymous>) + at runWithCancel (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2323:10) + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2305:20 + at new Promise (<anonymous>) + at runWithTimeout (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2272:10) + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2955:64 + +stderr | app/api/pr-insights/route.mouse-interactivity.test.ts > pr-insights mouse interactivity contract > returns fallback error message for unknown thrown values +Error fetching PR insights: unknown + + ✓ app/api/pr-insights/route.mouse-interactivity.test.ts (7 tests) 248ms + ✓ lib/validations.statsParamsSchema.test.ts (8 tests) 269ms + ✓ app/api/streak/png/route.mock-integrations.test.ts (5 tests) 152ms +stdout | services/github/background-refresh.mock-integrations.test.ts > BackgroundRefresh Mock Integrations > mocks standard asynchronous imports using stubs for background refresh +[BackgroundRefresh] Queuing background refresh for: john_doe + +stdout | services/github/background-refresh.mock-integrations.test.ts > BackgroundRefresh Mock Integrations > mocks standard asynchronous imports using stubs for background refresh +[BackgroundRefresh] Successfully completed background refresh for: john_doe + +stdout | services/github/background-refresh.mock-integrations.test.ts > BackgroundRefresh Mock Integrations > tests service loading paths to ensure pending state overlays render +[BackgroundRefresh] Queuing background refresh for: pending_user + +stdout | services/github/background-refresh.mock-integrations.test.ts > BackgroundRefresh Mock Integrations > tests service loading paths to ensure pending state overlays render +[BackgroundRefresh] Successfully completed background refresh for: pending_user + +stdout | services/github/background-refresh.mock-integrations.test.ts > BackgroundRefresh Mock Integrations > verifies correct fallback procedures during fake endpoint timeout blocks +[BackgroundRefresh] Queuing background refresh for: timeout_user + + ✓ services/github/background-refresh.mock-integrations.test.ts (5 tests) 110ms + ✓ app/generator/components/sections/TechnologiesSection.type-compiler.test.tsx (5 tests) 40ms + ✓ lib/rate-limit.empty-fallback.test.ts (5 tests) 53ms + ✓ app/contributors/page.type-compiler.test.tsx (5 tests) 100ms + ✓ app/api/notify/route.type-compiler.test.ts (5 tests) 15ms + ✓ app/customize/utils.responsive-breakpoints.test.ts (5 tests) 23ms + ✓ app/components/ScrollRestoration.type-compiler.test.tsx (5 tests) 54ms + ✓ lib/calculate.fractional-tz.test.ts (2 tests) 116ms + ✓ lib/svg/themes/tokyo_night.test.ts (5 tests) 24ms + ✓ services/github/refresh-policy.empty-fallback.test.ts (5 tests) 72ms +(node:78139) [MONGOOSE] Warning: Mongoose: `Document.prototype.validateSync()` is deprecated and will be removed in Mongoose 10. Use `Document.prototype.validate()` instead. +(Use `node-22 --trace-warnings ...` to show where the warning was created) +(node:78139) [MONGOOSE] Warning: Mongoose: `Document.prototype.validateSync()` is deprecated and will be removed in Mongoose 10. Use `Document.prototype.validate()` instead. +(node:78139) [MONGOOSE] Warning: Mongoose: `Document.prototype.validateSync()` is deprecated and will be removed in Mongoose 10. Use `Document.prototype.validate()` instead. +(node:78139) [MONGOOSE] Warning: Mongoose: `Document.prototype.validateSync()` is deprecated and will be removed in Mongoose 10. Use `Document.prototype.validate()` instead. + ✓ models/StudentProfile.type-compiler.test.ts (5 tests) 59ms + ✓ lib/i18n/languages/hi.test.ts (5 tests) 27ms + ✓ services/github/refresh-rate-limiter.mouse-interactivity.test.ts (5 tests) 88ms + ✓ lib/calculate.mock-integrations.test.ts (5 tests) 54ms + ✓ utils/clipboard.test.ts (4 tests) 144ms + ✓ lib/graph/recommendationEngine.test.ts (6 tests) 26ms + ✓ next-env.d.empty-fallback.test.ts (5 tests) 67ms + ✓ services/github/refresh-policy.timezone-boundaries.test.ts (5 tests) 84ms + ✓ lib/svg/sanitizer.empty-fallback.test.ts (5 tests) 35ms + ✓ lib/github-owner-verification.test.ts (5 tests) 34ms + ✓ app/customize/utils.test.ts (25 tests) 36ms + ✓ app/api/wrapped/yearBoundary.test.ts (5 tests) 135ms + ✓ lib/syncQueue.test.ts (6 tests) 40ms + ✓ lib/svg/layoutConstants.empty-fallback.test.ts (5 tests) 24ms + ✓ app/customize/utils.mock-integrations.test.ts (5 tests) 21ms + ✓ app/generator/utils/githubMapper.test.ts (4 tests) 16ms + ✓ services/security/track-user-protection.timezone-boundaries.test.ts (5 tests) 51ms + ✓ services/github/quota-monitor.empty-fallback.test.ts (5 tests) 43ms + ✓ lib/svg/themes/midnight_ocean.test.ts (6 tests) 39ms + ✓ app/generator/data/technologies.error-resilience.test.ts (5 tests) 80ms + ✓ lib/github.telemetry.test.ts (2 tests) 19ms + ✓ lib/svg/generator.buildTowerPaths.test.ts (5 tests) 58ms + ✓ app/api/user-details/route.theme-contrast.test.ts (5 tests) 82ms + ✓ app/generator/utils/readmeGenerator.responsive-breakpoints.test.ts (5 tests) 23ms + ✓ app/api/webhooks/cicd/route.test.ts (4 tests) 56ms + ✓ app/api/student/resume/confirm/route.error-resilience.test.ts (5 tests) 57ms + ✓ lib/resume-parser.mouse-interactivity.test.ts (5 tests) 155ms + ✓ app/api/wrapped/route.type-compiler.test.ts (5 tests) 20ms + ✓ lib/svg/generatorConstants.test.ts (27 tests) 29ms + ✓ app/api/stats/route.error-resilience.test.ts (5 tests) 77ms +stdout | services/github/background-refresh.theme-contrast.test.ts > BackgroundRefresh - Theme Contrast Equivalent (Mode Cohesion) > Behavior Adaptation Cohesion: accurately transitions user from Idle to Active Job state +[BackgroundRefresh] Queuing background refresh for: transition_user + +stdout | services/github/background-refresh.theme-contrast.test.ts > BackgroundRefresh - Theme Contrast Equivalent (Mode Cohesion) > Behavior Adaptation Cohesion: accurately transitions user from Idle to Active Job state +[BackgroundRefresh] Successfully completed background refresh for: transition_user + +stdout | services/github/background-refresh.theme-contrast.test.ts > BackgroundRefresh - Theme Contrast Equivalent (Mode Cohesion) > Contrast Verification (Concurrency): rigidly rejects colliding background jobs to preserve active state contrast +[BackgroundRefresh] Queuing background refresh for: collide_user +[BackgroundRefresh] Refresh already active for: collide_user + +stdout | services/github/background-refresh.theme-contrast.test.ts > BackgroundRefresh - Theme Contrast Equivalent (Mode Cohesion) > Contrast Verification (Concurrency): rigidly rejects colliding background jobs to preserve active state contrast +[BackgroundRefresh] Successfully completed background refresh for: collide_user + +stdout | services/github/background-refresh.theme-contrast.test.ts > BackgroundRefresh - Theme Contrast Equivalent (Mode Cohesion) > Configuration Preservation (Error Resilience): clears active state smoothly upon integration failures without getting stuck +[BackgroundRefresh] Queuing background refresh for: error_user + +stderr | services/github/background-refresh.theme-contrast.test.ts > BackgroundRefresh - Theme Contrast Equivalent (Mode Cohesion) > Configuration Preservation (Error Resilience): clears active state smoothly upon integration failures without getting stuck +[BackgroundRefresh] Background refresh failed for: error_user Error: Network failure + at /home/atulupadhyay/Contribution/commitpulse/services/github/background-refresh.theme-contrast.test.ts:82:67 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:302:11 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:1903:26 + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2326:20 + at new Promise (<anonymous>) + at runWithCancel (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2323:10) + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2305:20 + at new Promise (<anonymous>) + at runWithTimeout (file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2272:10) + at file:///home/atulupadhyay/Contribution/commitpulse/node_modules/@vitest/runner/dist/chunk-artifact.js:2955:64 + +stdout | services/github/background-refresh.theme-contrast.test.ts > BackgroundRefresh - Theme Contrast Equivalent (Mode Cohesion) > Foreground/Background Cohesion (Sanitization): flawlessly aligns active states across disparate formatting inputs +[BackgroundRefresh] Queuing background refresh for: messy_user + +stdout | services/github/background-refresh.theme-contrast.test.ts > BackgroundRefresh - Theme Contrast Equivalent (Mode Cohesion) > Foreground/Background Cohesion (Sanitization): flawlessly aligns active states across disparate formatting inputs +[BackgroundRefresh] Successfully completed background refresh for: messy_user + + ✓ services/github/background-refresh.theme-contrast.test.ts (5 tests) 96ms + ✓ services/security/track-user-protection.responsive-breakpoints.test.ts (5 tests) 58ms + ✓ services/github/refresh-policy.theme-contrast.test.ts (5 tests) 67ms + ✓ app/api/stats/route.type-compiler.test.ts (5 tests) 67ms + ✓ lib/svg/generator.deterministicRandom.test.ts (5 tests) 20ms +stdout | services/github/background-refresh.responsive-breakpoints.test.ts > BackgroundRefresh - Responsive Breakpoints (Multi-device Columns & Mobile Viewport Layouts) > Mobile Viewport (375px): minimal-length usernames are handled without overflow or stuck state +[BackgroundRefresh] Queuing background refresh for: a + +stdout | services/github/background-refresh.responsive-breakpoints.test.ts > BackgroundRefresh - Responsive Breakpoints (Multi-device Columns & Mobile Viewport Layouts) > Mobile Viewport (375px): minimal-length usernames are handled without overflow or stuck state +[BackgroundRefresh] Successfully completed background refresh for: a + +stdout | services/github/background-refresh.responsive-breakpoints.test.ts > BackgroundRefresh - Responsive Breakpoints (Multi-device Columns & Mobile Viewport Layouts) > Column Reflow: multiple concurrent jobs for different users queue independently without collapsing into one +[BackgroundRefresh] Queuing background refresh for: user_col_1 +[BackgroundRefresh] Queuing background refresh for: user_col_2 +[BackgroundRefresh] Queuing background refresh for: user_col_3 + +stdout | services/github/background-refresh.responsive-breakpoints.test.ts > BackgroundRefresh - Responsive Breakpoints (Multi-device Columns & Mobile Viewport Layouts) > Column Reflow: multiple concurrent jobs for different users queue independently without collapsing into one +[BackgroundRefresh] Successfully completed background refresh for: user_col_1 +[BackgroundRefresh] Successfully completed background refresh for: user_col_2 +[BackgroundRefresh] Successfully completed background refresh for: user_col_3 + +stdout | services/github/background-refresh.responsive-breakpoints.test.ts > BackgroundRefresh - Responsive Breakpoints (Multi-device Columns & Mobile Viewport Layouts) > No Horizontal Scroll: maximum-length usernames (39 chars) do not cause overflow or blocked job state +[BackgroundRefresh] Queuing background refresh for: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa + +stdout | services/github/background-refresh.responsive-breakpoints.test.ts > BackgroundRefresh - Responsive Breakpoints (Multi-device Columns & Mobile Viewport Layouts) > No Horizontal Scroll: maximum-length usernames (39 chars) do not cause overflow or blocked job state +[BackgroundRefresh] Successfully completed background refresh for: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa + +stdout | services/github/background-refresh.responsive-breakpoints.test.ts > BackgroundRefresh - Responsive Breakpoints (Multi-device Columns & Mobile Viewport Layouts) > Navigation Scaling: usernames with mixed casing and whitespace scale down gracefully to normalized active state +[BackgroundRefresh] Queuing background refresh for: navuser_xl + +stdout | services/github/background-refresh.responsive-breakpoints.test.ts > BackgroundRefresh - Responsive Breakpoints (Multi-device Columns & Mobile Viewport Layouts) > Mobile Toggle State: rapid successive trigger attempts on same user toggle cleanly without duplicate jobs +[BackgroundRefresh] Queuing background refresh for: toggle_user +[BackgroundRefresh] Refresh already active for: toggle_user + +stdout | services/github/background-refresh.responsive-breakpoints.test.ts > BackgroundRefresh - Responsive Breakpoints (Multi-device Columns & Mobile Viewport Layouts) > Mobile Toggle State: rapid successive trigger attempts on same user toggle cleanly without duplicate jobs +[BackgroundRefresh] Successfully completed background refresh for: toggle_user + +stdout | services/github/background-refresh.responsive-breakpoints.test.ts > BackgroundRefresh - Responsive Breakpoints (Multi-device Columns & Mobile Viewport Layouts) > Mobile Toggle State: rapid successive trigger attempts on same user toggle cleanly without duplicate jobs +[BackgroundRefresh] Queuing background refresh for: toggle_user + +stdout | services/github/background-refresh.responsive-breakpoints.test.ts > BackgroundRefresh - Responsive Breakpoints (Multi-device Columns & Mobile Viewport Layouts) > Mobile Toggle State: rapid successive trigger attempts on same user toggle cleanly without duplicate jobs +[BackgroundRefresh] Successfully completed background refresh for: toggle_user + + ✓ services/github/background-refresh.responsive-breakpoints.test.ts (5 tests) 54ms + ✓ app/api/wrapped/route.empty-fallback.test.ts (5 tests) 86ms + ✓ app/api/notify/route.error-resilience.test.ts (5 tests) 52ms + ✓ components/dashboard/LanguageChart.timezone-boundaries.test.tsx (5 tests) 46ms + ✓ lib/svg/glacier.test.ts (5 tests) 18ms + ✓ components/dashboard/heatmapUtils.mock-integrations.test.ts (5 tests) 26ms + ✓ app/generator/data/socials.error-resilience.test.ts (5 tests) 24ms +stderr | services/github/burnout-analyzer.test.ts > BurnoutAnalyzer Service > falls back to rules-based recommendations when Gemini returns malformed JSON +Gemini returned malformed JSON, skipping AI recommendations. + + ✓ services/github/burnout-analyzer.test.ts (3 tests) 57ms + ✓ services/github/background-refresh.timezone-boundaries.test.ts (5 tests) 40ms + ✓ app/generator/components/sections/NameSection.timezone-boundaries.test.tsx (5 tests) 14ms + ✓ lib/svg/constants.responsive-breakpoints.test.ts (5 tests) 26ms + ✓ app/api/streak/png/route.empty-fallback.test.ts (5 tests) 33ms + ✓ lib/svg/generator.wrappedEscape.test.ts (4 tests) 31ms + ✓ app/api/streak/route.type-compiler.test.ts (5 tests) 79ms + ✓ lib/svg/themes/cyber-pulse.test.ts (5 tests) 56ms + ✓ app/customize/types.timezone-boundaries.test.ts (5 tests) 27ms + ✓ app/generator/data/socials.mock-integrations.test.ts (5 tests) 18ms + ✓ app/generator/data/socials.theme-contrast.test.ts (6 tests) 43ms +(node:78861) [MONGOOSE] Warning: Mongoose: `Document.prototype.validateSync()` is deprecated and will be removed in Mongoose 10. Use `Document.prototype.validate()` instead. +(Use `node-22 --trace-warnings ...` to show where the warning was created) +(node:78861) [MONGOOSE] Warning: Mongoose: `Document.prototype.validateSync()` is deprecated and will be removed in Mongoose 10. Use `Document.prototype.validate()` instead. +(node:78861) [MONGOOSE] Warning: Mongoose: `Document.prototype.validateSync()` is deprecated and will be removed in Mongoose 10. Use `Document.prototype.validate()` instead. +(node:78861) [MONGOOSE] Warning: Mongoose: `Document.prototype.validateSync()` is deprecated and will be removed in Mongoose 10. Use `Document.prototype.validate()` instead. + ✓ models/Notification.test.ts (12 tests) 46ms + ✓ utils/urls.test.ts (10 tests) 24ms + ✓ app/api/user-details/route.type-compiler.test.ts (5 tests) 45ms + ✓ utils/dateRange.theme-contrast.test.ts (5 tests) 16ms + ✓ models/StudentProfile.test.ts (6 tests) 37ms + ✓ src/utils/svgRenderer.empty-fallback.test.ts (5 tests) 27ms + ✓ services/github/ci-analytics.security.test.ts (1 test) 25ms + ✓ lib/svg/themes/nord.test.ts (6 tests) 26ms + ✓ components/InteractiveViewer.type-compiler.test.tsx (5 tests) 30ms + ✓ app/customize/types.mock-integrations.test.ts (5 tests) 29ms + ✓ app/api/streak/png/route.type-compiler.test.ts (5 tests) 52ms + ✓ lib/analytics/teamHealth.test.ts (4 tests) 34ms + ✓ services/github/validate-user.mouse-interactivity.test.ts (5 tests) 34ms + ✓ services/github/quota-monitor.error-resilience.test.ts (5 tests) 28ms + ✓ middleware.rate-limit.test.ts (6 tests) 42ms + ✓ app/api/wrapped/route.error-resilience.test.ts (5 tests) 58ms + ✓ app/api/streak/png/route.theme-contrast.test.ts (5 tests) 49ms + ✓ app/api/pr-insights/route.empty-fallback.test.ts (5 tests) 75ms +(node:79169) [MONGOOSE] Warning: Mongoose: `Document.prototype.validateSync()` is deprecated and will be removed in Mongoose 10. Use `Document.prototype.validate()` instead. +(Use `node-22 --trace-warnings ...` to show where the warning was created) +(node:79169) [MONGOOSE] Warning: Mongoose: `Document.prototype.validateSync()` is deprecated and will be removed in Mongoose 10. Use `Document.prototype.validate()` instead. +(node:79169) [MONGOOSE] Warning: Mongoose: `Document.prototype.validateSync()` is deprecated and will be removed in Mongoose 10. Use `Document.prototype.validate()` instead. +(node:79169) [MONGOOSE] Warning: Mongoose: `Document.prototype.validateSync()` is deprecated and will be removed in Mongoose 10. Use `Document.prototype.validate()` instead. +(node:79169) [MONGOOSE] Warning: Mongoose: `Document.prototype.validateSync()` is deprecated and will be removed in Mongoose 10. Use `Document.prototype.validate()` instead. + ✓ models/Notification.empty-fallback.test.ts (5 tests) 62ms +(node:79141) [MONGOOSE] Warning: Mongoose: `Document.prototype.validateSync()` is deprecated and will be removed in Mongoose 10. Use `Document.prototype.validate()` instead. +(Use `node-22 --trace-warnings ...` to show where the warning was created) +(node:79141) [MONGOOSE] Warning: Mongoose: `Document.prototype.validateSync()` is deprecated and will be removed in Mongoose 10. Use `Document.prototype.validate()` instead. + ✓ models/Notification.type-compiler.test.ts (5 tests) 36ms + ✓ lib/svg/themes/test-utils.empty-fallback.test.ts (5 tests) 30ms + ✓ lib/resume-parser.binary.test.ts (2 tests) 32ms + ✓ models/User.connection-state-0-v5.test.ts (5 tests) 74ms + ✓ lib/cache.mouse-interactivity.test.ts (5 tests) 143ms +stderr | utils/getClientIp.accessibility.test.ts > getClientIp - Accessibility Standards & Screen Reader Aria Compliance > Focus Outline Behavior: ignores untrusted forwarded headers when no trusted peer exists +{"timestamp":"2026-07-23T03:37:34.688Z","type":"SECURITY_EVENT","event":"UNTRUSTED_FORWARDED_HEADER_IGNORED","resolvedIp":"unknown","header":"x-forwarded-for"} + +stderr | utils/getClientIp.accessibility.test.ts > getClientIp - Accessibility Standards & Screen Reader Aria Compliance > Tab Ordering: wildcard trust returns the leftmost client IP in the chain +{"timestamp":"2026-07-23T03:37:34.700Z","type":"SECURITY_EVENT","event":"WILDCARD_TRUST_USED","resolvedIp":"198.51.100.5","chain":["198.51.100.5","203.0.113.10"],"header":"x-forwarded-for"} + + ✓ utils/getClientIp.accessibility.test.ts (5 tests) 34ms + ✓ lib/svg/themes/rose.test.ts (6 tests) 18ms + ✓ services/github/refresh-rate-limiter.mock-integrations.test.ts (5 tests) 25ms + ✓ hooks/useGlowEffect.theme-contrast.test.ts (5 tests) 22ms + ✓ components/dashboard/HistoricalTrendView.type-compiler.test.tsx (5 tests) 35ms + ✓ utils/dateRange.empty-fallback.test.ts (6 tests) 27ms + ✓ services/github/background-refresh.type-compiler.test.ts (5 tests) 11ms + ✓ components/dashboard/RefreshButton.type-compiler.test.tsx (5 tests) 55ms + ✓ app/contributors/loading.type-compiler.test.tsx (5 tests) 58ms + ✓ services/github/pr-insights.empty-fallback.test.ts (5 tests) 35ms + ✓ lib/resume-parser.empty-fallback.test.ts (11 tests) 79ms + ✓ app/api/architecture/route.test.ts (1 test) 27ms + ✓ components/dashboard/tooltipUtils.accessibility.test.ts (5 tests) 24ms + ✓ auth.session.test.ts (2 tests) 11ms + ✓ app/generator/data/socials.type-compiler.test.ts (5 tests) 59ms + ✓ lib/svg/themes/nord_light.test.ts (5 tests) 36ms + ✓ lib/svg/generator.getSizeScale.test.ts (5 tests) 25ms + ✓ types/student.empty-fallback.test.ts (6 tests) 23ms + ✓ services/github/refresh-rate-limiter.test.ts (5 tests) 103ms + ✓ app/contributors/ContributorsSearch.type-compiler.test.tsx (5 tests) 60ms + ✓ lib/i18n/languages/es.test.ts (5 tests) 31ms + ✓ utils/tracking.empty-fallback.test.ts (5 tests) 43ms + ✓ lib/notification-management-token.empty-fallback.test.ts (26 tests) 26ms + ✓ lib/graph/recommendationEngine.empty-fallback.test.ts (5 tests) 48ms + ✓ app/api/track-user/route.mock-integrations.test.ts (5 tests) 26ms + ✓ lib/validations.githubParamsSchema.test.ts (7 tests) 38ms + ✓ utils/trustedProxy.test.ts (11 tests) 63ms + ✓ app/api/user-details/route.mock-integrations.test.ts (5 tests) 25ms + ✓ lib/validations.notifyPostSchema.test.ts (5 tests) 38ms + ✓ services/spotify/api.test.ts (5 tests) 54ms + ✓ components/dashboard/PRInsights/Highlights.type-compiler.test.tsx (5 tests) 22ms + ✓ app/customize/utils.mouse-interactivity.test.ts (5 tests) 9ms + ✓ utils/time.empty-fallback.test.ts (4 tests) 18ms + ✓ lib/graph/recommendationEngine.logic.test.ts (5 tests) 35ms + ✓ lib/svg/themes/catppuccin_latte.test.ts (5 tests) 18ms + ✓ lib/svg/themes/light.test.ts (5 tests) 17ms + ✓ lib/svg/themes/highcontrast.test.ts (5 tests) 18ms + ✓ lib/validations.theme-contrast.test.ts (5 tests) 66ms + ✓ services/github/webhook-handler.test.ts (11 tests) 82ms + ✓ app/layout.mouse-interactivity.test.tsx (5 tests) 49ms + ✓ app/customize/utils.empty-fallback.test.ts (5 tests) 17ms + ✓ services/github/validate-user.test.ts (5 tests) 47ms + ✓ app/contributors/page.timezone-boundaries.test.tsx (4 tests) 16ms + ✓ hooks/useShareActions.type-compiler.test.ts (5 tests) 15ms + ✓ app/customize/types.theme-contrast.test.ts (5 tests) 42ms + ✓ app/api/track-user/route.responsive-breakpoints.test.ts (5 tests) 43ms + ✓ app/customize/components/ExportPanel.type-compiler.test.tsx (5 tests) 83ms + ✓ app/generator/utils/readmeGenerator.test.ts (4 tests) 26ms + ✓ lib/svg/constants.timezone-boundaries.test.ts (5 tests) 86ms + ✓ lib/api-contract/detectBreakingChanges.test.ts (9 tests) 59ms + ✓ services/github/validate-user.theme-contrast.test.ts (5 tests) 58ms + ✓ utils/dateRange.test.ts (15 tests) 117ms + ✓ app/customize/types.empty-fallback.test.ts (5 tests) 57ms + ✓ tests/claim-handler.test.ts (7 tests) 69ms + ✓ components/CherryBlossom.type-compiler.test.tsx (5 tests) 45ms +stdout | lib/svg/optimizer.test.ts > optimizeSVG > should achieve significant size reduction on a larger sample SVG +Original: 1062 bytes, Minified: 695 bytes, Reduction: 34.56% + + ✓ lib/svg/optimizer.test.ts (15 tests) 38ms + ✓ lib/svg/themes/dracula.test.ts (5 tests) 88ms + ✓ services/github/refresh-rate-limiter.responsive-breakpoints.test.ts (5 tests) 18ms + ✓ lib/rate-limit.theme-contrast.test.ts (5 tests) 51ms + ✓ lib/i18n/languages/ta.test.ts (5 tests) 13ms + ✓ lib/secretScanner.test.ts (14 tests) 97ms + ✓ services/github/quota-monitor.responsive-breakpoints.test.ts (5 tests) 20ms + ✓ app/generator/components/sections/TechnologiesSection.responsive-breakpoints.test.tsx (5 tests) 15ms + ✓ app/customize/utils.error-resilience.test.ts (5 tests) 20ms + ✓ services/github/refresh-policy.test.ts (5 tests) 38ms + ✓ components/KonamiEasterEgg.type-compiler.test.tsx (5 tests) 51ms + ✓ components/Leaderboard.type-compiler.test.tsx (5 tests) 23ms + ✓ lib/svg/themes.theme-contrast.test.ts (5 tests) 31ms + ✓ lib/__tests__/bot-filter.test.ts (5 tests) 15ms + ✓ app/generator/components/sections/SocialsSection.type-compiler.test.tsx (5 tests) 29ms + ✓ services/security/track-user-protection.empty-fallback.test.ts (5 tests) 30ms + ✓ app/layout.theme-contrast.test.tsx (5 tests) 33ms + ✓ utils/cacheControl.theme-contrast.test.ts (5 tests) 11ms + ✓ components/dashboard/tooltipUtils.mock-integrations.test.ts (5 tests) 27ms + ✓ app/generator/utils/readmeGenerator.theme-contrast.test.ts (5 tests) 15ms + ✓ lib/svg/animations.test.ts (9 tests) 55ms + ✓ app/generator/utils/readmeGenerator.empty-fallback.test.ts (7 tests) 15ms + ✓ components/dashboard/DeploymentTracker.type-compiler.test.tsx (12 tests) 25ms + ✓ hooks/useRecentSearches.type-compiler.test.ts (5 tests) 29ms + ✓ app/customize/types.error-resilience.test.ts (5 tests) 18ms + ✓ models/StudentProfile.theme-contrast.test.ts (5 tests) 15ms + ✓ services/github/validate-user.empty-fallback.test.ts (5 tests) 19ms + ✓ services/security/track-user-protection.error-resilience.test.ts (5 tests) 21ms + ✓ lib/svg/constants.mouse-interactivity.test.ts (5 tests) 19ms + ✓ app/generator/components/SectionCard.type-compiler.test.tsx (5 tests) 23ms + ✓ app/generator/utils/readmeGenerator.timezone-boundaries.test.ts (5 tests) 34ms + ✓ lib/svg/generator.theme-contrast.test.ts (5 tests) 24ms + ✓ services/github/quota-monitor.timezone-boundaries.test.ts (5 tests) 12ms + ✓ app/generator/components/sections/NameSection.type-compiler.test.tsx (5 tests) 17ms + ✓ lib/graph/dependencyGraph.theme-contrast.test.ts (5 tests) 17ms + ✓ lib/svg/layout.empty-fallback.test.ts (5 tests) 43ms + ✓ lib/i18n/languages/en.test.ts (5 tests) 16ms + ✓ app/api/og/route.type-compiler.test.tsx (5 tests) 13ms + ✓ utils/dashboardPeriod.empty-fallback.test.ts (6 tests) 43ms + ✓ utils/trustedProxy.empty-fallback.test.ts (5 tests) 22ms + ✓ services/github/ci-analytics.test.ts (4 tests) 20ms + ✓ lib/svg/languageColors.test.ts (6 tests) 8ms + ✓ lib/svg/generator.empty-fallback.test.ts (5 tests) 19ms + ✓ lib/cache.empty-fallback.test.ts (5 tests) 14ms + ✓ components/dashboard/tooltipUtils.responsive-breakpoints.test.ts (5 tests) 13ms + ✓ app/customize/types.responsive-breakpoints.test.ts (5 tests) 31ms + ✓ app/api/student/resume/confirm/route.type-compiler.test.ts (5 tests) 23ms + ✓ app/generator/utils/urlSanitizer.test.ts (8 tests) 23ms + ✓ app/generator/types.mouse-interactivity.test.ts (5 tests) 38ms + ✓ app/customize/utils.timezone-boundaries.test.ts (5 tests) 66ms + ✓ lib/svg/themes/test-utils.theme-contrast.test.ts (5 tests) 15ms + ✓ services/github/quota-monitor.mock-integrations.test.ts (6 tests) 45ms + ✓ app/api/track-user/route.type-compiler.test.ts (5 tests) 14ms + ✓ utils/trustedProxy.coverage.test.ts (5 tests) 12ms + ✓ app/customize/types.mouse-interactivity.test.ts (5 tests) 21ms + ✓ locales/pt.test.ts (4 tests) 31ms + ✓ lib/validations.ogParamsSchema.test.ts (6 tests) 25ms + ✓ app/achievements/celebration.test.ts (4 tests) 15ms + ✓ scripts/benchmark-svg.theme-contrast.test.ts (5 tests) 73ms + ✓ lib/samplePreviewGraphs.test.ts (6 tests) 21ms + ✓ lib/validations.notifyGetSchema.test.ts (5 tests) 31ms + ✓ components/dashboard/tooltipUtils.theme-contrast.test.ts (8 tests) 43ms + ✓ app/generator/utils/readmeGenerator.mouse-interactivity.test.ts (5 tests) 17ms + ✓ app/api/student/resume/upload/route.type-compiler.test.ts (5 tests) 29ms + ✓ components/dashboard/heatmapUtils.error-resilience.test.ts (5 tests) 38ms + ✓ lib/svg/themes.validation.test.ts (5 tests) 19ms + ✓ lib/svg/languageColors.empty-fallback.test.ts (5 tests) 12ms + ✓ lib/i18n/languages/pt.test.ts (5 tests) 17ms + ✓ app/generator/types.responsive-breakpoints.test.ts (5 tests) 12ms + ✓ utils/urls.empty-fallback.test.ts (6 tests) 12ms + ✓ app/api/user-details/route.empty-fallback.test.ts (5 tests) 15ms + ✓ lib/validations.coerceQueryParams.test.ts (4 tests) 34ms + ✓ app/components/theme-switch.type-compiler.test.tsx (5 tests) 33ms + ✓ app/layout.type-compiler.test.tsx (5 tests) 13ms + ✓ lib/svg/sanitizer.accessibility.test.ts (5 tests) 25ms + ✓ lib/svg/themes/ocean.test.ts (5 tests) 28ms + ✓ components/BrandParticles.type-compiler.test.tsx (5 tests) 19ms + ✓ lib/i18n/languages/zh.test.ts (5 tests) 11ms + ✓ lib/svg/animations.theme-contrast.test.ts (5 tests) 10ms + ✓ app/customize/components/SectionLabel.type-compiler.test.tsx (5 tests) 34ms + ✓ app/generator/data/socials.responsive-breakpoints.test.ts (5 tests) 23ms + ✓ app/api/github/route.type-compiler.test.ts (5 tests) 15ms + ✓ app/components/HeroSection.type-compiler.test.tsx (5 tests) 11ms + ✓ app/generator/components/sections/DescriptionSection.type-compiler.test.tsx (5 tests) 34ms + ✓ app/generator/utils/workflowGenerator.test.ts (6 tests) 18ms + ✓ utils/cacheControl.empty-fallback.test.ts (6 tests) 25ms + ✓ lib/i18n/badgeLabels.accessibility.test.ts (5 tests) 124ms + ✓ lib/sanitize-git-credentials.test.ts (6 tests) 24ms + ✓ lib/mongodb.theme-contrast.test.ts (5 tests) 17ms + ✓ lib/svg/generatorConstants.theme-contrast.test.ts (5 tests) 24ms + ✓ app/customize/utils.theme-contrast.test.ts (5 tests) 17ms + ✓ components/ReturnToTop.type-compiler.test.tsx (5 tests) 16ms + ✓ app/customize/components/ThemeSelector.type-compiler.test.tsx (5 tests) 11ms + ✓ components/dashboard/AchievementsSkeleton.type-compiler.test.tsx (5 tests) 24ms + ✓ lib/svg/themes/obsidian.test.ts (5 tests) 12ms + ✓ app/customize/types.test.ts (3 tests) 11ms + ✓ types/dashboard.theme-contrast.test.ts (5 tests) 23ms + ✓ lib/svg/generator.particleCount.test.ts (6 tests) 42ms + ✓ lib/svg/themes/sunset.test.ts (5 tests) 19ms + ✓ app/generator/types.type-compiler.test.ts (5 tests) 39ms + ✓ lib/svg/generatorConstants.empty-fallback.test.ts (5 tests) 19ms + ✓ next-env-d-stability.test.ts (5 tests) 161ms + ✓ services/github/refresh-policy.responsive-breakpoints.test.ts (3 tests) 20ms + ✓ lib/svg/fonts.empty-fallback.test.ts (5 tests) 28ms + ✓ lib/svg/fonts.accessibility.test.ts (5 tests) 12ms + ✓ lib/svg/constants.empty-fallback.test.ts (5 tests) 11ms + ✓ utils/sanitize.test.ts (5 tests) 12ms + ✓ app/generator/types.empty-fallback.test.ts (5 tests) 14ms + ✓ models/StudentProfile.mouse-interactivity.test.ts (5 tests) 40ms + ✓ lib/svg/wakatime.test.ts (3 tests) 13ms + ✓ lib/calculate.type-compiler.test.ts (5 tests) 9ms + ✓ components/FeatureCards.type-compiler.test.tsx (5 tests) 15ms + ✓ app/generator/components/sections/TechnologiesSection.mouse-interactivity.test.tsx (5 tests) 13ms + ✓ app/compare/page.type-compiler.test.tsx (5 tests) 13ms + ✓ components/commitpulse-logo.theme-contrast.test.tsx (5 tests) 27ms + ✓ lib/svg/generator.accessibility.test.ts (5 tests) 36ms + ✓ components/dashboard/heatmapUtils.theme-contrast.test.ts (5 tests) 84ms + ✓ lib/svg/themes/synthwave.test.ts (5 tests) 38ms + ✓ app/generator/components/PreviewPanel.type-compiler.test.tsx (5 tests) 37ms + ✓ services/github/refresh-policy.mouse-interactivity.test.ts (3 tests) 52ms + ✓ services/security/track-user-protection.mouse-interactivity.test.ts (5 tests) 17ms + ✓ app/generator/data/technologies.timezone-boundaries.test.ts (5 tests) 18ms + ✓ app/customize/types.type-compiler.test.ts (5 tests) 18ms + ✓ components/dashboard/GithubWrapped.type-compiler.test.tsx (5 tests) 35ms + ✓ app/components/Footer.type-compiler.test.tsx (5 tests) 9ms + ✓ app/generator/utils/readmeGenerator.error-resilience.test.ts (5 tests) 30ms + ✓ components/dashboard/ActivityLandscape.type-compiler.test.tsx (5 tests) 18ms + ✓ components/TopRivalriesTicker.type-compiler.test.tsx (6 tests) 47ms + ✓ app/customize/components/ControlsPanel.type-compiler.test.tsx (5 tests) 19ms + ✓ lib/validations.wrappedParamsSchema.test.ts (6 tests) 35ms + ✓ lib/svg/layoutConstants.test.ts (5 tests) 15ms + ✓ components/dashboard/tooltipUtils.type-compiler.test.ts (5 tests) 36ms + ✓ types/dashboard.empty-fallback.test.ts (5 tests) 18ms + ✓ components/dashboard/PRInsights/PRInsightsClient.type-compiler.test.tsx (5 tests) 24ms + ✓ components/dashboard/ProfileOptimizerModal.type-compiler.test.tsx (5 tests) 14ms + ✓ lib/validate-env.test.ts (21 tests) 46ms + ✓ components/dashboard/ComparisonStatsCard.type-compiler.test.tsx (5 tests) 35ms + ✓ services/github/refresh-rate-limiter.type-compiler.test.ts (5 tests) 23ms + ✓ components/dashboard/PRInsights/ReviewAnalytics.type-compiler.test.tsx (5 tests) 27ms + ✓ components/dashboard/ActivityLandscape.test.ts (8 tests) 42ms + ✓ components/ShareButtons.type-compiler.test.tsx (5 tests) 30ms + ✓ types/student.theme-contrast.test.ts (5 tests) 49ms + ✓ models/StudentProfile.responsive-breakpoints.test.ts (5 tests) 21ms + ✓ services/security/track-user-protection.type-compiler.test.ts (5 tests) 17ms + ✓ lib/i18n/languages/de.test.ts (5 tests) 34ms + ✓ lib/i18n/badgeLabels.theme-contrast.test.ts (5 tests) 14ms + ✓ lib/svg/themes.solarized_light.test.ts (10 tests) 27ms + ✓ components/dashboard/CommitClock.type-compiler.test.tsx (5 tests) 8ms + ✓ app/components/navbar.type-compiler.test.tsx (5 tests) 17ms + ✓ lib/svg/generator.getUsernameFontSize.test.ts (3 tests) 47ms + ✓ components/dashboard/PRInsights/PRTrendChart.type-compiler.test.tsx (5 tests) 10ms + ✓ types/network.test.ts (5 tests) 18ms + ✓ components/dashboard/PopularPinnedRepos.type-compiler.test.tsx (5 tests) 28ms + ✓ models/User.theme-contrast.test.ts (5 tests) 25ms + ✓ src/utils/svgRenderer.theme-contrast.test.ts (5 tests) 29ms + ✓ app/customize/components/ThemeQuickPresets.type-compiler.test.tsx (5 tests) 8ms + ✓ app/customize/components/AdvancedSettingsPanel.type-compiler.test.tsx (5 tests) 16ms + ✓ app/generator/utils/readmeGenerator.type-compiler.test.ts (5 tests) 28ms + ✓ lib/svg/constants.mock-integrations.test.ts (5 tests) 40ms + ✓ lib/validate-user.error-resilience.test.ts (5 tests) 21ms + ✓ lib/search/domains.test.ts (5 tests) 33ms + ✓ lib/resume-parser.timezone-boundaries.test.ts (5 tests) 28ms + ✓ lib/svg/constants.theme-contrast.test.ts (6 tests) 30ms + ✓ lib/svg/themes/aurora_cyberpunk.test.ts (5 tests) 70ms + ✓ lib/graph/types.empty-fallback.test.ts (5 tests) 50ms + ✓ lib/resume-parser.type-compiler.test.ts (5 tests) 35ms + ✓ app/api/track-user/route.theme-contrast.test.ts (5 tests) 46ms + ✓ lib/svg/themes/forest.test.ts (6 tests) 135ms + ✓ components/dashboard/DashboardSkeleton.type-compiler.test.tsx (5 tests) 48ms + ✓ components/dashboard/heatmapUtils.test.ts (7 tests) 119ms + ✓ services/github/quota-monitor.test.ts (7 tests) 28ms + ✓ services/github/refresh-rate-limiter.error-resilience.test.ts (5 tests) 14ms + ✓ app/components/SuccessGuide.type-compiler.test.tsx (5 tests) 23ms + ✓ lib/snakeWorkflowGenerator.test.ts (12 tests) 22ms + ✓ services/github/validate-user.mock-integrations.test.ts (5 tests) 23ms + ✓ hooks/useLocalStorage.type-compiler.test.ts (5 tests) 13ms + ✓ app/generator/data/technologies.mock-integrations.test.ts (5 tests) 15ms + ✓ lib/svg/animations.empty-fallback.test.ts (5 tests) 23ms + ✓ services/security/track-user-protection.theme-contrast.test.ts (5 tests) 22ms + ✓ utils/getClientIp.empty-fallback.test.ts (6 tests) 29ms + ✓ components/dashboard/heatmapUtils.type-compiler.test.ts (5 tests) 17ms + ✓ lib/svg/no-html-comments.test.ts (1 test) 20ms + ✓ lib/svg/languageColors.theme-contrast.test.ts (5 tests) 16ms + ✓ hooks/useShareActions.theme-contrast.test.ts (5 tests) 22ms + ✓ lib/svg/layoutConstants.theme-contrast.test.ts (5 tests) 16ms + ✓ types/network.theme-contrast.test.ts (5 tests) 14ms + ✓ scripts/benchmark-svg.empty-fallback.test.ts (5 tests) 14ms + ✓ app/components/CustomizeCTA.type-compiler.test.tsx (5 tests) 36ms + ✓ services/github/validate-user.responsive-breakpoints.test.ts (5 tests) 18ms + ✓ lib/svg/themes/gruvbox_light.test.ts (5 tests) 16ms + ✓ lib/git-clone.test.ts (2 tests) 20ms + ✓ locales/de.test.ts (4 tests) 15ms + ✓ app/documentation/code-block.type-compiler.test.tsx (5 tests) 9ms + ✓ lib/svg/staleWatermark.test.ts (5 tests) 28ms + ✓ lib/i18n/languages/ko.test.ts (5 tests) 64ms + ✓ app/api/compare/route.type-compiler.test.ts (5 tests) 13ms + ✓ hooks/useGlowEffect.type-compiler.test.ts (5 tests) 30ms + ✓ components/dashboard/StatsCard.type-compiler.test.tsx (5 tests) 12ms + ✓ services/github/refresh-policy.error-resilience.test.ts (3 tests) 23ms + ✓ components/dashboard/PRInsights/TopMetricsRow.type-compiler.test.tsx (5 tests) 38ms + ✓ services/github/quota-monitor.theme-contrast.test.ts (5 tests) 13ms + ✓ app/not-found.type-compiler.test.tsx (5 tests) 12ms + ✓ components/dashboard/DashboardClient.type-compiler.test.tsx (5 tests) 14ms + ✓ types/index.empty-fallback.test.ts (6 tests) 28ms + ✓ app/compare/CompareClient.type-compiler.test.tsx (5 tests) 10ms + ✓ lib/svg/isLocDay.test.ts (11 tests) 21ms + ✓ app/generator/components/EditorPanel.type-compiler.test.tsx (5 tests) 45ms + ✓ components/dashboard/RepositoryGraph.type-compiler.test.tsx (5 tests) 24ms + ✓ lib/cache.type-compiler.test.ts (5 tests) 31ms + ✓ app/api/pr-insights/route.type-compiler.test.ts (5 tests) 20ms + ✓ lib/i18n/languages/ja.test.ts (5 tests) 22ms + ✓ lib/svg/layout.theme-contrast.test.ts (5 tests) 20ms + ✓ models/StudentProfile.empty-fallback.test.ts (5 tests) 15ms + ✓ components/dashboard/ActivityLandscape.timezone-boundaries.test.tsx (5 tests) 17ms + ✓ app/generator/GeneratorClient.type-compiler.test.tsx (5 tests) 10ms + ✓ app/generator/data/socials.mouse-interactivity.test.ts (5 tests) 38ms + ✓ types/student.test.ts (5 tests) 13ms + ✓ app/components/Icons.type-compiler.test.tsx (5 tests) 21ms + ✓ utils/urls.accessibility.test.ts (5 tests) 23ms + ✓ components/dashboard/tooltipUtils.test.ts (7 tests) 19ms + ✓ components/dashboard/StatsCardSkeleton.type-compiler.test.tsx (5 tests) 56ms + ✓ lib/svg/generator.themeLookup.test.ts (5 tests) 17ms + ✓ components/dashboard/PRInsights/RepoPerformanceTable.type-compiler.test.tsx (5 tests) 32ms + ✓ components/AnimatedCursor.type-compiler.test.tsx (5 tests) 10ms + ✓ lib/resume-parser.responsive-breakpoints.test.ts (5 tests) 39ms + ✓ lib/svg/fonts.test.ts (6 tests) 21ms + ✓ src/utils/__tests__/svgRenderer.test.ts (4 tests) 35ms + ✓ lib/svg/constants.error-resilience.test.ts (5 tests) 12ms + ✓ app/components/CopyRepoButton.type-compiler.test.tsx (5 tests) 18ms + ✓ components/dashboard/ProfileCard.empty-fallback.test.tsx (5 tests) 30ms + ✓ components/dashboard/tooltipUtils.error-resilience.test.ts (5 tests) 51ms + ✓ lib/svg/generator.escapeXML.test.ts (6 tests) 12ms + ✓ lib/svg/themes/dark.test.ts (5 tests) 18ms + ✓ lib/svg/themes/gruvbox.test.ts (5 tests) 12ms + ✓ lib/svg/constants.test.ts (3 tests) 25ms + ✓ lib/i18n/languages/fr.test.ts (5 tests) 28ms + ✓ components/dashboard/tooltipUtils.empty-fallback.test.ts (5 tests) 23ms + ✓ lib/graph/dependencyGraph.empty-fallback.test.ts (5 tests) 31ms + ✓ components/dashboard/PRInsights/PRStatusDistribution.type-compiler.test.tsx (5 tests) 24ms + ✓ utils/cacheControl.test.ts (4 tests) 22ms + ✓ components/dashboard/tooltipUtils.timezone-boundaries.test.ts (5 tests) 20ms + ✓ lib/resume-parser.signature.test.ts (7 tests) 29ms + ✓ app/customize/utils.type-compiler.test.ts (5 tests) 11ms + ✓ components/commitpulse-logo.type-compiler.test.tsx (5 tests) 16ms + ✓ app/generator/components/sections/TechnologyGraph.type-compiler.test.tsx (5 tests) 11ms + ✓ components/dashboard/ResumeProfileSection.type-compiler.test.tsx (6 tests) 14ms + ✓ types/index.theme-contrast.test.ts (5 tests) 14ms + ✓ components/dashboard/VisualizationTooltip.type-compiler.test.tsx (5 tests) 46ms + ✓ services/github/quota-monitor.type-compiler.test.ts (5 tests) 6ms + ✓ lib/svg/generator.truncateUsername.test.ts (5 tests) 13ms + ✓ services/github/validate-user.type-compiler.test.ts (5 tests) 10ms + ✓ components/dashboard/heatmapUtils.empty-fallback.test.ts (5 tests) 7ms + ✓ lib/svg/constants.type-compiler.test.ts (4 tests) 11ms + ✓ components/dashboard/ResumeUpload.type-compiler.test.tsx (5 tests) 7ms + ✓ components/dashboard/ShareSheet.type-compiler.test.tsx (5 tests) 4ms + ↓ components/BrandParticles.test.tsx (6 tests | 6 skipped) + ✓ components/WallOfLove.type-compiler.test.tsx (5 tests) 10ms + ✓ components/dashboard/Heatmap.type-compiler.test.tsx (5 tests) 4ms + ↓ components/dashboard/DashboardClient.timezone-boundaries.test.tsx (5 tests | 5 skipped) + +⎯⎯⎯⎯⎯⎯⎯ Failed Tests 2 ⎯⎯⎯⎯⎯⎯⎯ + + FAIL lib/security/csrf.test.ts > validateCSRF > rejects requests with no origin and no referer +AssertionError: expected null not to be null + ❯ lib/security/csrf.test.ts:29:21 + 27| const req = new Request('https://commitpulse.vercel.app/api/test',… + 28| req.headers.delete('origin'); + 29| req.headers.delete('referer'); + | ^ + 30| const res = validateCSRF(req); + 31| expect(res).not.toBeNull(); + +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[1/2]⎯ + + FAIL components/dashboard/PRInsights/ReviewAnalytics.mock-integrations.test.tsx > ReviewAnalytics - Asynchronous Service Layer Mocking & Local Cache Stubs > 2. tests service loading paths to ensure pending state overlays render +TestingLibraryElementError: Unable to find an element with the text: Reviews Given. This could be because the text is broken up by multiple elements. In this case, you can provide a function for your text matcher to make your matcher more flexible. + +Ignored nodes: comments, script, style +<body> + <div> + <div + data-testid="loading-overlay" + > + Loading analytics… + </div> + </div> +</body> + +Ignored nodes: comments, script, style +<html> + <head /> + <body> + <div> + <div + data-testid="loading-overlay" + > + Loading analytics… + </div> + </div> + </body> +</html> + ❯ Proxy.waitForWrapper node_modules/@testing-library/dom/dist/wait-for.js:163:27 + ❯ components/dashboard/PRInsights/ReviewAnalytics.mock-integrations.test.tsx:123:11 + 121| + 122| // After resolution the real content appears and the overlay is re… + 123| await waitFor(() => { + | ^ + 124| expect(screen.getByText('Reviews Given')).toBeInTheDocument(); + 125| }); + +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[2/2]⎯ + + + Test Files 2 failed | 1509 passed | 2 skipped (1513) + Tests 2 failed | 10250 passed | 1 expected fail | 14 skipped (10267) + Start at 08:54:15 + Duration 945.28s (transform 74.81s, setup 394.15s, import 710.24s, tests 1172.36s, environment 3957.92s) + diff --git a/test_request.ts b/test_request.ts new file mode 100644 index 000000000..a97bd60a8 --- /dev/null +++ b/test_request.ts @@ -0,0 +1,11 @@ +const OriginalRequest = globalThis.Request; +globalThis.Request = class extends OriginalRequest { + constructor(input: RequestInfo | URL, init?: RequestInit) { + super(input, init); + if (!this.headers.has('origin') && !this.headers.has('referer')) { + this.headers.set('origin', 'https://commitpulse.vercel.app'); + } + } +}; +const req = new Request('http://localhost', { method: 'POST' }); +console.log(req.headers.get('origin'));