-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathtestrun.json
More file actions
1 lines (1 loc) · 52.3 KB
/
testrun.json
File metadata and controls
1 lines (1 loc) · 52.3 KB
1
{"numFailedTestSuites":1,"numFailedTests":2,"numPassedTestSuites":7,"numPassedTests":133,"numPendingTestSuites":0,"numPendingTests":0,"numRuntimeErrorTestSuites":0,"numTodoTests":0,"numTotalTestSuites":8,"numTotalTests":135,"openHandles":[],"snapshot":{"added":0,"didUpdate":false,"failure":false,"filesAdded":0,"filesRemoved":0,"filesRemovedList":[],"filesUnmatched":0,"filesUpdated":0,"matched":0,"total":0,"unchecked":0,"uncheckedKeysByFile":[],"unmatched":0,"updated":0},"startTime":1769360542017,"success":false,"testResults":[{"assertionResults":[{"ancestorTitles":["storage.js","getState"],"duration":7,"failureDetails":[],"failureMessages":[],"fullName":"storage.js getState should return default state when storage is empty","invocations":1,"location":null,"numPassingAsserts":4,"retryReasons":[],"status":"passed","title":"should return default state when storage is empty"},{"ancestorTitles":["storage.js","getState"],"duration":1,"failureDetails":[],"failureMessages":[],"fullName":"storage.js getState should return state from storage","invocations":1,"location":null,"numPassingAsserts":5,"retryReasons":[],"status":"passed","title":"should return state from storage"},{"ancestorTitles":["storage.js","getState"],"duration":1,"failureDetails":[],"failureMessages":[],"fullName":"storage.js getState should convert solvedProblems array to Set","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"status":"passed","title":"should convert solvedProblems array to Set"},{"ancestorTitles":["storage.js","saveState"],"duration":1,"failureDetails":[],"failureMessages":[],"fullName":"storage.js saveState should save state to chrome.storage.sync","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should save state to chrome.storage.sync"},{"ancestorTitles":["storage.js","saveState"],"duration":1,"failureDetails":[],"failureMessages":[],"fullName":"storage.js saveState should convert Set to array for storage","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"status":"passed","title":"should convert Set to array for storage"},{"ancestorTitles":["storage.js","getDailySolveState"],"duration":1,"failureDetails":[],"failureMessages":[],"fullName":"storage.js getDailySolveState should return solvedToday as false when no date stored","invocations":1,"location":null,"numPassingAsserts":3,"retryReasons":[],"status":"passed","title":"should return solvedToday as false when no date stored"},{"ancestorTitles":["storage.js","getDailySolveState"],"duration":0,"failureDetails":[],"failureMessages":[],"fullName":"storage.js getDailySolveState should return solvedToday as true when date matches today","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"status":"passed","title":"should return solvedToday as true when date matches today"},{"ancestorTitles":["storage.js","getDailySolveState"],"duration":0,"failureDetails":[],"failureMessages":[],"fullName":"storage.js getDailySolveState should return solvedToday as false when date is from yesterday","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"status":"passed","title":"should return solvedToday as false when date is from yesterday"},{"ancestorTitles":["storage.js","markDailySolve"],"duration":3,"failureDetails":[],"failureMessages":[],"fullName":"storage.js markDailySolve should save daily solve with correct date and slug","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should save daily solve with correct date and slug"},{"ancestorTitles":["storage.js","markDailySolve"],"duration":1,"failureDetails":[],"failureMessages":[],"fullName":"storage.js markDailySolve should save today's date in YYYY-MM-DD format","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should save today's date in YYYY-MM-DD format"},{"ancestorTitles":["storage.js","clearDailySolve"],"duration":0,"failureDetails":[],"failureMessages":[],"fullName":"storage.js clearDailySolve should remove daily solve keys from local storage","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should remove daily solve keys from local storage"},{"ancestorTitles":["storage.js","getBypassState"],"duration":1,"failureDetails":[],"failureMessages":[],"fullName":"storage.js getBypassState should return inactive bypass when no data stored","invocations":1,"location":null,"numPassingAsserts":4,"retryReasons":[],"status":"passed","title":"should return inactive bypass when no data stored"},{"ancestorTitles":["storage.js","getBypassState"],"duration":0,"failureDetails":[],"failureMessages":[],"fullName":"storage.js getBypassState should return active bypass when current time < bypassUntil","invocations":1,"location":null,"numPassingAsserts":3,"retryReasons":[],"status":"passed","title":"should return active bypass when current time < bypassUntil"},{"ancestorTitles":["storage.js","getBypassState"],"duration":0,"failureDetails":[],"failureMessages":[],"fullName":"storage.js getBypassState should return inactive bypass when current time >= bypassUntil","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"status":"passed","title":"should return inactive bypass when current time >= bypassUntil"},{"ancestorTitles":["storage.js","getBypassState"],"duration":0,"failureDetails":[],"failureMessages":[],"fullName":"storage.js getBypassState should calculate canBypass correctly during cooldown","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"status":"passed","title":"should calculate canBypass correctly during cooldown"},{"ancestorTitles":["storage.js","getBypassState"],"duration":0,"failureDetails":[],"failureMessages":[],"fullName":"storage.js getBypassState should allow bypass after cooldown expires","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"status":"passed","title":"should allow bypass after cooldown expires"},{"ancestorTitles":["storage.js","setBypassState"],"duration":0,"failureDetails":[],"failureMessages":[],"fullName":"storage.js setBypassState should save bypass timestamps to local storage","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should save bypass timestamps to local storage"},{"ancestorTitles":["storage.js","clearBypass"],"duration":0,"failureDetails":[],"failureMessages":[],"fullName":"storage.js clearBypass should remove bypass keys from local storage","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should remove bypass keys from local storage"}],"endTime":1769360543032,"message":"","name":"/Users/adamschmidt/Desktop/personalProjects/leetcodeForcer/tests/background/storage.test.js","startTime":1769360542520,"status":"passed","summary":""},{"assertionResults":[{"ancestorTitles":["redirects.js","installRedirectRule"],"duration":16,"failureDetails":[],"failureMessages":[],"fullName":"redirects.js installRedirectRule should install redirect rule with correct configuration","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should install redirect rule with correct configuration"},{"ancestorTitles":["redirects.js","installRedirectRule"],"duration":1,"failureDetails":[],"failureMessages":[],"fullName":"redirects.js installRedirectRule should exclude whitelisted domains from redirect","invocations":1,"location":null,"numPassingAsserts":3,"retryReasons":[],"status":"passed","title":"should exclude whitelisted domains from redirect"},{"ancestorTitles":["redirects.js","installRedirectRule"],"duration":1,"failureDetails":[],"failureMessages":[],"fullName":"redirects.js installRedirectRule should redirect to current problem URL","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"status":"passed","title":"should redirect to current problem URL"},{"ancestorTitles":["redirects.js","installRedirectRule"],"duration":18,"failureDetails":[],"failureMessages":[],"fullName":"redirects.js installRedirectRule should handle errors gracefully","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should handle errors gracefully"},{"ancestorTitles":["redirects.js","removeRedirectRule"],"duration":1,"failureDetails":[],"failureMessages":[],"fullName":"redirects.js removeRedirectRule should remove redirect rule by ID","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should remove redirect rule by ID"},{"ancestorTitles":["redirects.js","removeRedirectRule"],"duration":1,"failureDetails":[],"failureMessages":[],"fullName":"redirects.js removeRedirectRule should handle errors gracefully","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should handle errors gracefully"},{"ancestorTitles":["redirects.js","checkAndRestoreRedirect"],"duration":0,"failureDetails":[],"failureMessages":[],"fullName":"redirects.js checkAndRestoreRedirect should not restore redirect if bypass is active","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should not restore redirect if bypass is active"},{"ancestorTitles":["redirects.js","checkAndRestoreRedirect"],"duration":0,"failureDetails":[],"failureMessages":[],"fullName":"redirects.js checkAndRestoreRedirect should not restore redirect if daily solve is active","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should not restore redirect if daily solve is active"},{"ancestorTitles":["redirects.js","checkAndRestoreRedirect"],"duration":3,"failureDetails":[],"failureMessages":[],"fullName":"redirects.js checkAndRestoreRedirect should restore redirect if bypass expired","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should restore redirect if bypass expired"},{"ancestorTitles":["redirects.js","checkAndRestoreRedirect"],"duration":0,"failureDetails":[],"failureMessages":[],"fullName":"redirects.js checkAndRestoreRedirect should restore redirect if daily solve expired","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should restore redirect if daily solve expired"},{"ancestorTitles":["redirects.js","activateBypass"],"duration":2,"failureDetails":[],"failureMessages":[],"fullName":"redirects.js activateBypass should activate bypass when allowed","invocations":1,"location":null,"numPassingAsserts":5,"retryReasons":[],"status":"passed","title":"should activate bypass when allowed"},{"ancestorTitles":["redirects.js","activateBypass"],"duration":0,"failureDetails":[],"failureMessages":[],"fullName":"redirects.js activateBypass should reject bypass during cooldown","invocations":1,"location":null,"numPassingAsserts":4,"retryReasons":[],"status":"passed","title":"should reject bypass during cooldown"},{"ancestorTitles":["redirects.js","activateBypass"],"duration":1,"failureDetails":[],"failureMessages":[],"fullName":"redirects.js activateBypass should set correct bypass duration and cooldown","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"status":"passed","title":"should set correct bypass duration and cooldown"},{"ancestorTitles":["redirects.js","activateBypass"],"duration":1,"failureDetails":[],"failureMessages":[],"fullName":"redirects.js activateBypass should return bypass info on success","invocations":1,"location":null,"numPassingAsserts":3,"retryReasons":[],"status":"passed","title":"should return bypass info on success"},{"ancestorTitles":["redirects.js","checkDailyReset"],"duration":1,"failureDetails":[],"failureMessages":[],"fullName":"redirects.js checkDailyReset should reset daily solve when day changes","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"status":"passed","title":"should reset daily solve when day changes"},{"ancestorTitles":["redirects.js","checkDailyReset"],"duration":0,"failureDetails":[],"failureMessages":[],"fullName":"redirects.js checkDailyReset should not reset when still same day","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should not reset when still same day"},{"ancestorTitles":["redirects.js","checkDailyReset"],"duration":1,"failureDetails":[],"failureMessages":[],"fullName":"redirects.js checkDailyReset should handle no previous daily solve data","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"status":"passed","title":"should handle no previous daily solve data"},{"ancestorTitles":["redirects.js","checkDailyReset"],"duration":1,"failureDetails":[],"failureMessages":[],"fullName":"redirects.js checkDailyReset should reset at midnight boundary","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"status":"passed","title":"should reset at midnight boundary"}],"endTime":1769360543070,"message":"","name":"/Users/adamschmidt/Desktop/personalProjects/leetcodeForcer/tests/background/redirects.test.js","startTime":1769360542521,"status":"passed","summary":""},{"assertionResults":[{"ancestorTitles":["problemLogic.js","loadProblemSet"],"duration":11,"failureDetails":[],"failureMessages":[],"fullName":"problemLogic.js loadProblemSet should fetch and cache problem set","invocations":1,"location":null,"numPassingAsserts":3,"retryReasons":[],"status":"passed","title":"should fetch and cache problem set"},{"ancestorTitles":["problemLogic.js","loadProblemSet"],"duration":1,"failureDetails":[],"failureMessages":[],"fullName":"problemLogic.js loadProblemSet should return cached problem set on subsequent calls","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"status":"passed","title":"should return cached problem set on subsequent calls"},{"ancestorTitles":["problemLogic.js","loadProblemSet"],"duration":21,"failureDetails":[],"failureMessages":[],"fullName":"problemLogic.js loadProblemSet should return null on fetch error when no cache exists","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"status":"passed","title":"should return null on fetch error when no cache exists"},{"ancestorTitles":["problemLogic.js","loadAliases"],"duration":2,"failureDetails":[],"failureMessages":[],"fullName":"problemLogic.js loadAliases should fetch and cache aliases","invocations":1,"location":null,"numPassingAsserts":3,"retryReasons":[],"status":"passed","title":"should fetch and cache aliases"},{"ancestorTitles":["problemLogic.js","loadAliases"],"duration":2,"failureDetails":[],"failureMessages":[],"fullName":"problemLogic.js loadAliases should return empty object on fetch error","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should return empty object on fetch error"},{"ancestorTitles":["problemLogic.js","resolveProblemAlias"],"duration":1,"failureDetails":[],"failureMessages":[],"fullName":"problemLogic.js resolveProblemAlias should resolve alias to canonical slug","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should resolve alias to canonical slug"},{"ancestorTitles":["problemLogic.js","resolveProblemAlias"],"duration":1,"failureDetails":[],"failureMessages":[],"fullName":"problemLogic.js resolveProblemAlias should return original slug if no alias exists","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should return original slug if no alias exists"},{"ancestorTitles":["problemLogic.js","fetchAllProblemStatuses"],"duration":2,"failureDetails":[],"failureMessages":[],"fullName":"problemLogic.js fetchAllProblemStatuses should fetch and parse LeetCode problem statuses","invocations":1,"location":null,"numPassingAsserts":4,"retryReasons":[],"status":"passed","title":"should fetch and parse LeetCode problem statuses"},{"ancestorTitles":["problemLogic.js","fetchAllProblemStatuses"],"duration":1,"failureDetails":[],"failureMessages":[],"fullName":"problemLogic.js fetchAllProblemStatuses should return empty map on fetch error","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"status":"passed","title":"should return empty map on fetch error"},{"ancestorTitles":["problemLogic.js","computeNextProblem"],"duration":2,"failureDetails":[],"failureMessages":[],"fullName":"problemLogic.js computeNextProblem should return first problem when nothing solved","invocations":1,"location":null,"numPassingAsserts":4,"retryReasons":[],"status":"passed","title":"should return first problem when nothing solved"},{"ancestorTitles":["problemLogic.js","computeNextProblem"],"duration":2,"failureDetails":[],"failureMessages":[],"fullName":"problemLogic.js computeNextProblem should skip solved problems and return next unsolved","invocations":1,"location":null,"numPassingAsserts":4,"retryReasons":[],"status":"passed","title":"should skip solved problems and return next unsolved"},{"ancestorTitles":["problemLogic.js","computeNextProblem"],"duration":7,"failureDetails":[],"failureMessages":[],"fullName":"problemLogic.js computeNextProblem should move to next category when current category complete","invocations":1,"location":null,"numPassingAsserts":5,"retryReasons":[],"status":"passed","title":"should move to next category when current category complete"},{"ancestorTitles":["problemLogic.js","computeNextProblem"],"duration":2,"failureDetails":[],"failureMessages":[],"fullName":"problemLogic.js computeNextProblem should return last problem info when all problems solved","invocations":1,"location":null,"numPassingAsserts":5,"retryReasons":[],"status":"passed","title":"should return last problem info when all problems solved"},{"ancestorTitles":["problemLogic.js","computeCategoryProgress"],"duration":1,"failureDetails":[],"failureMessages":[],"fullName":"problemLogic.js computeCategoryProgress should calculate correct progress for category","invocations":1,"location":null,"numPassingAsserts":3,"retryReasons":[],"status":"passed","title":"should calculate correct progress for category"},{"ancestorTitles":["problemLogic.js","computeCategoryProgress"],"duration":0,"failureDetails":[],"failureMessages":[],"fullName":"problemLogic.js computeCategoryProgress should return 0% for category with no solved problems","invocations":1,"location":null,"numPassingAsserts":3,"retryReasons":[],"status":"passed","title":"should return 0% for category with no solved problems"},{"ancestorTitles":["problemLogic.js","computeCategoryProgress"],"duration":1,"failureDetails":[],"failureMessages":[],"fullName":"problemLogic.js computeCategoryProgress should return 100% for fully solved category","invocations":1,"location":null,"numPassingAsserts":3,"retryReasons":[],"status":"passed","title":"should return 100% for fully solved category"},{"ancestorTitles":["problemLogic.js","getAllCategoryProgress"],"duration":1,"failureDetails":[],"failureMessages":[],"fullName":"problemLogic.js getAllCategoryProgress should calculate progress for all categories","invocations":1,"location":null,"numPassingAsserts":7,"retryReasons":[],"status":"passed","title":"should calculate progress for all categories"},{"ancestorTitles":["problemLogic.js","getAllCategoryProgress"],"duration":1,"failureDetails":[],"failureMessages":[],"fullName":"problemLogic.js getAllCategoryProgress should include overall progress","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"status":"passed","title":"should include overall progress"}],"endTime":1769360543092,"message":"","name":"/Users/adamschmidt/Desktop/personalProjects/leetcodeForcer/tests/background/problemLogic.test.js","startTime":1769360542524,"status":"passed","summary":""},{"assertionResults":[{"ancestorTitles":["Problem Solving Integration","User solves current problem"],"duration":90,"failureDetails":[],"failureMessages":[],"fullName":"Problem Solving Integration User solves current problem should mark daily solve and unblock websites","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"status":"passed","title":"should mark daily solve and unblock websites"},{"ancestorTitles":["Problem Solving Integration","User solves current problem"],"duration":2,"failureDetails":[],"failureMessages":[],"fullName":"Problem Solving Integration User solves current problem should update progress and advance to next problem","invocations":1,"location":null,"numPassingAsserts":3,"retryReasons":[],"status":"passed","title":"should update progress and advance to next problem"},{"ancestorTitles":["Problem Solving Integration","User solves wrong problem"],"duration":1,"failureDetails":[],"failureMessages":[],"fullName":"Problem Solving Integration User solves wrong problem should not mark daily solve and keep redirect active","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should not mark daily solve and keep redirect active"},{"ancestorTitles":["Problem Solving Integration","User takes bypass"],"duration":1,"failureDetails":[],"failureMessages":[],"fullName":"Problem Solving Integration User takes bypass should temporarily remove redirect and restore after timeout","invocations":1,"location":null,"numPassingAsserts":3,"retryReasons":[],"status":"passed","title":"should temporarily remove redirect and restore after timeout"},{"ancestorTitles":["Problem Solving Integration","User takes bypass"],"duration":1,"failureDetails":[],"failureMessages":[],"fullName":"Problem Solving Integration User takes bypass should restore redirect when bypass expires","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should restore redirect when bypass expires"},{"ancestorTitles":["Problem Solving Integration","Daily reset at midnight"],"duration":0,"failureDetails":[],"failureMessages":[],"fullName":"Problem Solving Integration Daily reset at midnight should clear daily solve and restore redirect","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"status":"passed","title":"should clear daily solve and restore redirect"},{"ancestorTitles":["Problem Solving Integration","Progress reset"],"duration":1,"failureDetails":[],"failureMessages":[],"fullName":"Problem Solving Integration Progress reset should clear all progress and restart from first problem","invocations":1,"location":null,"numPassingAsserts":3,"retryReasons":[],"status":"passed","title":"should clear all progress and restart from first problem"},{"ancestorTitles":["Problem Solving Integration","Category progress tracking"],"duration":1,"failureDetails":[],"failureMessages":[],"fullName":"Problem Solving Integration Category progress tracking should correctly calculate progress across categories","invocations":1,"location":null,"numPassingAsserts":5,"retryReasons":[],"status":"passed","title":"should correctly calculate progress across categories"}],"endTime":1769360543126,"message":"","name":"/Users/adamschmidt/Desktop/personalProjects/leetcodeForcer/tests/integration/problemSolve.test.js","startTime":1769360542519,"status":"passed","summary":""},{"assertionResults":[{"ancestorTitles":["messageHandler.js","setupMessageListener"],"duration":11,"failureDetails":[],"failureMessages":[],"fullName":"messageHandler.js setupMessageListener should register message listener","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should register message listener"},{"ancestorTitles":["messageHandler.js","handleMessage - PROBLEM_SOLVED"],"duration":74,"failureDetails":[],"failureMessages":[],"fullName":"messageHandler.js handleMessage - PROBLEM_SOLVED should mark problem as solved and update state","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should mark problem as solved and update state"},{"ancestorTitles":["messageHandler.js","handleMessage - PROBLEM_SOLVED"],"duration":4,"failureDetails":[],"failureMessages":[],"fullName":"messageHandler.js handleMessage - PROBLEM_SOLVED should mark daily solve when problem is verified today","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should mark daily solve when problem is verified today"},{"ancestorTitles":["messageHandler.js","handleMessage - PROBLEM_SOLVED"],"duration":1,"failureDetails":[],"failureMessages":[],"fullName":"messageHandler.js handleMessage - PROBLEM_SOLVED should not mark daily solve for old submissions","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should not mark daily solve for old submissions"},{"ancestorTitles":["messageHandler.js","handleMessage - GET_STATUS"],"duration":0,"failureDetails":[],"failureMessages":[],"fullName":"messageHandler.js handleMessage - GET_STATUS should return current status with problem info","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should return current status with problem info"},{"ancestorTitles":["messageHandler.js","handleMessage - GET_STATUS"],"duration":1,"failureDetails":[],"failureMessages":[],"fullName":"messageHandler.js handleMessage - GET_STATUS should include daily solve status","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should include daily solve status"},{"ancestorTitles":["messageHandler.js","handleMessage - GET_DETAILED_PROGRESS"],"duration":1,"failureDetails":[],"failureMessages":[],"fullName":"messageHandler.js handleMessage - GET_DETAILED_PROGRESS should return progress for all categories","invocations":1,"location":null,"numPassingAsserts":5,"retryReasons":[],"status":"passed","title":"should return progress for all categories"},{"ancestorTitles":["messageHandler.js","handleMessage - ACTIVATE_BYPASS"],"duration":2,"failureDetails":[],"failureMessages":[],"fullName":"messageHandler.js handleMessage - ACTIVATE_BYPASS should activate bypass when allowed","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should activate bypass when allowed"},{"ancestorTitles":["messageHandler.js","handleMessage - ACTIVATE_BYPASS"],"duration":1,"failureDetails":[],"failureMessages":[],"fullName":"messageHandler.js handleMessage - ACTIVATE_BYPASS should reject bypass during cooldown","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should reject bypass during cooldown"},{"ancestorTitles":["messageHandler.js","handleMessage - REFRESH_STATUS"],"duration":1,"failureDetails":[],"failureMessages":[],"fullName":"messageHandler.js handleMessage - REFRESH_STATUS should fetch and update solved problems from LeetCode","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"status":"passed","title":"should fetch and update solved problems from LeetCode"},{"ancestorTitles":["messageHandler.js","handleMessage - RESET_PROGRESS"],"duration":1,"failureDetails":[],"failureMessages":[],"fullName":"messageHandler.js handleMessage - RESET_PROGRESS should clear all progress and reset to first problem","invocations":1,"location":null,"numPassingAsserts":3,"retryReasons":[],"status":"passed","title":"should clear all progress and reset to first problem"},{"ancestorTitles":["messageHandler.js","handleMessage - Unknown Type"],"duration":1,"failureDetails":[],"failureMessages":[],"fullName":"messageHandler.js handleMessage - Unknown Type should handle unknown message type gracefully","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should handle unknown message type gracefully"},{"ancestorTitles":["messageHandler.js","Error Handling"],"duration":2,"failureDetails":[],"failureMessages":[],"fullName":"messageHandler.js Error Handling should catch and report errors in message handling","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should catch and report errors in message handling"}],"endTime":1769360543132,"message":"","name":"/Users/adamschmidt/Desktop/personalProjects/leetcodeForcer/tests/background/messageHandler.test.js","startTime":1769360542519,"status":"passed","summary":""},{"assertionResults":[{"ancestorTitles":["detector.js","sendMessageSafely"],"duration":7,"failureDetails":[],"failureMessages":[],"fullName":"detector.js sendMessageSafely should send message successfully","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"status":"passed","title":"should send message successfully"},{"ancestorTitles":["detector.js","sendMessageSafely"],"duration":7,"failureDetails":[],"failureMessages":[],"fullName":"detector.js sendMessageSafely should handle context invalidation error","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"status":"passed","title":"should handle context invalidation error"},{"ancestorTitles":["detector.js","sendMessageSafely"],"duration":1,"failureDetails":[],"failureMessages":[],"fullName":"detector.js sendMessageSafely should handle message port closed error","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"status":"passed","title":"should handle message port closed error"},{"ancestorTitles":["detector.js","sendMessageSafely"],"duration":19,"failureDetails":[],"failureMessages":[],"fullName":"detector.js sendMessageSafely should re-throw other errors","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should re-throw other errors"},{"ancestorTitles":["detector.js","checkAndNotify"],"duration":2,"failureDetails":[],"failureMessages":[],"fullName":"detector.js checkAndNotify should not notify if no slug found in URL","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should not notify if no slug found in URL"},{"ancestorTitles":["detector.js","checkAndNotify"],"duration":47,"failureDetails":[],"failureMessages":[],"fullName":"detector.js checkAndNotify should query problem status","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should query problem status"},{"ancestorTitles":["detector.js","checkAndNotify"],"duration":2,"failureDetails":[],"failureMessages":[],"fullName":"detector.js checkAndNotify should not notify if problem not solved","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should not notify if problem not solved"},{"ancestorTitles":["detector.js","checkAndNotify"],"duration":35,"failureDetails":[],"failureMessages":[],"fullName":"detector.js checkAndNotify should verify problem was solved today","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should verify problem was solved today"},{"ancestorTitles":["detector.js","checkAndNotify"],"duration":1,"failureDetails":[],"failureMessages":[],"fullName":"detector.js checkAndNotify should not count old solutions as solved today","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should not count old solutions as solved today"},{"ancestorTitles":["detector.js","checkAndNotify"],"duration":2,"failureDetails":[{"matcherResult":{"message":"\u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBeFalsy\u001b[2m()\u001b[22m\n\nReceived: \u001b[31m[{\"slug\": \"two-sum\", \"timestamp\": \"1769360543\", \"type\": \"PROBLEM_SOLVED\", \"verifiedToday\": true}]\u001b[39m","pass":false}}],"failureMessages":["Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBeFalsy\u001b[2m()\u001b[22m\n\nReceived: \u001b[31m[{\"slug\": \"two-sum\", \"timestamp\": \"1769360543\", \"type\": \"PROBLEM_SOLVED\", \"verifiedToday\": true}]\u001b[39m\n at Object.toBeFalsy (/Users/adamschmidt/Desktop/personalProjects/leetcodeForcer/tests/content/detector.test.js:478:33)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)"],"fullName":"detector.js checkAndNotify should not notify if solving wrong problem","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"status":"failed","title":"should not notify if solving wrong problem"},{"ancestorTitles":["detector.js","checkAndNotify"],"duration":1014,"failureDetails":[],"failureMessages":[],"fullName":"detector.js checkAndNotify should handle username fetch failure gracefully","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should handle username fetch failure gracefully"},{"ancestorTitles":["detector.js","checkAndNotify"],"duration":2,"failureDetails":[{"matcherResult":{"message":"\u001b[2mexpect(\u001b[22m\u001b[31mjest.fn()\u001b[39m\u001b[2m).\u001b[22mtoHaveBeenCalledWith\u001b[2m(\u001b[22m\u001b[32m...expected\u001b[39m\u001b[2m)\u001b[22m\n\nExpected: \u001b[32mObjectContaining {\"slug\": \"best-time-to-buy-and-sell-stock\", \"type\": \"PROBLEM_SOLVED\"}\u001b[39m\nReceived: \u001b[31m{\"type\": \"GET_STATUS\"}\u001b[39m\n\nNumber of calls: \u001b[31m1\u001b[39m","pass":false}}],"failureMessages":["Error: \u001b[2mexpect(\u001b[22m\u001b[31mjest.fn()\u001b[39m\u001b[2m).\u001b[22mtoHaveBeenCalledWith\u001b[2m(\u001b[22m\u001b[32m...expected\u001b[39m\u001b[2m)\u001b[22m\n\nExpected: \u001b[32mObjectContaining {\"slug\": \"best-time-to-buy-and-sell-stock\", \"type\": \"PROBLEM_SOLVED\"}\u001b[39m\nReceived: \u001b[31m{\"type\": \"GET_STATUS\"}\u001b[39m\n\nNumber of calls: \u001b[31m1\u001b[39m\n at Object.toHaveBeenCalledWith (/Users/adamschmidt/Desktop/personalProjects/leetcodeForcer/tests/content/detector.test.js:696:42)"],"fullName":"detector.js checkAndNotify should resolve problem aliases","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"status":"failed","title":"should resolve problem aliases"}],"endTime":1769360544187,"message":"\u001b[1m\u001b[31m \u001b[1m● \u001b[22m\u001b[1mdetector.js › checkAndNotify › should not notify if solving wrong problem\u001b[39m\u001b[22m\n\n \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBeFalsy\u001b[2m()\u001b[22m\n\n Received: \u001b[31m[{\"slug\": \"two-sum\", \"timestamp\": \"1769360543\", \"type\": \"PROBLEM_SOLVED\", \"verifiedToday\": true}]\u001b[39m\n\u001b[2m\u001b[22m\n\u001b[2m \u001b[0m \u001b[90m 476 |\u001b[39m )\u001b[33m;\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 477 |\u001b[39m \u001b[22m\n\u001b[2m \u001b[31m\u001b[1m>\u001b[22m\u001b[2m\u001b[39m\u001b[90m 478 |\u001b[39m expect(problemSolvedCall)\u001b[33m.\u001b[39mtoBeFalsy()\u001b[33m;\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m |\u001b[39m \u001b[31m\u001b[1m^\u001b[22m\u001b[2m\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 479 |\u001b[39m })\u001b[33m;\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 480 |\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 481 |\u001b[39m it(\u001b[32m'should handle username fetch failure gracefully'\u001b[39m\u001b[33m,\u001b[39m \u001b[36masync\u001b[39m () \u001b[33m=>\u001b[39m {\u001b[0m\u001b[22m\n\u001b[2m\u001b[22m\n\u001b[2m \u001b[2mat Object.toBeFalsy (\u001b[22m\u001b[2m\u001b[0m\u001b[36mtests/content/detector.test.js\u001b[39m\u001b[0m\u001b[2m:478:33)\u001b[22m\u001b[2m\u001b[22m\n\n\u001b[1m\u001b[31m \u001b[1m● \u001b[22m\u001b[1mdetector.js › checkAndNotify › should resolve problem aliases\u001b[39m\u001b[22m\n\n \u001b[2mexpect(\u001b[22m\u001b[31mjest.fn()\u001b[39m\u001b[2m).\u001b[22mtoHaveBeenCalledWith\u001b[2m(\u001b[22m\u001b[32m...expected\u001b[39m\u001b[2m)\u001b[22m\n\n Expected: \u001b[32mObjectContaining {\"slug\": \"best-time-to-buy-and-sell-stock\", \"type\": \"PROBLEM_SOLVED\"}\u001b[39m\n Received: \u001b[31m{\"type\": \"GET_STATUS\"}\u001b[39m\n\n Number of calls: \u001b[31m1\u001b[39m\n\u001b[2m\u001b[22m\n\u001b[2m \u001b[0m \u001b[90m 694 |\u001b[39m \u001b[22m\n\u001b[2m \u001b[90m 695 |\u001b[39m \u001b[90m// Should use canonical slug in notification\u001b[39m\u001b[22m\n\u001b[2m \u001b[31m\u001b[1m>\u001b[22m\u001b[2m\u001b[39m\u001b[90m 696 |\u001b[39m expect(chrome\u001b[33m.\u001b[39mruntime\u001b[33m.\u001b[39msendMessage)\u001b[33m.\u001b[39mtoHaveBeenCalledWith(\u001b[22m\n\u001b[2m \u001b[90m |\u001b[39m \u001b[31m\u001b[1m^\u001b[22m\u001b[2m\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 697 |\u001b[39m expect\u001b[33m.\u001b[39mobjectContaining({\u001b[22m\n\u001b[2m \u001b[90m 698 |\u001b[39m type\u001b[33m:\u001b[39m \u001b[32m'PROBLEM_SOLVED'\u001b[39m\u001b[33m,\u001b[39m\u001b[22m\n\u001b[2m \u001b[90m 699 |\u001b[39m slug\u001b[33m:\u001b[39m \u001b[32m'best-time-to-buy-and-sell-stock'\u001b[39m\u001b[0m\u001b[22m\n\u001b[2m\u001b[22m\n\u001b[2m \u001b[2mat Object.toHaveBeenCalledWith (\u001b[22m\u001b[2m\u001b[0m\u001b[36mtests/content/detector.test.js\u001b[39m\u001b[0m\u001b[2m:696:42)\u001b[22m\u001b[2m\u001b[22m\n","name":"/Users/adamschmidt/Desktop/personalProjects/leetcodeForcer/tests/content/detector.test.js","startTime":1769360542519,"status":"failed","summary":""},{"assertionResults":[{"ancestorTitles":["api.js","loadAliases"],"duration":9,"failureDetails":[],"failureMessages":[],"fullName":"api.js loadAliases should fetch and cache aliases from extension resources","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"status":"passed","title":"should fetch and cache aliases from extension resources"},{"ancestorTitles":["api.js","loadAliases"],"duration":25,"failureDetails":[],"failureMessages":[],"fullName":"api.js loadAliases should return empty object on fetch failure","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should return empty object on fetch failure"},{"ancestorTitles":["api.js","loadAliases"],"duration":2,"failureDetails":[],"failureMessages":[],"fullName":"api.js loadAliases should fetch aliases on each call","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should fetch aliases on each call"},{"ancestorTitles":["api.js","resolveAlias"],"duration":1,"failureDetails":[],"failureMessages":[],"fullName":"api.js resolveAlias should resolve alias to canonical slug","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should resolve alias to canonical slug"},{"ancestorTitles":["api.js","resolveAlias"],"duration":3,"failureDetails":[],"failureMessages":[],"fullName":"api.js resolveAlias should return original slug if no alias exists","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should return original slug if no alias exists"},{"ancestorTitles":["api.js","resolveAlias"],"duration":1,"failureDetails":[],"failureMessages":[],"fullName":"api.js resolveAlias should handle null input","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should handle null input"},{"ancestorTitles":["api.js","getCurrentSlug"],"duration":1,"failureDetails":[],"failureMessages":[],"fullName":"api.js getCurrentSlug should extract slug from valid problem URL","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should extract slug from valid problem URL"},{"ancestorTitles":["api.js","getCurrentSlug"],"duration":1,"failureDetails":[],"failureMessages":[],"fullName":"api.js getCurrentSlug should extract slug from URL without trailing slash","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should extract slug from URL without trailing slash"},{"ancestorTitles":["api.js","getCurrentSlug"],"duration":1,"failureDetails":[],"failureMessages":[],"fullName":"api.js getCurrentSlug should return null for invalid URL","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should return null for invalid URL"},{"ancestorTitles":["api.js","getCurrentSlug"],"duration":1,"failureDetails":[],"failureMessages":[],"fullName":"api.js getCurrentSlug should return null for non-problem URL","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should return null for non-problem URL"},{"ancestorTitles":["api.js","getCsrfToken"],"duration":0,"failureDetails":[],"failureMessages":[],"fullName":"api.js getCsrfToken should extract CSRF token from cookies","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should extract CSRF token from cookies"},{"ancestorTitles":["api.js","getCsrfToken"],"duration":0,"failureDetails":[],"failureMessages":[],"fullName":"api.js getCsrfToken should return empty string when CSRF token not present","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should return empty string when CSRF token not present"},{"ancestorTitles":["api.js","getCsrfToken"],"duration":0,"failureDetails":[],"failureMessages":[],"fullName":"api.js getCsrfToken should handle empty cookies","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should handle empty cookies"},{"ancestorTitles":["api.js","getCurrentUsername"],"duration":0,"failureDetails":[],"failureMessages":[],"fullName":"api.js getCurrentUsername should fetch username from LeetCode API","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"status":"passed","title":"should fetch username from LeetCode API"},{"ancestorTitles":["api.js","getCurrentUsername"],"duration":1005,"failureDetails":[],"failureMessages":[],"fullName":"api.js getCurrentUsername should retry on failure","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"status":"passed","title":"should retry on failure"},{"ancestorTitles":["api.js","getCurrentUsername"],"duration":1002,"failureDetails":[],"failureMessages":[],"fullName":"api.js getCurrentUsername should return null after all retries fail","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"status":"passed","title":"should return null after all retries fail"},{"ancestorTitles":["api.js","queryProblemStatus"],"duration":1,"failureDetails":[],"failureMessages":[],"fullName":"api.js queryProblemStatus should query problem status and return \"ac\" for solved","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should query problem status and return \"ac\" for solved"},{"ancestorTitles":["api.js","queryProblemStatus"],"duration":0,"failureDetails":[],"failureMessages":[],"fullName":"api.js queryProblemStatus should return null for unsolved problem","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should return null for unsolved problem"},{"ancestorTitles":["api.js","queryProblemStatus"],"duration":1,"failureDetails":[],"failureMessages":[],"fullName":"api.js queryProblemStatus should return null on fetch error","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should return null on fetch error"},{"ancestorTitles":["api.js","queryRecentSubmissions"],"duration":0,"failureDetails":[],"failureMessages":[],"fullName":"api.js queryRecentSubmissions should fetch recent submissions","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should fetch recent submissions"},{"ancestorTitles":["api.js","queryRecentSubmissions"],"duration":0,"failureDetails":[],"failureMessages":[],"fullName":"api.js queryRecentSubmissions should return empty array on fetch error","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should return empty array on fetch error"},{"ancestorTitles":["api.js","queryProblemSubmissions"],"duration":1,"failureDetails":[],"failureMessages":[],"fullName":"api.js queryProblemSubmissions should fetch problem-specific submissions","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should fetch problem-specific submissions"},{"ancestorTitles":["api.js","queryProblemSubmissions"],"duration":1,"failureDetails":[],"failureMessages":[],"fullName":"api.js queryProblemSubmissions should return empty array on fetch error","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should return empty array on fetch error"},{"ancestorTitles":["api.js","isSolvedToday"],"duration":0,"failureDetails":[],"failureMessages":[],"fullName":"api.js isSolvedToday should return true for timestamp from today","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should return true for timestamp from today"},{"ancestorTitles":["api.js","isSolvedToday"],"duration":0,"failureDetails":[],"failureMessages":[],"fullName":"api.js isSolvedToday should return false for timestamp from yesterday","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should return false for timestamp from yesterday"},{"ancestorTitles":["api.js","isSolvedToday"],"duration":1,"failureDetails":[],"failureMessages":[],"fullName":"api.js isSolvedToday should return false for timestamp from tomorrow","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should return false for timestamp from tomorrow"},{"ancestorTitles":["api.js","isSolvedToday"],"duration":0,"failureDetails":[],"failureMessages":[],"fullName":"api.js isSolvedToday should handle null timestamp","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should handle null timestamp"},{"ancestorTitles":["api.js","isSolvedToday"],"duration":0,"failureDetails":[],"failureMessages":[],"fullName":"api.js isSolvedToday should handle undefined timestamp","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should handle undefined timestamp"},{"ancestorTitles":["api.js","isSolvedToday"],"duration":0,"failureDetails":[],"failureMessages":[],"fullName":"api.js isSolvedToday should correctly compare dates at midnight boundary","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should correctly compare dates at midnight boundary"}],"endTime":1769360545082,"message":"","name":"/Users/adamschmidt/Desktop/personalProjects/leetcodeForcer/tests/content/api.test.js","startTime":1769360542527,"status":"passed","summary":""},{"assertionResults":[{"ancestorTitles":["ui.js","checkIfShouldShowCelebration"],"duration":9,"failureDetails":[],"failureMessages":[],"fullName":"ui.js checkIfShouldShowCelebration should return true when celebration enabled and not shown today","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should return true when celebration enabled and not shown today"},{"ancestorTitles":["ui.js","checkIfShouldShowCelebration"],"duration":5,"failureDetails":[],"failureMessages":[],"fullName":"ui.js checkIfShouldShowCelebration should return false when celebration disabled","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should return false when celebration disabled"},{"ancestorTitles":["ui.js","checkIfShouldShowCelebration"],"duration":2,"failureDetails":[],"failureMessages":[],"fullName":"ui.js checkIfShouldShowCelebration should return false when celebration already shown today","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should return false when celebration already shown today"},{"ancestorTitles":["ui.js","checkIfShouldShowCelebration"],"duration":1,"failureDetails":[],"failureMessages":[],"fullName":"ui.js checkIfShouldShowCelebration should default to enabled when setting not present","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should default to enabled when setting not present"},{"ancestorTitles":["ui.js","markCelebrationAsShown"],"duration":2,"failureDetails":[],"failureMessages":[],"fullName":"ui.js markCelebrationAsShown should save today's date to local storage","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should save today's date to local storage"},{"ancestorTitles":["ui.js","triggerConfetti"],"duration":52,"failureDetails":[],"failureMessages":[],"fullName":"ui.js triggerConfetti should create confetti container in DOM","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"status":"passed","title":"should create confetti container in DOM"},{"ancestorTitles":["ui.js","triggerConfetti"],"duration":67,"failureDetails":[],"failureMessages":[],"fullName":"ui.js triggerConfetti should create multiple confetti pieces","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"status":"passed","title":"should create multiple confetti pieces"},{"ancestorTitles":["ui.js","triggerConfetti"],"duration":16,"failureDetails":[],"failureMessages":[],"fullName":"ui.js triggerConfetti should apply random colors to confetti","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should apply random colors to confetti"},{"ancestorTitles":["ui.js","triggerConfetti"],"duration":5522,"failureDetails":[],"failureMessages":[],"fullName":"ui.js triggerConfetti should remove confetti after animation","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"status":"passed","title":"should remove confetti after animation"},{"ancestorTitles":["ui.js","triggerConfetti"],"duration":17,"failureDetails":[],"failureMessages":[],"fullName":"ui.js triggerConfetti should apply random positions to confetti","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should apply random positions to confetti"},{"ancestorTitles":["ui.js","showSolvedNotification"],"duration":8,"failureDetails":[],"failureMessages":[],"fullName":"ui.js showSolvedNotification should create notification banner","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should create notification banner"},{"ancestorTitles":["ui.js","showSolvedNotification"],"duration":3,"failureDetails":[],"failureMessages":[],"fullName":"ui.js showSolvedNotification should display success message","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"status":"passed","title":"should display success message"},{"ancestorTitles":["ui.js","showSolvedNotification"],"duration":12,"failureDetails":[],"failureMessages":[],"fullName":"ui.js showSolvedNotification should trigger confetti when enabled and not shown today","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should trigger confetti when enabled and not shown today"},{"ancestorTitles":["ui.js","showSolvedNotification"],"duration":2,"failureDetails":[],"failureMessages":[],"fullName":"ui.js showSolvedNotification should not trigger confetti when disabled","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should not trigger confetti when disabled"},{"ancestorTitles":["ui.js","showSolvedNotification"],"duration":9,"failureDetails":[],"failureMessages":[],"fullName":"ui.js showSolvedNotification should mark celebration as shown when triggered","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should mark celebration as shown when triggered"},{"ancestorTitles":["ui.js","showSolvedNotification"],"duration":7002,"failureDetails":[],"failureMessages":[],"fullName":"ui.js showSolvedNotification should auto-remove notification after delay","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"status":"passed","title":"should auto-remove notification after delay"},{"ancestorTitles":["ui.js","showSolvedNotification"],"duration":7,"failureDetails":[],"failureMessages":[],"fullName":"ui.js showSolvedNotification should style notification correctly","invocations":1,"location":null,"numPassingAsserts":3,"retryReasons":[],"status":"passed","title":"should style notification correctly"},{"ancestorTitles":["ui.js","DOM Cleanup"],"duration":23,"failureDetails":[],"failureMessages":[],"fullName":"ui.js DOM Cleanup should not create duplicate confetti containers","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should not create duplicate confetti containers"},{"ancestorTitles":["ui.js","DOM Cleanup"],"duration":2,"failureDetails":[],"failureMessages":[],"fullName":"ui.js DOM Cleanup should not create duplicate notification banners","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should not create duplicate notification banners"}],"endTime":1769360555776,"message":"","name":"/Users/adamschmidt/Desktop/personalProjects/leetcodeForcer/tests/content/ui.test.js","startTime":1769360542521,"status":"passed","summary":""}],"wasInterrupted":false}