| 1 |
- {"numTotalTestSuites":722,"numPassedTestSuites":722,"numFailedTestSuites":0,"numPendingTestSuites":0,"numTotalTests":2072,"numPassedTests":2072,"numFailedTests":0,"numPendingTests":0,"numTodoTests":0,"snapshot":{"added":0,"failure":false,"filesAdded":0,"filesRemoved":0,"filesRemovedList":[],"filesUnmatched":0,"filesUpdated":0,"matched":0,"total":0,"unchecked":0,"uncheckedKeysByFile":[],"unmatched":0,"updated":0,"didUpdate":false},"startTime":1789442753225,"success":true,"testResults":[{"assertionResults":[{"ancestorTitles":["account protection API"],"fullName":"account protection API previews and applies mode1 via the mode query","status":"passed","title":"previews and applies mode1 via the mode query","duration":1.71550000000002,"failureMessages":[],"meta":{}},{"ancestorTitles":["account protection API"],"fullName":"account protection API previews and applies mode2 via the mode query","status":"passed","title":"previews and applies mode2 via the mode query","duration":0.2742999999999256,"failureMessages":[],"meta":{}},{"ancestorTitles":["account protection API"],"fullName":"account protection API previews and applies legacy via the mode query","status":"passed","title":"previews and applies legacy via the mode query","duration":0.18859999999995125,"failureMessages":[],"meta":{}},{"ancestorTitles":["account protection API"],"fullName":"account protection API defaults to legacy and leaves revert response unchanged","status":"passed","title":"defaults to legacy and leaves revert response unchanged","duration":0.2703999999999951,"failureMessages":[],"meta":{}},{"ancestorTitles":["account protection API"],"fullName":"account protection API loads the server-owned strategy registry","status":"passed","title":"loads the server-owned strategy registry","duration":0.44460000000003674,"failureMessages":[],"meta":{}}],"startTime":1789442809287,"endTime":1789442809289.4446,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/api/__tests__/admin.accounts.antiDegrade.spec.ts"},{"assertionResults":[{"ancestorTitles":["admin account duplicate API"],"fullName":"admin account duplicate API sends a stable idempotency key with the duplicate request","status":"passed","title":"sends a stable idempotency key with the duplicate request","duration":1.7146000000000186,"failureMessages":[],"meta":{}},{"ancestorTitles":["admin account duplicate API"],"fullName":"admin account duplicate API reuses the operation key after an ambiguous failed request","status":"passed","title":"reuses the operation key after an ambiguous failed request","duration":0.9738999999999578,"failureMessages":[],"meta":{}},{"ancestorTitles":["admin account duplicate API"],"fullName":"admin account duplicate API reuses the operation key after a page reload","status":"passed","title":"reuses the operation key after a page reload","duration":1.7533999999999423,"failureMessages":[],"meta":{}}],"startTime":1789442810418,"endTime":1789442810422.7534,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/api/__tests__/admin.accounts.duplicate.spec.ts"},{"assertionResults":[{"ancestorTitles":["admin Ollama Cloud usage API"],"fullName":"admin Ollama Cloud usage API uses dedicated global settings endpoints","status":"passed","title":"uses dedicated global settings endpoints","duration":2.0154999999999745,"failureMessages":[],"meta":{}},{"ancestorTitles":["admin Ollama Cloud usage API"],"fullName":"admin Ollama Cloud usage API keeps session configuration write-only and separate from account updates","status":"passed","title":"keeps session configuration write-only and separate from account updates","duration":0.9363999999999351,"failureMessages":[],"meta":{}}],"startTime":1789442803974,"endTime":1789442803976.9363,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/api/__tests__/admin.accounts.ollamaCloudUsage.spec.ts"},{"assertionResults":[{"ancestorTitles":["admin account upstream billing probe API"],"fullName":"admin account upstream billing probe API reads and updates global settings","status":"passed","title":"reads and updates global settings","duration":1.899599999999964,"failureMessages":[],"meta":{}},{"ancestorTitles":["admin account upstream billing probe API"],"fullName":"admin account upstream billing probe API uses dedicated account and batch endpoints","status":"passed","title":"uses dedicated account and batch endpoints","duration":0.4637000000000171,"failureMessages":[],"meta":{}}],"startTime":1789442811025,"endTime":1789442811027.4636,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/api/__tests__/admin.accounts.upstreamBillingProbe.spec.ts"},{"assertionResults":[{"ancestorTitles":["admin channel monitor duplicate API"],"fullName":"admin channel monitor duplicate API sends a stable idempotency key with the duplicate request","status":"passed","title":"sends a stable idempotency key with the duplicate request","duration":1.9155999999999267,"failureMessages":[],"meta":{}},{"ancestorTitles":["admin channel monitor duplicate API"],"fullName":"admin channel monitor duplicate API reuses the operation key after an ambiguous failed request","status":"passed","title":"reuses the operation key after an ambiguous failed request","duration":1.0357000000000198,"failureMessages":[],"meta":{}},{"ancestorTitles":["admin channel monitor duplicate API"],"fullName":"admin channel monitor duplicate API reuses the operation key after a page reload","status":"passed","title":"reuses the operation key after a page reload","duration":3.960299999999961,"failureMessages":[],"meta":{}},{"ancestorTitles":["admin channel monitor duplicate API"],"fullName":"admin channel monitor duplicate API does not reuse an operation key across administrators for the same monitor","status":"passed","title":"does not reuse an operation key across administrators for the same monitor","duration":0.5024999999999409,"failureMessages":[],"meta":{}},{"ancestorTitles":["admin channel monitor duplicate API"],"fullName":"admin channel monitor duplicate API does not persist or reuse keys when the current user cannot be parsed","status":"passed","title":"does not persist or reuse keys when the current user cannot be parsed","duration":0.31720000000007076,"failureMessages":[],"meta":{}}],"startTime":1789442794216,"endTime":1789442794223.5024,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/api/__tests__/admin.channelMonitor.duplicate.spec.ts"},{"assertionResults":[{"ancestorTitles":["admin Grok SSO import API"],"fullName":"admin Grok SSO import API uses a timeout sized for 1 keys","status":"passed","title":"uses a timeout sized for 1 keys","duration":2.046600000000012,"failureMessages":[],"meta":{}},{"ancestorTitles":["admin Grok SSO import API"],"fullName":"admin Grok SSO import API uses a timeout sized for 3 keys","status":"passed","title":"uses a timeout sized for 3 keys","duration":0.2662000000000262,"failureMessages":[],"meta":{}},{"ancestorTitles":["admin Grok SSO import API"],"fullName":"admin Grok SSO import API uses a timeout sized for 4 keys","status":"passed","title":"uses a timeout sized for 4 keys","duration":0.1933999999999969,"failureMessages":[],"meta":{}},{"ancestorTitles":["admin Grok SSO import API"],"fullName":"admin Grok SSO import API uses a timeout sized for 7 keys","status":"passed","title":"uses a timeout sized for 7 keys","duration":0.17180000000007567,"failureMessages":[],"meta":{}},{"ancestorTitles":["admin Grok SSO import API"],"fullName":"admin Grok SSO import API preserves password whitespace and applies the authorization timeout","status":"passed","title":"preserves password whitespace and applies the authorization timeout","duration":0.3286000000000513,"failureMessages":[],"meta":{}}],"startTime":1789442816250,"endTime":1789442816253.3286,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/api/__tests__/admin.grok.spec.ts"},{"assertionResults":[{"ancestorTitles":["admin group duplicate API"],"fullName":"admin group duplicate API sends a stable idempotency key with the duplicate request","status":"passed","title":"sends a stable idempotency key with the duplicate request","duration":2.0072000000000116,"failureMessages":[],"meta":{}},{"ancestorTitles":["admin group duplicate API"],"fullName":"admin group duplicate API reuses the operation key after an ambiguous failed request","status":"passed","title":"reuses the operation key after an ambiguous failed request","duration":1.0497000000000298,"failureMessages":[],"meta":{}},{"ancestorTitles":["admin group duplicate API"],"fullName":"admin group duplicate API reuses the operation key after a page reload","status":"passed","title":"reuses the operation key after a page reload","duration":1.2264999999999873,"failureMessages":[],"meta":{}},{"ancestorTitles":["admin group duplicate API"],"fullName":"admin group duplicate API does not reuse an operation key across administrators for the same group","status":"passed","title":"does not reuse an operation key across administrators for the same group","duration":0.48090000000001965,"failureMessages":[],"meta":{}},{"ancestorTitles":["admin group duplicate API"],"fullName":"admin group duplicate API does not persist or reuse keys when the current user cannot be parsed","status":"passed","title":"does not persist or reuse keys when the current user cannot be parsed","duration":0.33990000000005693,"failureMessages":[],"meta":{}}],"startTime":1789442794858,"endTime":1789442794863.481,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/api/__tests__/admin.groups.duplicate.spec.ts"},{"assertionResults":[{"ancestorTitles":["admin group usage summary API"],"fullName":"admin group usage summary API does not send browser timezone parameters","status":"passed","title":"does not send browser timezone parameters","duration":1.6787999999999101,"failureMessages":[],"meta":{}}],"startTime":1789442824319,"endTime":1789442824320.6787,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/api/__tests__/admin.groups.usage-summary.spec.ts"},{"assertionResults":[{"ancestorTitles":["'paginated list'"],"fullName":"'paginated list' rejects an empty or malformed successful response: \"\"","status":"passed","title":"rejects an empty or malformed successful response: \"\"","duration":1.2901000000000522,"failureMessages":[],"meta":{}},{"ancestorTitles":["'paginated list'"],"fullName":"'paginated list' rejects an empty or malformed successful response: undefined","status":"passed","title":"rejects an empty or malformed successful response: undefined","duration":0.18640000000004875,"failureMessages":[],"meta":{}},{"ancestorTitles":["'paginated list'"],"fullName":"'paginated list' rejects an empty or malformed successful response: null","status":"passed","title":"rejects an empty or malformed successful response: null","duration":0.11549999999999727,"failureMessages":[],"meta":{}},{"ancestorTitles":["'paginated list'"],"fullName":"'paginated list' rejects an empty or malformed successful response: {}","status":"passed","title":"rejects an empty or malformed successful response: {}","duration":0.10710000000005948,"failureMessages":[],"meta":{}},{"ancestorTitles":["'paginated list'"],"fullName":"'paginated list' rejects an empty or malformed successful response: {\"items\":null}","status":"passed","title":"rejects an empty or malformed successful response: {\"items\":null}","duration":0.11400000000003274,"failureMessages":[],"meta":{}},{"ancestorTitles":["'paginated list'"],"fullName":"'paginated list' rejects an empty or malformed successful response: {\"items\":{}}","status":"passed","title":"rejects an empty or malformed successful response: {\"items\":{}}","duration":0.11249999999995453,"failureMessages":[],"meta":{}},{"ancestorTitles":["'paginated list'"],"fullName":"'paginated list' preserves valid rows: {\"items\":[]}","status":"passed","title":"preserves valid rows: {\"items\":[]}","duration":0.2860000000000582,"failureMessages":[],"meta":{}},{"ancestorTitles":["'paginated list'"],"fullName":"'paginated list' preserves valid rows: {\"items\":[{\"id\":1,\"name\":\"valid proxy\"}]}","status":"passed","title":"preserves valid rows: {\"items\":[{\"id\":1,\"name\":\"valid proxy\"}]}","duration":0.09230000000002292,"failureMessages":[],"meta":{}},{"ancestorTitles":["'account selector'"],"fullName":"'account selector' rejects an empty or malformed successful response: \"\"","status":"passed","title":"rejects an empty or malformed successful response: \"\"","duration":0.15699999999992542,"failureMessages":[],"meta":{}},{"ancestorTitles":["'account selector'"],"fullName":"'account selector' rejects an empty or malformed successful response: undefined","status":"passed","title":"rejects an empty or malformed successful response: undefined","duration":0.1996000000000322,"failureMessages":[],"meta":{}},{"ancestorTitles":["'account selector'"],"fullName":"'account selector' rejects an empty or malformed successful response: null","status":"passed","title":"rejects an empty or malformed successful response: null","duration":0.13239999999996144,"failureMessages":[],"meta":{}},{"ancestorTitles":["'account selector'"],"fullName":"'account selector' rejects an empty or malformed successful response: {}","status":"passed","title":"rejects an empty or malformed successful response: {}","duration":0.11759999999992488,"failureMessages":[],"meta":{}},{"ancestorTitles":["'account selector'"],"fullName":"'account selector' rejects an empty or malformed successful response: {\"items\":null}","status":"passed","title":"rejects an empty or malformed successful response: {\"items\":null}","duration":0.07459999999991851,"failureMessages":[],"meta":{}},{"ancestorTitles":["'account selector'"],"fullName":"'account selector' rejects an empty or malformed successful response: {\"items\":{}}","status":"passed","title":"rejects an empty or malformed successful response: {\"items\":{}}","duration":0.08519999999998618,"failureMessages":[],"meta":{}},{"ancestorTitles":["'account selector'"],"fullName":"'account selector' preserves valid rows: {\"items\":[]}","status":"passed","title":"preserves valid rows: {\"items\":[]}","duration":0.06790000000000873,"failureMessages":[],"meta":{}},{"ancestorTitles":["'account selector'"],"fullName":"'account selector' preserves valid rows: {\"items\":[{\"id\":1,\"name\":\"valid proxy\"}]}","status":"passed","title":"preserves valid rows: {\"items\":[{\"id\":1,\"name\":\"valid proxy\"}]}","duration":0.0546999999999116,"failureMessages":[],"meta":{}},{"ancestorTitles":["'account selector with counts'"],"fullName":"'account selector with counts' rejects an empty or malformed successful response: \"\"","status":"passed","title":"rejects an empty or malformed successful response: \"\"","duration":0.11269999999990432,"failureMessages":[],"meta":{}},{"ancestorTitles":["'account selector with counts'"],"fullName":"'account selector with counts' rejects an empty or malformed successful response: undefined","status":"passed","title":"rejects an empty or malformed successful response: undefined","duration":0.061199999999985266,"failureMessages":[],"meta":{}},{"ancestorTitles":["'account selector with counts'"],"fullName":"'account selector with counts' rejects an empty or malformed successful response: null","status":"passed","title":"rejects an empty or malformed successful response: null","duration":0.05889999999999418,"failureMessages":[],"meta":{}},{"ancestorTitles":["'account selector with counts'"],"fullName":"'account selector with counts' rejects an empty or malformed successful response: {}","status":"passed","title":"rejects an empty or malformed successful response: {}","duration":0.05660000000000309,"failureMessages":[],"meta":{}},{"ancestorTitles":["'account selector with counts'"],"fullName":"'account selector with counts' rejects an empty or malformed successful response: {\"items\":null}","status":"passed","title":"rejects an empty or malformed successful response: {\"items\":null}","duration":0.06780000000003383,"failureMessages":[],"meta":{}},{"ancestorTitles":["'account selector with counts'"],"fullName":"'account selector with counts' rejects an empty or malformed successful response: {\"items\":{}}","status":"passed","title":"rejects an empty or malformed successful response: {\"items\":{}}","duration":0.06539999999995416,"failureMessages":[],"meta":{}},{"ancestorTitles":["'account selector with counts'"],"fullName":"'account selector with counts' preserves valid rows: {\"items\":[]}","status":"passed","title":"preserves valid rows: {\"items\":[]}","duration":0.06790000000000873,"failureMessages":[],"meta":{}},{"ancestorTitles":["'account selector with counts'"],"fullName":"'account selector with counts' preserves valid rows: {\"items\":[{\"id\":1,\"name\":\"valid proxy\"}]}","status":"passed","title":"preserves valid rows: {\"items\":[{\"id\":1,\"name\":\"valid proxy\"}]}","duration":0.04809999999997672,"failureMessages":[],"meta":{}}],"startTime":1789442819563,"endTime":1789442819567.1128,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/api/__tests__/admin.proxies.spec.ts"},{"assertionResults":[{"ancestorTitles":["admin system rollback API"],"fullName":"admin system rollback API getRollbackVersions fetches the rollback version list","status":"passed","title":"getRollbackVersions fetches the rollback version list","duration":1.363299999999981,"failureMessages":[],"meta":{}},{"ancestorTitles":["admin system rollback API"],"fullName":"admin system rollback API rollback posts the target version in the request body","status":"passed","title":"rollback posts the target version in the request body","duration":0.42649999999991905,"failureMessages":[],"meta":{}},{"ancestorTitles":["admin system rollback API"],"fullName":"admin system rollback API rollback without a version posts no body (legacy backup rollback)","status":"passed","title":"rollback without a version posts no body (legacy backup rollback)","duration":0.17049999999994725,"failureMessages":[],"meta":{}}],"startTime":1789442813747,"endTime":1789442813749.1704,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/api/__tests__/admin.system.rollback.spec.ts"},{"assertionResults":[{"ancestorTitles":["admin users api auth identity binding"],"fullName":"admin users api auth identity binding posts the backend-compatible auth identity bind payload and returns the backend response shape","status":"passed","title":"posts the backend-compatible auth identity bind payload and returns the backend response shape","duration":1.5508000000000948,"failureMessages":[],"meta":{}},{"ancestorTitles":["admin users api auth identity binding"],"fullName":"admin users api auth identity binding keeps bind auth identity request and response types aligned with the backend contract","status":"passed","title":"keeps bind auth identity request and response types aligned with the backend contract","duration":0.1594000000000051,"failureMessages":[],"meta":{}},{"ancestorTitles":["admin users api auth identity binding"],"fullName":"admin users api auth identity binding posts batch limit updates once with only the supplied limit fields","status":"passed","title":"posts batch limit updates once with only the supplied limit fields","duration":0.2917000000001053,"failureMessages":[],"meta":{}}],"startTime":1789442793162,"endTime":1789442793164.2917,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/api/__tests__/admin.users.spec.ts"},{"assertionResults":[{"ancestorTitles":["Admin UI request marker"],"fullName":"Admin UI request marker uses the stable request header name","status":"passed","title":"uses the stable request header name","duration":0.6484000000000378,"failureMessages":[],"meta":{}},{"ancestorTitles":["Admin UI request marker"],"fullName":"Admin UI request marker marks Admin API request /admin before page navigation","status":"passed","title":"marks Admin API request /admin before page navigation","duration":0.5447000000000344,"failureMessages":[],"meta":{}},{"ancestorTitles":["Admin UI request marker"],"fullName":"Admin UI request marker marks Admin API request /admin/users before page navigation","status":"passed","title":"marks Admin API request /admin/users before page navigation","duration":0.20420000000001437,"failureMessages":[],"meta":{}},{"ancestorTitles":["Admin UI request marker"],"fullName":"Admin UI request marker marks Admin API request /api/v1/admin before page navigation","status":"passed","title":"marks Admin API request /api/v1/admin before page navigation","duration":0.15589999999997417,"failureMessages":[],"meta":{}},{"ancestorTitles":["Admin UI request marker"],"fullName":"Admin UI request marker marks Admin API request /api/v1/admin/accounts?status=active before page navigation","status":"passed","title":"marks Admin API request /api/v1/admin/accounts?status=active before page navigation","duration":0.3048999999999751,"failureMessages":[],"meta":{}},{"ancestorTitles":["Admin UI request marker"],"fullName":"Admin UI request marker marks Admin API request https://api.example.test/api/v1/admin/dashboard before page navigation","status":"passed","title":"marks Admin API request https://api.example.test/api/v1/admin/dashboard before page navigation","duration":0.22280000000000655,"failureMessages":[],"meta":{}},{"ancestorTitles":["Admin UI request marker"],"fullName":"Admin UI request marker marks shared request /keys while an Admin page is active","status":"passed","title":"marks shared request /keys while an Admin page is active","duration":0.15480000000002292,"failureMessages":[],"meta":{}},{"ancestorTitles":["Admin UI request marker"],"fullName":"Admin UI request marker marks shared request /groups/available while an Admin page is active","status":"passed","title":"marks shared request /groups/available while an Admin page is active","duration":0.14400000000000546,"failureMessages":[],"meta":{}},{"ancestorTitles":["Admin UI request marker"],"fullName":"Admin UI request marker marks shared request /auth/me while an Admin page is active","status":"passed","title":"marks shared request /auth/me while an Admin page is active","duration":0.15350000000000819,"failureMessages":[],"meta":{}},{"ancestorTitles":["Admin UI request marker"],"fullName":"Admin UI request marker marks shared request /announcements while an Admin page is active","status":"passed","title":"marks shared request /announcements while an Admin page is active","duration":0.18010000000003856,"failureMessages":[],"meta":{}},{"ancestorTitles":["Admin UI request marker"],"fullName":"Admin UI request marker does not mark request /keys on page /dashboard","status":"passed","title":"does not mark request /keys on page /dashboard","duration":0.16879999999991924,"failureMessages":[],"meta":{}},{"ancestorTitles":["Admin UI request marker"],"fullName":"Admin UI request marker does not mark request /api/v1/administer on page /dashboard","status":"passed","title":"does not mark request /api/v1/administer on page /dashboard","duration":0.12829999999996744,"failureMessages":[],"meta":{}},{"ancestorTitles":["Admin UI request marker"],"fullName":"Admin UI request marker does not mark request /keys on page /administrator","status":"passed","title":"does not mark request /keys on page /administrator","duration":0.0906999999999698,"failureMessages":[],"meta":{}},{"ancestorTitles":["Admin UI request marker"],"fullName":"Admin UI request marker does not mark request on page /","status":"passed","title":"does not mark request on page /","duration":0.045600000000035834,"failureMessages":[],"meta":{}},{"ancestorTitles":["User UI request marker"],"fullName":"User UI request marker uses the stable request header name","status":"passed","title":"uses the stable request header name","duration":0.06700000000000728,"failureMessages":[],"meta":{}},{"ancestorTitles":["User UI request marker"],"fullName":"User UI request marker marks user timing API /auth/me","status":"passed","title":"marks user timing API /auth/me","duration":0.2658000000000129,"failureMessages":[],"meta":{}},{"ancestorTitles":["User UI request marker"],"fullName":"User UI request marker marks user timing API /auth/revoke-all-sessions","status":"passed","title":"marks user timing API /auth/revoke-all-sessions","duration":0.18659999999999854,"failureMessages":[],"meta":{}},{"ancestorTitles":["User UI request marker"],"fullName":"User UI request marker marks user timing API /auth/oauth/bind-token","status":"passed","title":"marks user timing API /auth/oauth/bind-token","duration":0.18229999999994106,"failureMessages":[],"meta":{}},{"ancestorTitles":["User UI request marker"],"fullName":"User UI request marker marks user timing API /user","status":"passed","title":"marks user timing API /user","duration":0.13150000000007367,"failureMessages":[],"meta":{}},{"ancestorTitles":["User UI request marker"],"fullName":"User UI request marker marks user timing API /user/profile","status":"passed","title":"marks user timing API /user/profile","duration":0.14960000000007767,"failureMessages":[],"meta":{}},{"ancestorTitles":["User UI request marker"],"fullName":"User UI request marker marks user timing API /user/password","status":"passed","title":"marks user timing API /user/password","duration":0.16049999999995634,"failureMessages":[],"meta":{}},{"ancestorTitles":["User UI request marker"],"fullName":"User UI request marker marks user timing API /user/notify-email/send-code","status":"passed","title":"marks user timing API /user/notify-email/send-code","duration":0.25300000000004275,"failureMessages":[],"meta":{}},{"ancestorTitles":["User UI request marker"],"fullName":"User UI request marker marks user timing API /user/totp/status","status":"passed","title":"marks user timing API /user/totp/status","duration":0.37150000000008276,"failureMessages":[],"meta":{}},{"ancestorTitles":["User UI request marker"],"fullName":"User UI request marker marks user timing API /user/aff","status":"passed","title":"marks user timing API /user/aff","duration":0.18459999999993215,"failureMessages":[],"meta":{}},{"ancestorTitles":["User UI request marker"],"fullName":"User UI request marker marks user timing API /user/platform-quotas","status":"passed","title":"marks user timing API /user/platform-quotas","duration":0.1754999999999427,"failureMessages":[],"meta":{}},{"ancestorTitles":["User UI request marker"],"fullName":"User UI request marker marks user timing API /keys","status":"passed","title":"marks user timing API /keys","duration":0.23270000000002256,"failureMessages":[],"meta":{}},{"ancestorTitles":["User UI request marker"],"fullName":"User UI request marker marks user timing API /keys/12","status":"passed","title":"marks user timing API /keys/12","duration":0.11380000000008295,"failureMessages":[],"meta":{}},{"ancestorTitles":["User UI request marker"],"fullName":"User UI request marker marks user timing API /groups/available","status":"passed","title":"marks user timing API /groups/available","duration":0.15869999999995343,"failureMessages":[],"meta":{}},{"ancestorTitles":["User UI request marker"],"fullName":"User UI request marker marks user timing API /groups/rates","status":"passed","title":"marks user timing API /groups/rates","duration":0.13670000000001892,"failureMessages":[],"meta":{}},{"ancestorTitles":["User UI request marker"],"fullName":"User UI request marker marks user timing API /channels/available","status":"passed","title":"marks user timing API /channels/available","duration":0.14639999999997144,"failureMessages":[],"meta":{}},{"ancestorTitles":["User UI request marker"],"fullName":"User UI request marker marks user timing API /usage","status":"passed","title":"marks user timing API /usage","duration":0.13810000000000855,"failureMessages":[],"meta":{}},{"ancestorTitles":["User UI request marker"],"fullName":"User UI request marker marks user timing API /usage/stats","status":"passed","title":"marks user timing API /usage/stats","duration":0.1308999999999969,"failureMessages":[],"meta":{}},{"ancestorTitles":["User UI request marker"],"fullName":"User UI request marker marks user timing API /usage/dashboard/snapshot-v2","status":"passed","title":"marks user timing API /usage/dashboard/snapshot-v2","duration":0.13639999999998054,"failureMessages":[],"meta":{}},{"ancestorTitles":["User UI request marker"],"fullName":"User UI request marker marks user timing API /announcements","status":"passed","title":"marks user timing API /announcements","duration":0.15800000000001546,"failureMessages":[],"meta":{}},{"ancestorTitles":["User UI request marker"],"fullName":"User UI request marker marks user timing API /announcements/3/read","status":"passed","title":"marks user timing API /announcements/3/read","duration":0.12050000000010641,"failureMessages":[],"meta":{}},{"ancestorTitles":["User UI request marker"],"fullName":"User UI request marker marks user timing API /redeem","status":"passed","title":"marks user timing API /redeem","duration":0.1006000000000995,"failureMessages":[],"meta":{}},{"ancestorTitles":["User UI request marker"],"fullName":"User UI request marker marks user timing API /redeem/history","status":"passed","title":"marks user timing API /redeem/history","duration":0.1287000000000944,"failureMessages":[],"meta":{}},{"ancestorTitles":["User UI request marker"],"fullName":"User UI request marker marks user timing API /subscriptions","status":"passed","title":"marks user timing API /subscriptions","duration":0.14559999999994488,"failureMessages":[],"meta":{}},{"ancestorTitles":["User UI request marker"],"fullName":"User UI request marker marks user timing API /subscriptions/active","status":"passed","title":"marks user timing API /subscriptions/active","duration":0.18500000000005912,"failureMessages":[],"meta":{}},{"ancestorTitles":["User UI request marker"],"fullName":"User UI request marker marks user timing API /channel-monitors","status":"passed","title":"marks user timing API /channel-monitors","duration":0.13960000000008677,"failureMessages":[],"meta":{}},{"ancestorTitles":["User UI request marker"],"fullName":"User UI request marker marks user timing API /channel-monitors/9/status","status":"passed","title":"marks user timing API /channel-monitors/9/status","duration":0.12850000000003092,"failureMessages":[],"meta":{}},{"ancestorTitles":["User UI request marker"],"fullName":"User UI request marker marks user timing API /payment/config","status":"passed","title":"marks user timing API /payment/config","duration":0.14039999999999964,"failureMessages":[],"meta":{}},{"ancestorTitles":["User UI request marker"],"fullName":"User UI request marker marks user timing API /payment/plans","status":"passed","title":"marks user timing API /payment/plans","duration":0.13810000000000855,"failureMessages":[],"meta":{}},{"ancestorTitles":["User UI request marker"],"fullName":"User UI request marker marks user timing API /payment/orders","status":"passed","title":"marks user timing API /payment/orders","duration":0.13570000000004256,"failureMessages":[],"meta":{}},{"ancestorTitles":["User UI request marker"],"fullName":"User UI request marker marks user timing API /payment/orders/my","status":"passed","title":"marks user timing API /payment/orders/my","duration":0.1388000000000602,"failureMessages":[],"meta":{}},{"ancestorTitles":["User UI request marker"],"fullName":"User UI request marker marks user timing API /api/v1/auth/me","status":"passed","title":"marks user timing API /api/v1/auth/me","duration":0.126700000000028,"failureMessages":[],"meta":{}},{"ancestorTitles":["User UI request marker"],"fullName":"User UI request marker marks user timing API /api/v1/keys?page=1","status":"passed","title":"marks user timing API /api/v1/keys?page=1","duration":0.17390000000000327,"failureMessages":[],"meta":{}},{"ancestorTitles":["User UI request marker"],"fullName":"User UI request marker marks user timing API https://api.example.test/api/v1/payment/orders/1","status":"passed","title":"marks user timing API https://api.example.test/api/v1/payment/orders/1","duration":0.4110999999999194,"failureMessages":[],"meta":{}},{"ancestorTitles":["User UI request marker"],"fullName":"User UI request marker does not mark non-user timing API /auth/login","status":"passed","title":"does not mark non-user timing API /auth/login","duration":0.21339999999997872,"failureMessages":[],"meta":{}},{"ancestorTitles":["User UI request marker"],"fullName":"User UI request marker does not mark non-user timing API /settings/public","status":"passed","title":"does not mark non-user timing API /settings/public","duration":0.17639999999994416,"failureMessages":[],"meta":{}},{"ancestorTitles":["User UI request marker"],"fullName":"User UI request marker does not mark non-user timing API /admin/users","status":"passed","title":"does not mark non-user timing API /admin/users","duration":0.10379999999997835,"failureMessages":[],"meta":{}},{"ancestorTitles":["User UI request marker"],"fullName":"User UI request marker does not mark non-user timing API /groups","status":"passed","title":"does not mark non-user timing API /groups","duration":0.07940000000007785,"failureMessages":[],"meta":{}},{"ancestorTitles":["User UI request marker"],"fullName":"User UI request marker does not mark non-user timing API /channels","status":"passed","title":"does not mark non-user timing API /channels","duration":0.07339999999999236,"failureMessages":[],"meta":{}},{"ancestorTitles":["User UI request marker"],"fullName":"User UI request marker does not mark non-user timing API /payment/public/orders/verify","status":"passed","title":"does not mark non-user timing API /payment/public/orders/verify","duration":0.07439999999996871,"failureMessages":[],"meta":{}},{"ancestorTitles":["User UI request marker"],"fullName":"User UI request marker does not mark non-user timing API /payment/webhook/stripe","status":"passed","title":"does not mark non-user timing API /payment/webhook/stripe","duration":0.07699999999999818,"failureMessages":[],"meta":{}},{"ancestorTitles":["User UI request marker"],"fullName":"User UI request marker does not mark non-user timing API /api/v1/payment/public/orders/resolve","status":"passed","title":"does not mark non-user timing API /api/v1/payment/public/orders/resolve","duration":0.07899999999995089,"failureMessages":[],"meta":{}},{"ancestorTitles":["User UI request marker"],"fullName":"User UI request marker does not mark non-user timing API ","status":"passed","title":"does not mark non-user timing API ","duration":0.026700000000005275,"failureMessages":[],"meta":{}}],"startTime":1789442802770,"endTime":1789442802780.1765,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/api/__tests__/adminUIRequest.spec.ts"},{"assertionResults":[{"ancestorTitles":["OAuth captcha start API"],"fullName":"OAuth captcha start API posts Tencent captcha proof and preserves OAuth query parameters","status":"passed","title":"posts Tencent captcha proof and preserves OAuth query parameters","duration":2.111499999999978,"failureMessages":[],"meta":{}},{"ancestorTitles":["OAuth captcha start API"],"fullName":"OAuth captcha start API builds the legacy GET start URL when Tencent captcha is disabled","status":"passed","title":"builds the legacy GET start URL when Tencent captcha is disabled","duration":0.48929999999995744,"failureMessages":[],"meta":{}}],"startTime":1789442817491,"endTime":1789442817493.4893,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/api/__tests__/auth-captcha-oauth-start.spec.ts"},{"assertionResults":[{"ancestorTitles":["oauth adoption auth api"],"fullName":"oauth adoption auth api posts adoption decisions when exchanging pending oauth completion","status":"passed","title":"posts adoption decisions when exchanging pending oauth completion","duration":49.05970000000002,"failureMessages":[],"meta":{}},{"ancestorTitles":["oauth adoption auth api"],"fullName":"oauth adoption auth api posts bind-login decisions when finalizing pending oauth bind flow","status":"passed","title":"posts bind-login decisions when finalizing pending oauth bind flow","duration":1.3225999999999658,"failureMessages":[],"meta":{}},{"ancestorTitles":["oauth adoption auth api"],"fullName":"oauth adoption auth api posts linuxdo invitation completion with adoption decisions","status":"passed","title":"posts linuxdo invitation completion with adoption decisions","duration":0.5236000000001013,"failureMessages":[],"meta":{}},{"ancestorTitles":["oauth adoption auth api"],"fullName":"oauth adoption auth api posts linuxdo create-account completion with adoption decisions","status":"passed","title":"posts linuxdo create-account completion with adoption decisions","duration":0.3926000000000158,"failureMessages":[],"meta":{}},{"ancestorTitles":["oauth adoption auth api"],"fullName":"oauth adoption auth api posts affiliate code when completing linuxdo oauth registration","status":"passed","title":"posts affiliate code when completing linuxdo oauth registration","duration":0.3670999999999367,"failureMessages":[],"meta":{}},{"ancestorTitles":["oauth adoption auth api"],"fullName":"oauth adoption auth api posts oidc invitation completion with adoption decisions","status":"passed","title":"posts oidc invitation completion with adoption decisions","duration":0.36369999999999436,"failureMessages":[],"meta":{}},{"ancestorTitles":["oauth adoption auth api"],"fullName":"oauth adoption auth api posts oidc create-account completion with adoption decisions","status":"passed","title":"posts oidc create-account completion with adoption decisions","duration":0.3449000000000524,"failureMessages":[],"meta":{}},{"ancestorTitles":["oauth adoption auth api"],"fullName":"oauth adoption auth api posts wechat invitation completion with adoption decisions","status":"passed","title":"posts wechat invitation completion with adoption decisions","duration":0.33770000000004075,"failureMessages":[],"meta":{}},{"ancestorTitles":["oauth adoption auth api"],"fullName":"oauth adoption auth api posts wechat create-account completion with adoption decisions","status":"passed","title":"posts wechat create-account completion with adoption decisions","duration":0.34600000000000364,"failureMessages":[],"meta":{}},{"ancestorTitles":["oauth adoption auth api"],"fullName":"oauth adoption auth api posts affiliate code when creating pending wechat oauth account","status":"passed","title":"posts affiliate code when creating pending wechat oauth account","duration":0.3887999999999465,"failureMessages":[],"meta":{}},{"ancestorTitles":["oauth adoption auth api"],"fullName":"oauth adoption auth api classifies oauth completion results as login or bind","status":"passed","title":"classifies oauth completion results as login or bind","duration":0.399599999999964,"failureMessages":[],"meta":{}},{"ancestorTitles":["oauth adoption auth api"],"fullName":"oauth adoption auth api provides bind-login utility helpers for invitation and suggested profile states","status":"passed","title":"provides bind-login utility helpers for invitation and suggested profile states","duration":0.3420000000000982,"failureMessages":[],"meta":{}},{"ancestorTitles":["oauth adoption auth api"],"fullName":"oauth adoption auth api requests an HttpOnly oauth bind cookie before redirect binding","status":"passed","title":"requests an HttpOnly oauth bind cookie before redirect binding","duration":0.4455000000000382,"failureMessages":[],"meta":{}}],"startTime":1789442783730,"endTime":1789442783785.4456,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/api/__tests__/auth-oauth-adoption.spec.ts"},{"assertionResults":[{"ancestorTitles":["channel monitor V2 query serialization"],"fullName":"channel monitor V2 query serialization uses repeated keys without bracket suffixes for array filters","status":"passed","title":"uses repeated keys without bracket suffixes for array filters","duration":1.0926000000000613,"failureMessages":[],"meta":{}},{"ancestorTitles":["channel monitor V2 query serialization"],"fullName":"channel monitor V2 query serialization sends the matrix grouping with the shared filters","status":"passed","title":"sends the matrix grouping with the shared filters","duration":1.835299999999961,"failureMessages":[],"meta":{}}],"startTime":1789442817941,"endTime":1789442817943.8352,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/api/__tests__/channelMonitorV2.spec.ts"},{"assertionResults":[{"ancestorTitles":["API Client","请求拦截器"],"fullName":"API Client 请求拦截器 规范化相对 API base,避免在回调页拼出相对 v1 路径","status":"passed","title":"规范化相对 API base,避免在回调页拼出相对 v1 路径","duration":18.564699999999903,"failureMessages":[],"meta":{}},{"ancestorTitles":["API Client","请求拦截器"],"fullName":"API Client 请求拦截器 自动附加 Authorization 头","status":"passed","title":"自动附加 Authorization 头","duration":22.069500000000062,"failureMessages":[],"meta":{}},{"ancestorTitles":["API Client","请求拦截器"],"fullName":"API Client 请求拦截器 无 token 时不附加 Authorization 头","status":"passed","title":"无 token 时不附加 Authorization 头","duration":6.180100000000039,"failureMessages":[],"meta":{}},{"ancestorTitles":["API Client","请求拦截器"],"fullName":"API Client 请求拦截器 GET 请求自动附加 timezone 参数","status":"passed","title":"GET 请求自动附加 timezone 参数","duration":14.568899999999985,"failureMessages":[],"meta":{}},{"ancestorTitles":["API Client","请求拦截器"],"fullName":"API Client 请求拦截器 POST 请求不附加 timezone 参数","status":"passed","title":"POST 请求不附加 timezone 参数","duration":5.810899999999947,"failureMessages":[],"meta":{}},{"ancestorTitles":["API Client","请求拦截器"],"fullName":"API Client 请求拦截器 请求默认带 withCredentials 以支持跨域 cookie","status":"passed","title":"请求默认带 withCredentials 以支持跨域 cookie","duration":5.278400000000147,"failureMessages":[],"meta":{}},{"ancestorTitles":["API Client","请求拦截器"],"fullName":"API Client 请求拦截器 Admin API 在进入管理页面前也带 Admin UI 标记","status":"passed","title":"Admin API 在进入管理页面前也带 Admin UI 标记","duration":5.535699999999906,"failureMessages":[],"meta":{}},{"ancestorTitles":["API Client","请求拦截器"],"fullName":"API Client 请求拦截器 管理页面调用共享 API 时带 Admin UI 标记","status":"passed","title":"管理页面调用共享 API 时带 Admin UI 标记","duration":6.150200000000041,"failureMessages":[],"meta":{}},{"ancestorTitles":["API Client","请求拦截器"],"fullName":"API Client 请求拦截器 普通用户页面调用共享 API 时不带 Admin UI 标记","status":"passed","title":"普通用户页面调用共享 API 时不带 Admin UI 标记","duration":6.179800000000114,"failureMessages":[],"meta":{}},{"ancestorTitles":["API Client","请求拦截器"],"fullName":"API Client 请求拦截器 用户侧 timing API 自动带 User UI 标记","status":"passed","title":"用户侧 timing API 自动带 User UI 标记","duration":6.757099999999809,"failureMessages":[],"meta":{}},{"ancestorTitles":["API Client","请求拦截器"],"fullName":"API Client 请求拦截器 支付用户 API 带 User UI 标记,公开支付 API 不带","status":"passed","title":"支付用户 API 带 User UI 标记,公开支付 API 不带","duration":6.976200000000063,"failureMessages":[],"meta":{}},{"ancestorTitles":["API Client","请求拦截器"],"fullName":"API Client 请求拦截器 管理页调用共享 API 时同时带 Admin 与 User UI 标记","status":"passed","title":"管理页调用共享 API 时同时带 Admin 与 User UI 标记","duration":5.938999999999851,"failureMessages":[],"meta":{}},{"ancestorTitles":["API Client","响应拦截器"],"fullName":"API Client 响应拦截器 code=0 时解包 data 字段","status":"passed","title":"code=0 时解包 data 字段","duration":6.430599999999913,"failureMessages":[],"meta":{}},{"ancestorTitles":["API Client","响应拦截器"],"fullName":"API Client 响应拦截器 code!=0 时拒绝并返回结构化错误","status":"passed","title":"code!=0 时拒绝并返回结构化错误","duration":6.304399999999987,"failureMessages":[],"meta":{}},{"ancestorTitles":["API Client","响应拦截器"],"fullName":"API Client 响应拦截器 部署与运营合规未确认时广播事件且保留登录态","status":"passed","title":"部署与运营合规未确认时广播事件且保留登录态","duration":6.345500000000129,"failureMessages":[],"meta":{}},{"ancestorTitles":["API Client","401 Token 刷新"],"fullName":"API Client 401 Token 刷新 无 refresh_token 时 401 清除 localStorage","status":"passed","title":"无 refresh_token 时 401 清除 localStorage","duration":16.355099999999993,"failureMessages":[],"meta":{}},{"ancestorTitles":["API Client","401 Token 刷新"],"fullName":"API Client 401 Token 刷新 有 refresh_token 时刷新并重试原请求","status":"passed","title":"有 refresh_token 时刷新并重试原请求","duration":6.9155000000000655,"failureMessages":[],"meta":{}},{"ancestorTitles":["API Client","401 Token 刷新"],"fullName":"API Client 401 Token 刷新 刷新期间换号时旧请求不会清除新会话","status":"passed","title":"刷新期间换号时旧请求不会清除新会话","duration":1074.1745,"failureMessages":[],"meta":{}},{"ancestorTitles":["API Client","网络错误"],"fullName":"API Client 网络错误 网络错误返回 status 0 的错误","status":"passed","title":"网络错误返回 status 0 的错误","duration":44.51540000000023,"failureMessages":[],"meta":{}},{"ancestorTitles":["API Client","请求取消"],"fullName":"API Client 请求取消 取消的请求保持原始取消错误","status":"passed","title":"取消的请求保持原始取消错误","duration":22.31269999999995,"failureMessages":[],"meta":{}}],"startTime":1789442769794,"endTime":1789442771087.3127,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/api/__tests__/client.spec.ts"},{"assertionResults":[{"ancestorTitles":["Codex models API"],"fullName":"Codex models API builds the authenticated Codex manifest endpoint from the public API base","status":"passed","title":"builds the authenticated Codex manifest endpoint from the public API base","duration":1.2483999999999469,"failureMessages":[],"meta":{}},{"ancestorTitles":["Codex models API"],"fullName":"Codex models API fetches a manifest with the current API key without adding it to the catalog","status":"passed","title":"fetches a manifest with the current API key without adding it to the catalog","duration":2.6949999999999363,"failureMessages":[],"meta":{}},{"ancestorTitles":["Codex models API"],"fullName":"Codex models API rejects a successful response that is not a Codex manifest","status":"passed","title":"rejects a successful response that is not a Codex manifest","duration":0.9908000000000357,"failureMessages":[],"meta":{}}],"startTime":1789442803396,"endTime":1789442803400.9907,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/api/__tests__/codex.spec.ts"},{"assertionResults":[{"ancestorTitles":["test settings submission snapshot"],"fullName":"test settings submission snapshot returns the values actually sent when the editable source changes during the request","status":"passed","title":"returns the values actually sent when the editable source changes during the request","duration":2.190399999999954,"failureMessages":[],"meta":{}}],"startTime":1789442816843,"endTime":1789442816845.1904,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/api/__tests__/intelligentTests.spec.ts"},{"assertionResults":[{"ancestorTitles":["passkey api"],"fullName":"passkey api converts assertion options and response bytes to WebAuthn JSON","status":"passed","title":"converts assertion options and response bytes to WebAuthn JSON","duration":1.5708999999999378,"failureMessages":[],"meta":{}},{"ancestorTitles":["passkey api"],"fullName":"passkey api sends Tencent captcha proof only with the passkey begin request","status":"passed","title":"sends Tencent captcha proof only with the passkey begin request","duration":0.5144000000000233,"failureMessages":[],"meta":{}},{"ancestorTitles":["passkey api"],"fullName":"passkey api sends the account password when beginning registration","status":"passed","title":"sends the account password when beginning registration","duration":0.4250000000000682,"failureMessages":[],"meta":{}},{"ancestorTitles":["passkey api"],"fullName":"passkey api sends the account password when revoking a credential","status":"passed","title":"sends the account password when revoking a credential","duration":0.64650000000006,"failureMessages":[],"meta":{}}],"startTime":1789442787207,"endTime":1789442787209.6465,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/api/__tests__/passkey.spec.ts"},{"assertionResults":[{"ancestorTitles":["payment api"],"fullName":"payment api keeps legacy public out_trade_no verification for upgrade compatibility","status":"passed","title":"keeps legacy public out_trade_no verification for upgrade compatibility","duration":1.4231000000000904,"failureMessages":[],"meta":{}},{"ancestorTitles":["payment api"],"fullName":"payment api keeps signed public resume-token resolve endpoint","status":"passed","title":"keeps signed public resume-token resolve endpoint","duration":0.22140000000001692,"failureMessages":[],"meta":{}}],"startTime":1789442821665,"endTime":1789442821667.2214,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/api/__tests__/payment.spec.ts"},{"assertionResults":[{"ancestorTitles":["admin settings auth source defaults helpers"],"fullName":"admin settings auth source defaults helpers builds auth source defaults state from flat settings fields","status":"passed","title":"builds auth source defaults state from flat settings fields","duration":1.338799999999992,"failureMessages":[],"meta":{}},{"ancestorTitles":["admin settings auth source defaults helpers"],"fullName":"admin settings auth source defaults helpers defaults grant-on-signup to disabled when settings are missing","status":"passed","title":"defaults grant-on-signup to disabled when settings are missing","duration":0.22939999999994143,"failureMessages":[],"meta":{}},{"ancestorTitles":["admin settings auth source defaults helpers"],"fullName":"admin settings auth source defaults helpers reads nested platform_quotas from settings into auth source state","status":"passed","title":"reads nested platform_quotas from settings into auth source state","duration":0.16470000000003893,"failureMessages":[],"meta":{}},{"ancestorTitles":["admin settings auth source defaults helpers"],"fullName":"admin settings auth source defaults helpers appends auth source defaults back onto update payload","status":"passed","title":"appends auth source defaults back onto update payload","duration":0.8617000000000417,"failureMessages":[],"meta":{}},{"ancestorTitles":["admin settings auth source defaults helpers"],"fullName":"admin settings auth source defaults helpers appends sanitized nested platform_quotas with non-null values in update payload","status":"passed","title":"appends sanitized nested platform_quotas with non-null values in update payload","duration":0.2098999999999478,"failureMessages":[],"meta":{}},{"ancestorTitles":["normalizePlatformQuotasMap"],"fullName":"normalizePlatformQuotasMap 填充缺失的平台为全 null 三档","status":"passed","title":"填充缺失的平台为全 null 三档","duration":0.1634999999999991,"failureMessages":[],"meta":{}},{"ancestorTitles":["normalizePlatformQuotasMap"],"fullName":"normalizePlatformQuotasMap 无参数时返回全 5 平台全 null","status":"passed","title":"无参数时返回全 5 平台全 null","duration":0.5579000000000178,"failureMessages":[],"meta":{}},{"ancestorTitles":["normalizePlatformQuotasMap"],"fullName":"normalizePlatformQuotasMap 非 number 类型的值归一化为 null","status":"passed","title":"非 number 类型的值归一化为 null","duration":0.070699999999988,"failureMessages":[],"meta":{}},{"ancestorTitles":["sanitizePlatformQuotasMap"],"fullName":"sanitizePlatformQuotasMap 保留合法的正数和零值","status":"passed","title":"保留合法的正数和零值","duration":0.0887000000000171,"failureMessages":[],"meta":{}},{"ancestorTitles":["sanitizePlatformQuotasMap"],"fullName":"sanitizePlatformQuotasMap 空字符串(v-model.number 空输入)清洗为 null","status":"passed","title":"空字符串(v-model.number 空输入)清洗为 null","duration":0.06579999999996744,"failureMessages":[],"meta":{}},{"ancestorTitles":["sanitizePlatformQuotasMap"],"fullName":"sanitizePlatformQuotasMap 负数清洗为 null","status":"passed","title":"负数清洗为 null","duration":0.054700000000025284,"failureMessages":[],"meta":{}},{"ancestorTitles":["sanitizePlatformQuotasMap"],"fullName":"sanitizePlatformQuotasMap NaN/Infinity 清洗为 null","status":"passed","title":"NaN/Infinity 清洗为 null","duration":0.06069999999999709,"failureMessages":[],"meta":{}},{"ancestorTitles":["sanitizePlatformQuotasMap"],"fullName":"sanitizePlatformQuotasMap 缺失平台填充为全 null","status":"passed","title":"缺失平台填充为全 null","duration":0.1795999999999367,"failureMessages":[],"meta":{}}],"startTime":1789442774868,"endTime":1789442774872.1797,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/api/__tests__/settings.authSourceDefaults.spec.ts"},{"assertionResults":[{"ancestorTitles":["admin settings payment visible method helpers"],"fullName":"admin settings payment visible method helpers normalizes aliases into canonical source keys per visible method","status":"passed","title":"normalizes aliases into canonical source keys per visible method","duration":0.7052000000001044,"failureMessages":[],"meta":{}},{"ancestorTitles":["admin settings payment visible method helpers"],"fullName":"admin settings payment visible method helpers rejects unknown or cross-method source values","status":"passed","title":"rejects unknown or cross-method source values","duration":0.1350999999999658,"failureMessages":[],"meta":{}},{"ancestorTitles":["admin settings payment visible method helpers"],"fullName":"admin settings payment visible method helpers exposes method-scoped source options instead of arbitrary strings","status":"passed","title":"exposes method-scoped source options instead of arbitrary strings","duration":0.5268000000000939,"failureMessages":[],"meta":{}}],"startTime":1789442808531,"endTime":1789442808532.5269,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/api/__tests__/settings.paymentVisibleMethods.spec.ts"},{"assertionResults":[{"ancestorTitles":["admin settings wechat connect helpers"],"fullName":"admin settings wechat connect helpers normalizes legacy or noisy mode values to the backend contract","status":"passed","title":"normalizes legacy or noisy mode values to the backend contract","duration":0.7176000000000613,"failureMessages":[],"meta":{}},{"ancestorTitles":["admin settings wechat connect helpers"],"fullName":"admin settings wechat connect helpers maps each mode to the backend default scopes","status":"passed","title":"maps each mode to the backend default scopes","duration":0.1309999999999718,"failureMessages":[],"meta":{}}],"startTime":1789442823282,"endTime":1789442823282.7175,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/api/__tests__/settings.wechatConnect.spec.ts"},{"assertionResults":[{"ancestorTitles":["refreshAuthTokens"],"fullName":"refreshAuthTokens shares one refresh request between concurrent callers in the same document","status":"passed","title":"shares one refresh request between concurrent callers in the same document","duration":4.444000000000074,"failureMessages":[],"meta":{}},{"ancestorTitles":["refreshAuthTokens"],"fullName":"refreshAuthTokens adopts tokens refreshed by another tab after acquiring the Web Lock","status":"passed","title":"adopts tokens refreshed by another tab after acquiring the Web Lock","duration":1.9453000000000884,"failureMessages":[],"meta":{}},{"ancestorTitles":["refreshAuthTokens"],"fullName":"refreshAuthTokens does not mistake boundary timer jitter for a completed peer refresh","status":"passed","title":"does not mistake boundary timer jitter for a completed peer refresh","duration":2.100999999999999,"failureMessages":[],"meta":{}},{"ancestorTitles":["refreshAuthTokens"],"fullName":"refreshAuthTokens recovers when a peer publishes the rotated token just after this request fails","status":"passed","title":"recovers when a peer publishes the rotated token just after this request fails","duration":33.68770000000006,"failureMessages":[],"meta":{}},{"ancestorTitles":["refreshAuthTokens"],"fullName":"refreshAuthTokens waits for a slow peer after losing a refresh-token race without Web Locks","status":"passed","title":"waits for a slow peer after losing a refresh-token race without Web Locks","duration":7.095100000000002,"failureMessages":[],"meta":{}},{"ancestorTitles":["refreshAuthTokens"],"fullName":"refreshAuthTokens does not adopt a token from a different signed-in user","status":"passed","title":"does not adopt a token from a different signed-in user","duration":5.447299999999927,"failureMessages":[],"meta":{}},{"ancestorTitles":["refreshAuthTokens"],"fullName":"refreshAuthTokens does not restore a session that was logged out while refresh was in flight","status":"passed","title":"does not restore a session that was logged out while refresh was in flight","duration":4.437000000000012,"failureMessages":[],"meta":{}}],"startTime":1789442781441,"endTime":1789442781500.437,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/api/__tests__/tokenRefresh.spec.ts"},{"assertionResults":[{"ancestorTitles":["user api oauth binding urls"],"fullName":"user api oauth binding urls builds third-party bind urls against the bind start endpoint","status":"passed","title":"builds third-party bind urls against the bind start endpoint","duration":65.06010000000003,"failureMessages":[],"meta":{}}],"startTime":1789442820630,"endTime":1789442820695.06,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/api/__tests__/user.spec.ts"},{"assertionResults":[{"ancestorTitles":["platform option catalogs"],"fullName":"platform option catalogs exposes every concrete account platform","status":"passed","title":"exposes every concrete account platform","duration":0.8664999999999736,"failureMessages":[],"meta":{}},{"ancestorTitles":["platform option catalogs"],"fullName":"platform option catalogs adds composite for group-backed filters","status":"passed","title":"adds composite for group-backed filters","duration":0.14760000000001128,"failureMessages":[],"meta":{}}],"startTime":1789442824474,"endTime":1789442824475.1477,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/constants/__tests__/platforms.spec.ts"},{"assertionResults":[{"ancestorTitles":["AliyunCaptchaWidget"],"fullName":"AliyunCaptchaWidget 渲染可见验证按钮并以 popup 模式初始化,全局配置就位","status":"passed","title":"渲染可见验证按钮并以 popup 模式初始化,全局配置就位","duration":15.135400000000004,"failureMessages":[],"meta":{}},{"ancestorTitles":["AliyunCaptchaWidget"],"fullName":"AliyunCaptchaWidget 用户点击按钮进入验证中,验证完成后 emit verify 并置已通过","status":"passed","title":"用户点击按钮进入验证中,验证完成后 emit verify 并置已通过","duration":4.610199999999963,"failureMessages":[],"meta":{}},{"ancestorTitles":["AliyunCaptchaWidget"],"fullName":"AliyunCaptchaWidget verify() 在已预验证时直接复用缓存的 captchaVerifyParam","status":"passed","title":"verify() 在已预验证时直接复用缓存的 captchaVerifyParam","duration":3.0938999999999623,"failureMessages":[],"meta":{}},{"ancestorTitles":["AliyunCaptchaWidget"],"fullName":"AliyunCaptchaWidget verify() 在未预验证时触发弹窗流程并等待结果","status":"passed","title":"verify() 在未预验证时触发弹窗流程并等待结果","duration":2.4081999999999653,"failureMessages":[],"meta":{}},{"ancestorTitles":["AliyunCaptchaWidget"],"fullName":"AliyunCaptchaWidget 弹窗未出现前会按 tick 重试触发按钮(SDK 异步绑定兜底)","status":"passed","title":"弹窗未出现前会按 tick 重试触发按钮(SDK 异步绑定兜底)","duration":4.646100000000047,"failureMessages":[],"meta":{}},{"ancestorTitles":["AliyunCaptchaWidget"],"fullName":"AliyunCaptchaWidget 弹窗出现后被用户关闭时 resolve null 并回到未验证态","status":"passed","title":"弹窗出现后被用户关闭时 resolve null 并回到未验证态","duration":20.393400000000042,"failureMessages":[],"meta":{}},{"ancestorTitles":["AliyunCaptchaWidget"],"fullName":"AliyunCaptchaWidget reset() 清空缓存并取消进行中的验证","status":"passed","title":"reset() 清空缓存并取消进行中的验证","duration":2.0505000000000564,"failureMessages":[],"meta":{}}],"startTime":1789442785692,"endTime":1789442785745.0505,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/components/__tests__/AliyunCaptchaWidget.spec.ts"},{"assertionResults":[{"ancestorTitles":["ApiKey 创建流程"],"fullName":"ApiKey 创建流程 创建 API Key 调用 API 并显示结果","status":"passed","title":"创建 API Key 调用 API 并显示结果","duration":27.241700000000037,"failureMessages":[],"meta":{}},{"ancestorTitles":["ApiKey 创建流程"],"fullName":"ApiKey 创建流程 选择分组后正确传参","status":"passed","title":"选择分组后正确传参","duration":4.8962999999999965,"failureMessages":[],"meta":{}},{"ancestorTitles":["ApiKey 创建流程"],"fullName":"ApiKey 创建流程 创建失败时显示错误","status":"passed","title":"创建失败时显示错误","duration":2.38169999999991,"failureMessages":[],"meta":{}},{"ancestorTitles":["ApiKey 创建流程"],"fullName":"ApiKey 创建流程 名称为空时不提交","status":"passed","title":"名称为空时不提交","duration":1.3643999999999323,"failureMessages":[],"meta":{}},{"ancestorTitles":["ApiKey 创建流程"],"fullName":"ApiKey 创建流程 创建过程中按钮被禁用","status":"passed","title":"创建过程中按钮被禁用","duration":2.565800000000081,"failureMessages":[],"meta":{}}],"startTime":1789442789239,"endTime":1789442789277.566,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/components/__tests__/ApiKeyCreate.spec.ts"},{"assertionResults":[{"ancestorTitles":["Dashboard 数据加载"],"fullName":"Dashboard 数据加载 挂载后自动加载数据","status":"passed","title":"挂载后自动加载数据","duration":21.837499999999977,"failureMessages":[],"meta":{}},{"ancestorTitles":["Dashboard 数据加载"],"fullName":"Dashboard 数据加载 加载中显示 loading 状态","status":"passed","title":"加载中显示 loading 状态","duration":2.515100000000075,"failureMessages":[],"meta":{}},{"ancestorTitles":["Dashboard 数据加载"],"fullName":"Dashboard 数据加载 加载失败时显示错误信息","status":"passed","title":"加载失败时显示错误信息","duration":1.6340000000000146,"failureMessages":[],"meta":{}},{"ancestorTitles":["Dashboard 数据加载"],"fullName":"Dashboard 数据加载 点击刷新按钮重新加载数据","status":"passed","title":"点击刷新按钮重新加载数据","duration":5.794800000000009,"failureMessages":[],"meta":{}},{"ancestorTitles":["Dashboard 数据加载"],"fullName":"Dashboard 数据加载 数据为空时不显示统计信息","status":"passed","title":"数据为空时不显示统计信息","duration":1.6521000000000186,"failureMessages":[],"meta":{}}],"startTime":1789442789874,"endTime":1789442789906.652,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/components/__tests__/Dashboard.spec.ts"},{"assertionResults":[{"ancestorTitles":["LoginForm 核心逻辑"],"fullName":"LoginForm 核心逻辑 成功登录后跳转到 dashboard","status":"passed","title":"成功登录后跳转到 dashboard","duration":26.627000000000066,"failureMessages":[],"meta":{}},{"ancestorTitles":["LoginForm 核心逻辑"],"fullName":"LoginForm 核心逻辑 登录失败时显示错误信息","status":"passed","title":"登录失败时显示错误信息","duration":6.036200000000008,"failureMessages":[],"meta":{}},{"ancestorTitles":["LoginForm 核心逻辑"],"fullName":"LoginForm 核心逻辑 空表单提交显示验证错误","status":"passed","title":"空表单提交显示验证错误","duration":1.8122999999999365,"failureMessages":[],"meta":{}},{"ancestorTitles":["LoginForm 核心逻辑"],"fullName":"LoginForm 核心逻辑 需要 2FA 时不跳转","status":"passed","title":"需要 2FA 时不跳转","duration":1.94399999999996,"failureMessages":[],"meta":{}},{"ancestorTitles":["LoginForm 核心逻辑"],"fullName":"LoginForm 核心逻辑 提交过程中按钮被禁用","status":"passed","title":"提交过程中按钮被禁用","duration":2.094699999999989,"failureMessages":[],"meta":{}}],"startTime":1789442787821,"endTime":1789442787859.0947,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/components/__tests__/LoginForm.spec.ts"},{"assertionResults":[{"ancestorTitles":["TencentCaptchaGate"],"fullName":"TencentCaptchaGate does not render a visible verification button","status":"passed","title":"does not render a visible verification button","duration":13.644199999999955,"failureMessages":[],"meta":{}},{"ancestorTitles":["TencentCaptchaGate"],"fullName":"TencentCaptchaGate resolves proof after Tencent SDK success","status":"passed","title":"resolves proof after Tencent SDK success","duration":2.6556000000000495,"failureMessages":[],"meta":{}},{"ancestorTitles":["TencentCaptchaGate"],"fullName":"TencentCaptchaGate resolves null when the user closes the popup","status":"passed","title":"resolves null when the user closes the popup","duration":1.3007000000000062,"failureMessages":[],"meta":{}},{"ancestorTitles":["TencentCaptchaGate"],"fullName":"TencentCaptchaGate rejects SDK load failures and disaster-recovery tickets","status":"passed","title":"rejects SDK load failures and disaster-recovery tickets","duration":5.347300000000018,"failureMessages":[],"meta":{}},{"ancestorTitles":["TencentCaptchaGate"],"fullName":"TencentCaptchaGate reuses one pending promise for concurrent verify calls","status":"passed","title":"reuses one pending promise for concurrent verify calls","duration":2.3794000000000324,"failureMessages":[],"meta":{}},{"ancestorTitles":["TencentCaptchaGate"],"fullName":"TencentCaptchaGate passes a visible in-form container first for the international site","status":"passed","title":"passes a visible in-form container first for the international site","duration":6.935699999999997,"failureMessages":[],"meta":{}},{"ancestorTitles":["TencentCaptchaGate"],"fullName":"TencentCaptchaGate preloads and displays the international checkbox on mount","status":"passed","title":"preloads and displays the international checkbox on mount","duration":2.0129000000000588,"failureMessages":[],"meta":{}},{"ancestorTitles":["TencentCaptchaGate"],"fullName":"TencentCaptchaGate reuses a preloaded proof when the SDK reports success","status":"passed","title":"reuses a preloaded proof when the SDK reports success","duration":2.2643000000000484,"failureMessages":[],"meta":{}},{"ancestorTitles":["TencentCaptchaGate"],"fullName":"TencentCaptchaGate refreshes a preloaded proof before the provider ticket expires","status":"passed","title":"refreshes a preloaded proof before the provider ticket expires","duration":3.77150000000006,"failureMessages":[],"meta":{}},{"ancestorTitles":["TencentCaptchaGate"],"fullName":"TencentCaptchaGate keeps the three-argument form for the Chinese mainland site","status":"passed","title":"keeps the three-argument form for the Chinese mainland site","duration":1.186900000000037,"failureMessages":[],"meta":{}},{"ancestorTitles":["TencentCaptchaGate"],"fullName":"TencentCaptchaGate loads the international SDK script for the international site","status":"passed","title":"loads the international SDK script for the international site","duration":1.7521000000000413,"failureMessages":[],"meta":{}},{"ancestorTitles":["TencentCaptchaGate"],"fullName":"TencentCaptchaGate does not reuse a mainland global for the international site","status":"passed","title":"does not reuse a mainland global for the international site","duration":2.018299999999954,"failureMessages":[],"meta":{}},{"ancestorTitles":["TencentCaptchaGate"],"fullName":"TencentCaptchaGate does not inject a second SDK when the region changes in one page","status":"passed","title":"does not inject a second SDK when the region changes in one page","duration":1.4987999999999602,"failureMessages":[],"meta":{}},{"ancestorTitles":["TencentCaptchaGate"],"fullName":"TencentCaptchaGate settles a pending verification when reset","status":"passed","title":"settles a pending verification when reset","duration":1.0575000000000045,"failureMessages":[],"meta":{}},{"ancestorTitles":["TencentCaptchaGate"],"fullName":"TencentCaptchaGate reinitializes the international checkbox after reset","status":"passed","title":"reinitializes the international checkbox after reset","duration":2.927400000000034,"failureMessages":[],"meta":{}}],"startTime":1789442772023,"endTime":1789442772073.9275,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/components/__tests__/TencentCaptchaGate.spec.ts"},{"assertionResults":[{"ancestorTitles":["TurnstileWidget"],"fullName":"TurnstileWidget shows a loading placeholder until the SDK initializes the widget","status":"passed","title":"shows a loading placeholder until the SDK initializes the widget","duration":19.985599999999977,"failureMessages":[],"meta":{}},{"ancestorTitles":["TurnstileWidget"],"fullName":"TurnstileWidget initializes an already loaded SDK and still forwards verification","status":"passed","title":"initializes an already loaded SDK and still forwards verification","duration":3.43629999999996,"failureMessages":[],"meta":{}},{"ancestorTitles":["TurnstileWidget"],"fullName":"TurnstileWidget ends loading and reports a script load failure","status":"passed","title":"ends loading and reports a script load failure","duration":2.2971999999999753,"failureMessages":[],"meta":{}},{"ancestorTitles":["TurnstileWidget"],"fullName":"TurnstileWidget does not show a placeholder or load the SDK without a site key","status":"passed","title":"does not show a placeholder or load the SDK without a site key","duration":0.7586000000000013,"failureMessages":[],"meta":{}}],"startTime":1789442801985,"endTime":1789442802011.7585,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/components/__tests__/TurnstileWidget.spec.ts"},{"assertionResults":[{"ancestorTitles":["usage ipGeo locale keys"],"fullName":"usage ipGeo locale keys contains zh labels for IP geolocation UI","status":"passed","title":"contains zh labels for IP geolocation UI","duration":0.6902000000000044,"failureMessages":[],"meta":{}},{"ancestorTitles":["usage ipGeo locale keys"],"fullName":"usage ipGeo locale keys contains en labels for IP geolocation UI","status":"passed","title":"contains en labels for IP geolocation UI","duration":0.1655999999999267,"failureMessages":[],"meta":{}}],"startTime":1789442821924,"endTime":1789442821925.1655,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/i18n/__tests__/ipGeoLocales.spec.ts"},{"assertionResults":[{"ancestorTitles":["locale key completeness"],"fullName":"locale key completeness keeps English and Chinese locale schemas identical","status":"passed","title":"keeps English and Chinese locale schemas identical","duration":5.689600000001519,"failureMessages":[],"meta":{}},{"ancestorTitles":["locale key completeness"],"fullName":"locale key completeness contains a non-empty message for every locale leaf","status":"passed","title":"contains a non-empty message for every locale leaf","duration":13.324499999998807,"failureMessages":[],"meta":{}},{"ancestorTitles":["locale key completeness"],"fullName":"locale key completeness contains every statically referenced production key","status":"passed","title":"contains every statically referenced production key","duration":2.788799999998446,"failureMessages":[],"meta":{}}],"startTime":1789442823704,"endTime":1789442823725.7888,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/i18n/__tests__/localeKeyCompleteness.spec.ts"},{"assertionResults":[{"ancestorTitles":["locale messages compile"],"fullName":"locale messages compile zh messages all compile without placeholder errors","status":"passed","title":"zh messages all compile without placeholder errors","duration":50.82859999999994,"failureMessages":[],"meta":{}},{"ancestorTitles":["locale messages compile"],"fullName":"locale messages compile en messages all compile without placeholder errors","status":"passed","title":"en messages all compile without placeholder errors","duration":52.61029999999994,"failureMessages":[],"meta":{}}],"startTime":1789442815527,"endTime":1789442815630.6104,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/i18n/__tests__/localesMessageCompile.spec.ts"},{"assertionResults":[{"ancestorTitles":["locale zh spread assembly"],"fullName":"locale zh spread assembly root modules have no overlapping top-level keys","status":"passed","title":"root modules have no overlapping top-level keys","duration":1.0421999999999798,"failureMessages":[],"meta":{}},{"ancestorTitles":["locale zh spread assembly"],"fullName":"locale zh spread assembly root modules do not shadow the explicit \"admin\" namespace","status":"passed","title":"root modules do not shadow the explicit \"admin\" namespace","duration":0.6515000000000555,"failureMessages":[],"meta":{}},{"ancestorTitles":["locale zh spread assembly"],"fullName":"locale zh spread assembly admin modules have no overlapping top-level keys","status":"passed","title":"admin modules have no overlapping top-level keys","duration":0.11110000000007858,"failureMessages":[],"meta":{}},{"ancestorTitles":["locale en spread assembly"],"fullName":"locale en spread assembly root modules have no overlapping top-level keys","status":"passed","title":"root modules have no overlapping top-level keys","duration":0.07740000000001146,"failureMessages":[],"meta":{}},{"ancestorTitles":["locale en spread assembly"],"fullName":"locale en spread assembly root modules do not shadow the explicit \"admin\" namespace","status":"passed","title":"root modules do not shadow the explicit \"admin\" namespace","duration":0.18100000000004002,"failureMessages":[],"meta":{}},{"ancestorTitles":["locale en spread assembly"],"fullName":"locale en spread assembly admin modules have no overlapping top-level keys","status":"passed","title":"admin modules have no overlapping top-level keys","duration":0.07100000000002638,"failureMessages":[],"meta":{}}],"startTime":1789442801354,"endTime":1789442801356.181,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/i18n/__tests__/localesNoKeyCollision.spec.ts"},{"assertionResults":[{"ancestorTitles":["OpenAI Fast/Flex policy locale keys"],"fullName":"OpenAI Fast/Flex policy locale keys exposes user scope copy at the runtime zh path","status":"passed","title":"exposes user scope copy at the runtime zh path","duration":1.039299999999912,"failureMessages":[],"meta":{}},{"ancestorTitles":["OpenAI Fast/Flex policy locale keys"],"fullName":"OpenAI Fast/Flex policy locale keys exposes user scope copy at the runtime en path","status":"passed","title":"exposes user scope copy at the runtime en path","duration":0.14859999999998763,"failureMessages":[],"meta":{}},{"ancestorTitles":["OpenAI Fast/Flex policy locale keys"],"fullName":"OpenAI Fast/Flex policy locale keys describes target and other-model actions without whitelist terminology","status":"passed","title":"describes target and other-model actions without whitelist terminology","duration":0.35359999999991487,"failureMessages":[],"meta":{}}],"startTime":1789442805347,"endTime":1789442805348.3535,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/i18n/__tests__/openaiFastPolicyLocales.spec.ts"},{"assertionResults":[{"ancestorTitles":["ops locale key completeness"],"fullName":"ops locale key completeness en locale has admin.ops.result","status":"passed","title":"en locale has admin.ops.result","duration":1.977700000000027,"failureMessages":[],"meta":{}},{"ancestorTitles":["ops locale key completeness"],"fullName":"ops locale key completeness en locale has admin.ops.timeRange.custom","status":"passed","title":"en locale has admin.ops.timeRange.custom","duration":0.7595000000000027,"failureMessages":[],"meta":{}},{"ancestorTitles":["ops locale key completeness"],"fullName":"ops locale key completeness en locale has admin.ops.customTimeRange.startTime","status":"passed","title":"en locale has admin.ops.customTimeRange.startTime","duration":1.0552999999999884,"failureMessages":[],"meta":{}},{"ancestorTitles":["ops locale key completeness"],"fullName":"ops locale key completeness en locale has admin.ops.customTimeRange.endTime","status":"passed","title":"en locale has admin.ops.customTimeRange.endTime","duration":1.0716999999999643,"failureMessages":[],"meta":{}},{"ancestorTitles":["ops locale key completeness"],"fullName":"ops locale key completeness en locale has admin.ops.errorDetail.upstreamStatus","status":"passed","title":"en locale has admin.ops.errorDetail.upstreamStatus","duration":1.147100000000023,"failureMessages":[],"meta":{}},{"ancestorTitles":["ops locale key completeness"],"fullName":"ops locale key completeness en locale has admin.ops.errorDetail.rootCause","status":"passed","title":"en locale has admin.ops.errorDetail.rootCause","duration":0.8102999999999838,"failureMessages":[],"meta":{}},{"ancestorTitles":["ops locale key completeness"],"fullName":"ops locale key completeness en locale has admin.ops.errorDetail.diagnosticPayloads","status":"passed","title":"en locale has admin.ops.errorDetail.diagnosticPayloads","duration":0.8344999999999345,"failureMessages":[],"meta":{}},{"ancestorTitles":["ops locale key completeness"],"fullName":"ops locale key completeness en locale has admin.ops.errorDetail.payloads.client","status":"passed","title":"en locale has admin.ops.errorDetail.payloads.client","duration":0.7912999999999784,"failureMessages":[],"meta":{}},{"ancestorTitles":["ops locale key completeness"],"fullName":"ops locale key completeness en locale has admin.ops.errorDetail.payloads.upstream_message","status":"passed","title":"en locale has admin.ops.errorDetail.payloads.upstream_message","duration":3.0278999999999314,"failureMessages":[],"meta":{}},{"ancestorTitles":["ops locale key completeness"],"fullName":"ops locale key completeness en locale has admin.ops.errorDetail.payloads.upstream_detail","status":"passed","title":"en locale has admin.ops.errorDetail.payloads.upstream_detail","duration":0.6159000000000106,"failureMessages":[],"meta":{}},{"ancestorTitles":["ops locale key completeness"],"fullName":"ops locale key completeness en locale has admin.ops.errorDetail.payloads.upstream_events","status":"passed","title":"en locale has admin.ops.errorDetail.payloads.upstream_events","duration":0.5792999999999893,"failureMessages":[],"meta":{}},{"ancestorTitles":["ops locale key completeness"],"fullName":"ops locale key completeness zh locale has admin.ops.result","status":"passed","title":"zh locale has admin.ops.result","duration":0.5721000000000913,"failureMessages":[],"meta":{}},{"ancestorTitles":["ops locale key completeness"],"fullName":"ops locale key completeness zh locale has admin.ops.timeRange.custom","status":"passed","title":"zh locale has admin.ops.timeRange.custom","duration":0.5622999999999365,"failureMessages":[],"meta":{}},{"ancestorTitles":["ops locale key completeness"],"fullName":"ops locale key completeness zh locale has admin.ops.customTimeRange.startTime","status":"passed","title":"zh locale has admin.ops.customTimeRange.startTime","duration":0.5179000000000542,"failureMessages":[],"meta":{}},{"ancestorTitles":["ops locale key completeness"],"fullName":"ops locale key completeness zh locale has admin.ops.customTimeRange.endTime","status":"passed","title":"zh locale has admin.ops.customTimeRange.endTime","duration":0.6236000000000104,"failureMessages":[],"meta":{}},{"ancestorTitles":["ops locale key completeness"],"fullName":"ops locale key completeness zh locale has admin.ops.errorDetail.upstreamStatus","status":"passed","title":"zh locale has admin.ops.errorDetail.upstreamStatus","duration":0.5692000000000235,"failureMessages":[],"meta":{}},{"ancestorTitles":["ops locale key completeness"],"fullName":"ops locale key completeness zh locale has admin.ops.errorDetail.rootCause","status":"passed","title":"zh locale has admin.ops.errorDetail.rootCause","duration":0.5567999999999529,"failureMessages":[],"meta":{}},{"ancestorTitles":["ops locale key completeness"],"fullName":"ops locale key completeness zh locale has admin.ops.errorDetail.diagnosticPayloads","status":"passed","title":"zh locale has admin.ops.errorDetail.diagnosticPayloads","duration":0.5324999999999136,"failureMessages":[],"meta":{}},{"ancestorTitles":["ops locale key completeness"],"fullName":"ops locale key completeness zh locale has admin.ops.errorDetail.payloads.client","status":"passed","title":"zh locale has admin.ops.errorDetail.payloads.client","duration":0.7453999999999041,"failureMessages":[],"meta":{}},{"ancestorTitles":["ops locale key completeness"],"fullName":"ops locale key completeness zh locale has admin.ops.errorDetail.payloads.upstream_message","status":"passed","title":"zh locale has admin.ops.errorDetail.payloads.upstream_message","duration":0.745900000000006,"failureMessages":[],"meta":{}},{"ancestorTitles":["ops locale key completeness"],"fullName":"ops locale key completeness zh locale has admin.ops.errorDetail.payloads.upstream_detail","status":"passed","title":"zh locale has admin.ops.errorDetail.payloads.upstream_detail","duration":0.7781999999999698,"failureMessages":[],"meta":{}},{"ancestorTitles":["ops locale key completeness"],"fullName":"ops locale key completeness zh locale has admin.ops.errorDetail.payloads.upstream_events","status":"passed","title":"zh locale has admin.ops.errorDetail.payloads.upstream_events","duration":4.0873000000000275,"failureMessages":[],"meta":{}},{"ancestorTitles":["groups locale key completeness"],"fullName":"groups locale key completeness en locale has admin.groups.failedToSave","status":"passed","title":"en locale has admin.groups.failedToSave","duration":0.6639999999999873,"failureMessages":[],"meta":{}},{"ancestorTitles":["groups locale key completeness"],"fullName":"groups locale key completeness en and zh locales both have admin.groups.webSearchPricing.title","status":"passed","title":"en and zh locales both have admin.groups.webSearchPricing.title","duration":1.120200000000068,"failureMessages":[],"meta":{}},{"ancestorTitles":["groups locale key completeness"],"fullName":"groups locale key completeness en and zh locales both have admin.groups.webSearchPricing.pricePerCall","status":"passed","title":"en and zh locales both have admin.groups.webSearchPricing.pricePerCall","duration":0.9706999999999653,"failureMessages":[],"meta":{}},{"ancestorTitles":["groups locale key completeness"],"fullName":"groups locale key completeness en and zh locales both have admin.groups.webSearchPricing.pricePerCallHint","status":"passed","title":"en and zh locales both have admin.groups.webSearchPricing.pricePerCallHint","duration":1.108600000000024,"failureMessages":[],"meta":{}},{"ancestorTitles":["groups locale key completeness"],"fullName":"groups locale key completeness en and zh locales both have admin.groups.webSearchPricing.finalPricePreview","status":"passed","title":"en and zh locales both have admin.groups.webSearchPricing.finalPricePreview","duration":1.0489999999999782,"failureMessages":[],"meta":{}}],"startTime":1789442810592,"endTime":1789442810621.049,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/i18n/__tests__/opsLocaleKeys.spec.ts"},{"assertionResults":[{"ancestorTitles":["risk control locale copy"],"fullName":"risk control locale copy describes worker runtime as audit and pre-block record processing","status":"passed","title":"describes worker runtime as audit and pre-block record processing","duration":0.7387999999999693,"failureMessages":[],"meta":{}},{"ancestorTitles":["risk control locale copy"],"fullName":"risk control locale copy keeps pre-block audit key summary aware of async worker load","status":"passed","title":"keeps pre-block audit key summary aware of async worker load","duration":0.11419999999998254,"failureMessages":[],"meta":{}},{"ancestorTitles":["risk control locale copy"],"fullName":"risk control locale copy does not describe pre-block audit key polling as bypassing the worker pool","status":"passed","title":"does not describe pre-block audit key polling as bypassing the worker pool","duration":0.16909999999995762,"failureMessages":[],"meta":{}}],"startTime":1789442818366,"endTime":1789442818367.1692,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/i18n/__tests__/riskControlLocales.spec.ts"},{"assertionResults":[{"ancestorTitles":["usage service tier locale keys"],"fullName":"usage service tier locale keys contains zh labels for service tier tooltip","status":"passed","title":"contains zh labels for service tier tooltip","duration":0.6784000000000106,"failureMessages":[],"meta":{}},{"ancestorTitles":["usage service tier locale keys"],"fullName":"usage service tier locale keys contains en labels for service tier tooltip","status":"passed","title":"contains en labels for service tier tooltip","duration":0.147199999999998,"failureMessages":[],"meta":{}}],"startTime":1789442823482,"endTime":1789442823483.1472,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/i18n/__tests__/usageServiceTierLocales.spec.ts"},{"assertionResults":[{"ancestorTitles":["OpenAI WS mode locale descriptions"],"fullName":"OpenAI WS mode locale descriptions documents the global v2 router requirement for account WS modes","status":"passed","title":"documents the global v2 router requirement for account WS modes","duration":0.6625999999999976,"failureMessages":[],"meta":{}}],"startTime":1789442825240,"endTime":1789442825240.6626,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/i18n/__tests__/wsModeLocaleDesc.spec.ts"},{"assertionResults":[{"ancestorTitles":["ImportDataModal"],"fullName":"ImportDataModal 未选择文件时提示错误","status":"passed","title":"未选择文件时提示错误","duration":19.53320000000008,"failureMessages":[],"meta":{}},{"ancestorTitles":["ImportDataModal"],"fullName":"ImportDataModal 无效 JSON 时按文件名提示解析失败","status":"passed","title":"无效 JSON 时按文件名提示解析失败","duration":5.624400000000037,"failureMessages":[],"meta":{}},{"ancestorTitles":["ImportDataModal"],"fullName":"ImportDataModal 不是导出数据的 JSON 按文件名拒绝","status":"passed","title":"不是导出数据的 JSON 按文件名拒绝","duration":4.467099999999959,"failureMessages":[],"meta":{}},{"ancestorTitles":["ImportDataModal"],"fullName":"ImportDataModal 无有效 JSON 的选择不清空已有选择","status":"passed","title":"无有效 JSON 的选择不清空已有选择","duration":4.567900000000009,"failureMessages":[],"meta":{}},{"ancestorTitles":["ImportDataModal"],"fullName":"ImportDataModal merges multiple selected JSON files before importing","status":"passed","title":"merges multiple selected JSON files before importing","duration":3.074100000000044,"failureMessages":[],"meta":{}},{"ancestorTitles":["ImportDataModal"],"fullName":"ImportDataModal 部分成功时关闭弹窗仍通知父组件刷新","status":"passed","title":"部分成功时关闭弹窗仍通知父组件刷新","duration":3.7953999999999724,"failureMessages":[],"meta":{}}],"startTime":1789442785561,"endTime":1789442785601.7954,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/__tests__/integration/data-import.spec.ts"},{"assertionResults":[{"ancestorTitles":["Navigation Integration Tests","完整页面导航流程"],"fullName":"Navigation Integration Tests 完整页面导航流程 导航时应该触发加载状态变化","status":"passed","title":"导航时应该触发加载状态变化","duration":16.02589999999998,"failureMessages":[],"meta":{}},{"ancestorTitles":["Navigation Integration Tests","完整页面导航流程"],"fullName":"Navigation Integration Tests 完整页面导航流程 导航到新页面应该正确渲染组件","status":"passed","title":"导航到新页面应该正确渲染组件","duration":2.0557000000000016,"failureMessages":[],"meta":{}},{"ancestorTitles":["Navigation Integration Tests","完整页面导航流程"],"fullName":"Navigation Integration Tests 完整页面导航流程 连续快速导航应该正确处理路由状态","status":"passed","title":"连续快速导航应该正确处理路由状态","duration":1.8192999999999984,"failureMessages":[],"meta":{}},{"ancestorTitles":["Navigation Integration Tests","路由预加载"],"fullName":"Navigation Integration Tests 路由预加载 导航后应该触发相关路由预加载","status":"passed","title":"导航后应该触发相关路由预加载","duration":2.404199999999946,"failureMessages":[],"meta":{}},{"ancestorTitles":["Navigation Integration Tests","路由预加载"],"fullName":"Navigation Integration Tests 路由预加载 已预加载的路由不应重复预加载","status":"passed","title":"已预加载的路由不应重复预加载","duration":210.59820000000002,"failureMessages":[],"meta":{}},{"ancestorTitles":["Navigation Integration Tests","路由预加载"],"fullName":"Navigation Integration Tests 路由预加载 路由变化时应取消之前的预加载任务","status":"passed","title":"路由变化时应取消之前的预加载任务","duration":1.345299999999952,"failureMessages":[],"meta":{}},{"ancestorTitles":["Navigation Integration Tests","Chunk 加载错误恢复"],"fullName":"Navigation Integration Tests Chunk 加载错误恢复 chunk 加载失败应该被正确捕获","status":"passed","title":"chunk 加载失败应该被正确捕获","duration":1.4402000000000044,"failureMessages":[],"meta":{}},{"ancestorTitles":["Navigation Integration Tests","Chunk 加载错误恢复"],"fullName":"Navigation Integration Tests Chunk 加载错误恢复 chunk 加载错误应该包含正确的错误信息","status":"passed","title":"chunk 加载错误应该包含正确的错误信息","duration":2.08400000000006,"failureMessages":[],"meta":{}},{"ancestorTitles":["Navigation Integration Tests","导航状态管理"],"fullName":"Navigation Integration Tests 导航状态管理 导航开始时 isLoading 应该变为 true","status":"passed","title":"导航开始时 isLoading 应该变为 true","duration":1.4428000000000338,"failureMessages":[],"meta":{}},{"ancestorTitles":["Navigation Integration Tests","导航状态管理"],"fullName":"Navigation Integration Tests 导航状态管理 导航取消时应该正确重置状态","status":"passed","title":"导航取消时应该正确重置状态","duration":1.2509999999999764,"failureMessages":[],"meta":{}}],"startTime":1789442773869,"endTime":1789442774109.251,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/__tests__/integration/navigation.spec.ts"},{"assertionResults":[{"ancestorTitles":["Proxy ImportDataModal"],"fullName":"Proxy ImportDataModal 未选择文件时提示错误","status":"passed","title":"未选择文件时提示错误","duration":19.70259999999996,"failureMessages":[],"meta":{}},{"ancestorTitles":["Proxy ImportDataModal"],"fullName":"Proxy ImportDataModal 无效 JSON 时提示解析失败","status":"passed","title":"无效 JSON 时提示解析失败","duration":4.8922000000000025,"failureMessages":[],"meta":{}}],"startTime":1789442812280,"endTime":1789442812304.892,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/__tests__/integration/proxy-data-import.spec.ts"},{"assertionResults":[{"ancestorTitles":["usage reasoning effort page display"],"fullName":"usage reasoning effort page display user usage page only shows the requested reasoning effort","status":"passed","title":"user usage page only shows the requested reasoning effort","duration":138.3037999999999,"failureMessages":[],"meta":{}},{"ancestorTitles":["usage reasoning effort page display"],"fullName":"usage reasoning effort page display admin usage page shows requested and mapped effort after the column is enabled","status":"passed","title":"admin usage page shows requested and mapped effort after the column is enabled","duration":62.51170000000002,"failureMessages":[],"meta":{}},{"ancestorTitles":["usage reasoning effort page display"],"fullName":"usage reasoning effort page display admin usage page shows a single value when reasoning effort was not mapped","status":"passed","title":"admin usage page shows a single value when reasoning effort was not mapped","duration":47.10069999999996,"failureMessages":[],"meta":{}}],"startTime":1789442776312,"endTime":1789442776560.1006,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/__tests__/integration/usage-reasoning-effort.spec.ts"},{"assertionResults":[{"ancestorTitles":["useAntigravityOAuth.buildCredentials"],"fullName":"useAntigravityOAuth.buildCredentials falls back to the submitted refresh token when the response omits it","status":"passed","title":"falls back to the submitted refresh token when the response omits it","duration":0.8392999999999802,"failureMessages":[],"meta":{}},{"ancestorTitles":["useAntigravityOAuth.buildCredentials"],"fullName":"useAntigravityOAuth.buildCredentials prefers a new refresh token returned by the response","status":"passed","title":"prefers a new refresh token returned by the response","duration":0.1593000000000302,"failureMessages":[],"meta":{}},{"ancestorTitles":["Antigravity subscription metadata"],"fullName":"Antigravity subscription metadata preserves the upstream pro plan when saving credentials","status":"passed","title":"preserves the upstream pro plan when saving credentials","duration":0.11760000000003856,"failureMessages":[],"meta":{}},{"ancestorTitles":["Antigravity subscription metadata"],"fullName":"Antigravity subscription metadata preserves the upstream ultra plan when saving credentials","status":"passed","title":"preserves the upstream ultra plan when saving credentials","duration":0.08589999999992415,"failureMessages":[],"meta":{}},{"ancestorTitles":["Antigravity subscription metadata"],"fullName":"Antigravity subscription metadata preserves the upstream free plan when saving credentials","status":"passed","title":"preserves the upstream free plan when saving credentials","duration":0.07519999999999527,"failureMessages":[],"meta":{}},{"ancestorTitles":["Antigravity subscription metadata"],"fullName":"Antigravity subscription metadata does not invent a plan when subscription discovery is unavailable","status":"passed","title":"does not invent a plan when subscription discovery is unavailable","duration":0.3806999999999334,"failureMessages":[],"meta":{}}],"startTime":1789442811205,"endTime":1789442811207.3806,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/composables/__tests__/useAntigravityOAuth.spec.ts"},{"assertionResults":[{"ancestorTitles":["useClipboard"],"fullName":"useClipboard 复制成功后 copied 变为 true","status":"passed","title":"复制成功后 copied 变为 true","duration":2.0528000000000475,"failureMessages":[],"meta":{}},{"ancestorTitles":["useClipboard"],"fullName":"useClipboard copied 在 2 秒后自动恢复为 false","status":"passed","title":"copied 在 2 秒后自动恢复为 false","duration":0.5663000000000693,"failureMessages":[],"meta":{}},{"ancestorTitles":["useClipboard"],"fullName":"useClipboard 复制成功时调用 showSuccess","status":"passed","title":"复制成功时调用 showSuccess","duration":0.8909999999999627,"failureMessages":[],"meta":{}},{"ancestorTitles":["useClipboard"],"fullName":"useClipboard 无自定义消息时使用 i18n 默认消息","status":"passed","title":"无自定义消息时使用 i18n 默认消息","duration":0.3309000000000424,"failureMessages":[],"meta":{}},{"ancestorTitles":["useClipboard"],"fullName":"useClipboard 空文本返回 false 且不复制","status":"passed","title":"空文本返回 false 且不复制","duration":0.2989000000000033,"failureMessages":[],"meta":{}},{"ancestorTitles":["useClipboard"],"fullName":"useClipboard Clipboard API 失败时降级到 fallback","status":"passed","title":"Clipboard API 失败时降级到 fallback","duration":3.9021000000000186,"failureMessages":[],"meta":{}},{"ancestorTitles":["useClipboard"],"fullName":"useClipboard 非安全上下文使用 fallback","status":"passed","title":"非安全上下文使用 fallback","duration":1.003500000000031,"failureMessages":[],"meta":{}},{"ancestorTitles":["useClipboard"],"fullName":"useClipboard 所有复制方式均失败时调用 showError","status":"passed","title":"所有复制方式均失败时调用 showError","duration":0.7368999999999915,"failureMessages":[],"meta":{}}],"startTime":1789442793607,"endTime":1789442793616.7368,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/composables/__tests__/useClipboard.spec.ts"},{"assertionResults":[{"ancestorTitles":["useForm"],"fullName":"useForm submit 期间 loading 为 true,完成后为 false","status":"passed","title":"submit 期间 loading 为 true,完成后为 false","duration":2.270999999999958,"failureMessages":[],"meta":{}},{"ancestorTitles":["useForm"],"fullName":"useForm submit 成功时显示成功消息","status":"passed","title":"submit 成功时显示成功消息","duration":1.2170999999999594,"failureMessages":[],"meta":{}},{"ancestorTitles":["useForm"],"fullName":"useForm submit 成功但无 successMsg 时不调用 showSuccess","status":"passed","title":"submit 成功但无 successMsg 时不调用 showSuccess","duration":0.49069999999994707,"failureMessages":[],"meta":{}},{"ancestorTitles":["useForm"],"fullName":"useForm submit 失败时显示错误消息并抛出错误","status":"passed","title":"submit 失败时显示错误消息并抛出错误","duration":1.0466000000000122,"failureMessages":[],"meta":{}},{"ancestorTitles":["useForm"],"fullName":"useForm submit 失败时使用自定义 errorMsg","status":"passed","title":"submit 失败时使用自定义 errorMsg","duration":0.5951000000000022,"failureMessages":[],"meta":{}},{"ancestorTitles":["useForm"],"fullName":"useForm loading 中不会重复提交","status":"passed","title":"loading 中不会重复提交","duration":0.35569999999995616,"failureMessages":[],"meta":{}},{"ancestorTitles":["useForm"],"fullName":"useForm 传递 form 数据到 submitFn","status":"passed","title":"传递 form 数据到 submitFn","duration":0.5154999999999745,"failureMessages":[],"meta":{}}],"startTime":1789442796354,"endTime":1789442796360.5154,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/composables/__tests__/useForm.spec.ts"},{"assertionResults":[{"ancestorTitles":["useGrokOAuth.exchangeAuthCode"],"fullName":"useGrokOAuth.exchangeAuthCode shows a state mismatch recovery hint from structured backend errors","status":"passed","title":"shows a state mismatch recovery hint from structured backend errors","duration":1.256399999999985,"failureMessages":[],"meta":{}},{"ancestorTitles":["useGrokOAuth.buildCredentials"],"fullName":"useGrokOAuth.buildCredentials builds OAuth credentials without forcing base_url or leaking sso/password","status":"passed","title":"builds OAuth credentials without forcing base_url or leaking sso/password","duration":0.6524999999999181,"failureMessages":[],"meta":{}}],"startTime":1789442804054,"endTime":1789442804056.6526,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/composables/__tests__/useGrokOAuth.spec.ts"},{"assertionResults":[{"ancestorTitles":["useKeyedDebouncedSearch"],"fullName":"useKeyedDebouncedSearch 为不同 key 独立防抖触发搜索","status":"passed","title":"为不同 key 独立防抖触发搜索","duration":2.948600000000056,"failureMessages":[],"meta":{}},{"ancestorTitles":["useKeyedDebouncedSearch"],"fullName":"useKeyedDebouncedSearch 同 key 新请求会取消旧请求并忽略过期响应","status":"passed","title":"同 key 新请求会取消旧请求并忽略过期响应","duration":0.7314999999999827,"failureMessages":[],"meta":{}},{"ancestorTitles":["useKeyedDebouncedSearch"],"fullName":"useKeyedDebouncedSearch clearKey 会取消未执行任务","status":"passed","title":"clearKey 会取消未执行任务","duration":0.33740000000000236,"failureMessages":[],"meta":{}}],"startTime":1789442804209,"endTime":1789442804213.3374,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/composables/__tests__/useKeyedDebouncedSearch.spec.ts"},{"assertionResults":[{"ancestorTitles":["useModelWhitelist"],"fullName":"useModelWhitelist openai 模型列表包含 GPT-5.4 官方快照","status":"passed","title":"openai 模型列表包含 GPT-5.4 官方快照","duration":1.2916999999999916,"failureMessages":[],"meta":{}},{"ancestorTitles":["useModelWhitelist"],"fullName":"useModelWhitelist openai 预设映射包含 GPT-6 别名和 Astra","status":"passed","title":"openai 预设映射包含 GPT-6 别名和 Astra","duration":0.6148999999999205,"failureMessages":[],"meta":{}},{"ancestorTitles":["useModelWhitelist"],"fullName":"useModelWhitelist openai 模型列表不再暴露已下线的 ChatGPT 登录 Codex 模型","status":"passed","title":"openai 模型列表不再暴露已下线的 ChatGPT 登录 Codex 模型","duration":0.4349000000000842,"failureMessages":[],"meta":{}},{"ancestorTitles":["useModelWhitelist"],"fullName":"useModelWhitelist antigravity 模型列表包含图片模型兼容项","status":"passed","title":"antigravity 模型列表包含图片模型兼容项","duration":0.14589999999998327,"failureMessages":[],"meta":{}},{"ancestorTitles":["useModelWhitelist"],"fullName":"useModelWhitelist Claude 模型列表包含新发布的 Claude 模型","status":"passed","title":"Claude 模型列表包含新发布的 Claude 模型","duration":0.21139999999991232,"failureMessages":[],"meta":{}},{"ancestorTitles":["useModelWhitelist"],"fullName":"useModelWhitelist xAI 模型列表包含 Grok 4.5 官方模型和别名","status":"passed","title":"xAI 模型列表包含 Grok 4.5 官方模型和别名","duration":0.20580000000006748,"failureMessages":[],"meta":{}},{"ancestorTitles":["useModelWhitelist"],"fullName":"useModelWhitelist combined 模式支持 Grok 4.5 官方别名映射","status":"passed","title":"combined 模式支持 Grok 4.5 官方别名映射","duration":0.3789000000000442,"failureMessages":[],"meta":{}},{"ancestorTitles":["useModelWhitelist"],"fullName":"useModelWhitelist grok 模型列表包含 Composer 默认项和兼容别名","status":"passed","title":"grok 模型列表包含 Composer 默认项和兼容别名","duration":0.13959999999997308,"failureMessages":[],"meta":{}},{"ancestorTitles":["useModelWhitelist"],"fullName":"useModelWhitelist gemini 模型列表包含原生生图模型","status":"passed","title":"gemini 模型列表包含原生生图模型","duration":0.1772999999999456,"failureMessages":[],"meta":{}},{"ancestorTitles":["useModelWhitelist"],"fullName":"useModelWhitelist antigravity 模型列表会把新的 Gemini 图片模型排在前面","status":"passed","title":"antigravity 模型列表会把新的 Gemini 图片模型排在前面","duration":0.08550000000002456,"failureMessages":[],"meta":{}},{"ancestorTitles":["useModelWhitelist"],"fullName":"useModelWhitelist antigravity 模型列表包含 Gemini 3.1 Pro 通用别名","status":"passed","title":"antigravity 模型列表包含 Gemini 3.1 Pro 通用别名","duration":0.06900000000007367,"failureMessages":[],"meta":{}},{"ancestorTitles":["useModelWhitelist"],"fullName":"useModelWhitelist whitelist 模式会忽略通配符条目","status":"passed","title":"whitelist 模式会忽略通配符条目","duration":0.07429999999999382,"failureMessages":[],"meta":{}},{"ancestorTitles":["useModelWhitelist"],"fullName":"useModelWhitelist whitelist 模式会保留 GPT-5.4 官方快照的精确映射","status":"passed","title":"whitelist 模式会保留 GPT-5.4 官方快照的精确映射","duration":0.06750000000010914,"failureMessages":[],"meta":{}},{"ancestorTitles":["useModelWhitelist"],"fullName":"useModelWhitelist whitelist keeps GPT-5.4 mini exact mappings","status":"passed","title":"whitelist keeps GPT-5.4 mini exact mappings","duration":0.06180000000006203,"failureMessages":[],"meta":{}},{"ancestorTitles":["useModelWhitelist"],"fullName":"useModelWhitelist combined 模式会同时保留白名单身份映射和模型映射","status":"passed","title":"combined 模式会同时保留白名单身份映射和模型映射","duration":0.07780000000002474,"failureMessages":[],"meta":{}},{"ancestorTitles":["useModelWhitelist"],"fullName":"useModelWhitelist splitModelMappingObject 会把身份映射还原成白名单,其余保留为映射","status":"passed","title":"splitModelMappingObject 会把身份映射还原成白名单,其余保留为映射","duration":0.130800000000022,"failureMessages":[],"meta":{}}],"startTime":1789442786557,"endTime":1789442786561.1309,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/composables/__tests__/useModelWhitelist.spec.ts"},{"assertionResults":[{"ancestorTitles":["useNavigationLoading","startNavigation"],"fullName":"useNavigationLoading startNavigation 导航开始时 isNavigating 应变为 true","status":"passed","title":"导航开始时 isNavigating 应变为 true","duration":1.7887999999999238,"failureMessages":[],"meta":{}},{"ancestorTitles":["useNavigationLoading","startNavigation"],"fullName":"useNavigationLoading startNavigation 导航开始后延迟显示加载指示器(防闪烁)","status":"passed","title":"导航开始后延迟显示加载指示器(防闪烁)","duration":0.6213999999999942,"failureMessages":[],"meta":{}},{"ancestorTitles":["useNavigationLoading","endNavigation"],"fullName":"useNavigationLoading endNavigation 导航结束时 isLoading 应变为 false","status":"passed","title":"导航结束时 isLoading 应变为 false","duration":0.32139999999992597,"failureMessages":[],"meta":{}},{"ancestorTitles":["useNavigationLoading","endNavigation"],"fullName":"useNavigationLoading endNavigation 导航结束时 isNavigating 应变为 false","status":"passed","title":"导航结束时 isNavigating 应变为 false","duration":0.2175999999999476,"failureMessages":[],"meta":{}},{"ancestorTitles":["useNavigationLoading","快速导航(< 100ms)防闪烁"],"fullName":"useNavigationLoading 快速导航(< 100ms)防闪烁 快速导航不应触发显示加载指示器","status":"passed","title":"快速导航不应触发显示加载指示器","duration":0.23090000000001965,"failureMessages":[],"meta":{}},{"ancestorTitles":["useNavigationLoading","cancelNavigation"],"fullName":"useNavigationLoading cancelNavigation 导航取消时应正确重置状态","status":"passed","title":"导航取消时应正确重置状态","duration":0.20310000000006312,"failureMessages":[],"meta":{}},{"ancestorTitles":["useNavigationLoading","getNavigationDuration"],"fullName":"useNavigationLoading getNavigationDuration 应该返回正确的导航持续时间","status":"passed","title":"应该返回正确的导航持续时间","duration":0.19420000000002346,"failureMessages":[],"meta":{}},{"ancestorTitles":["useNavigationLoading","getNavigationDuration"],"fullName":"useNavigationLoading getNavigationDuration 导航结束后应返回 null","status":"passed","title":"导航结束后应返回 null","duration":0.15670000000000073,"failureMessages":[],"meta":{}},{"ancestorTitles":["useNavigationLoading","resetState"],"fullName":"useNavigationLoading resetState 应该重置所有状态","status":"passed","title":"应该重置所有状态","duration":0.2542999999999438,"failureMessages":[],"meta":{}},{"ancestorTitles":["useNavigationLoading","连续导航场景"],"fullName":"useNavigationLoading 连续导航场景 连续快速导航应正确处理状态","status":"passed","title":"连续快速导航应正确处理状态","duration":0.26080000000001746,"failureMessages":[],"meta":{}},{"ancestorTitles":["useNavigationLoading","ANTI_FLICKER_DELAY 常量"],"fullName":"useNavigationLoading ANTI_FLICKER_DELAY 常量 应该为 100ms","status":"passed","title":"应该为 100ms","duration":0.1128999999999678,"failureMessages":[],"meta":{}}],"startTime":1789442789344,"endTime":1789442789348.2607,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/composables/__tests__/useNavigationLoading.spec.ts"},{"assertionResults":[{"ancestorTitles":["useOpenAIOAuth.buildCredentials"],"fullName":"useOpenAIOAuth.buildCredentials should keep client_id when token response contains it","status":"passed","title":"should keep client_id when token response contains it","duration":0.9564000000000306,"failureMessages":[],"meta":{}},{"ancestorTitles":["useOpenAIOAuth.buildCredentials"],"fullName":"useOpenAIOAuth.buildCredentials should keep legacy behavior when client_id is missing","status":"passed","title":"should keep legacy behavior when client_id is missing","duration":0.19800000000009277,"failureMessages":[],"meta":{}},{"ancestorTitles":["useOpenAIOAuth.buildCredentials"],"fullName":"useOpenAIOAuth.buildCredentials should keep ChatGPT subscription expiration from token response","status":"passed","title":"should keep ChatGPT subscription expiration from token response","duration":0.13229999999998654,"failureMessages":[],"meta":{}},{"ancestorTitles":["useOpenAIOAuth.exchangeAuthCode"],"fullName":"useOpenAIOAuth.exchangeAuthCode shows a clear proxy hint when code exchange fails without a proxy","status":"passed","title":"shows a clear proxy hint when code exchange fails without a proxy","duration":0.6354999999999791,"failureMessages":[],"meta":{}}],"startTime":1789442799275,"endTime":1789442799276.6355,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/composables/__tests__/useOpenAIOAuth.spec.ts"},{"assertionResults":[{"ancestorTitles":["usePersistedPageSize"],"fullName":"usePersistedPageSize uses the system table default instead of stale localStorage state","status":"passed","title":"uses the system table default instead of stale localStorage state","duration":0.875699999999938,"failureMessages":[],"meta":{}}],"startTime":1789442824659,"endTime":1789442824659.8757,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/composables/__tests__/usePersistedPageSize.spec.ts"},{"assertionResults":[{"ancestorTitles":["relay SDK endpoint"],"fullName":"relay SDK endpoint normalizes without duplicating v1 or losing a path prefix","status":"passed","title":"normalizes without duplicating v1 or losing a path prefix","duration":0.9470999999999776,"failureMessages":[],"meta":{}},{"ancestorTitles":["relay SDK endpoint"],"fullName":"relay SDK endpoint normalizes https://api.example without duplicating v1 or losing a path prefix","status":"passed","title":"normalizes https://api.example without duplicating v1 or losing a path prefix","duration":0.23259999999993397,"failureMessages":[],"meta":{}},{"ancestorTitles":["relay SDK endpoint"],"fullName":"relay SDK endpoint normalizes https://api.example/v1/ without duplicating v1 or losing a path prefix","status":"passed","title":"normalizes https://api.example/v1/ without duplicating v1 or losing a path prefix","duration":0.15589999999997417,"failureMessages":[],"meta":{}},{"ancestorTitles":["relay SDK endpoint"],"fullName":"relay SDK endpoint normalizes https://api.example/relay/v1/// without duplicating v1 or losing a path prefix","status":"passed","title":"normalizes https://api.example/relay/v1/// without duplicating v1 or losing a path prefix","duration":0.13649999999995543,"failureMessages":[],"meta":{}},{"ancestorTitles":["relay SDK endpoint"],"fullName":"relay SDK endpoint normalizes https://api.example/relay/?theme=dark#top without duplicating v1 or losing a path prefix","status":"passed","title":"normalizes https://api.example/relay/?theme=dark#top without duplicating v1 or losing a path prefix","duration":0.2785000000000082,"failureMessages":[],"meta":{}},{"ancestorTitles":["relay SDK endpoint"],"fullName":"relay SDK endpoint normalizes http://127.0.0.1:8080 without duplicating v1 or losing a path prefix","status":"passed","title":"normalizes http://127.0.0.1:8080 without duplicating v1 or losing a path prefix","duration":0.24239999999997508,"failureMessages":[],"meta":{}},{"ancestorTitles":["relay SDK endpoint"],"fullName":"relay SDK endpoint rejects an invalid or credential-bearing configuration: javascript:alert(1)","status":"passed","title":"rejects an invalid or credential-bearing configuration: javascript:alert(1)","duration":0.12409999999999854,"failureMessages":[],"meta":{}},{"ancestorTitles":["relay SDK endpoint"],"fullName":"relay SDK endpoint rejects an invalid or credential-bearing configuration: file:///etc/passwd","status":"passed","title":"rejects an invalid or credential-bearing configuration: file:///etc/passwd","duration":0.1552000000000362,"failureMessages":[],"meta":{}},{"ancestorTitles":["relay SDK endpoint"],"fullName":"relay SDK endpoint rejects an invalid or credential-bearing configuration: https://user:pass@api.example","status":"passed","title":"rejects an invalid or credential-bearing configuration: https://user:pass@api.example","duration":0.12810000000001764,"failureMessages":[],"meta":{}},{"ancestorTitles":["relay SDK endpoint"],"fullName":"relay SDK endpoint rejects an invalid or credential-bearing configuration: /relative","status":"passed","title":"rejects an invalid or credential-bearing configuration: /relative","duration":0.1170999999999367,"failureMessages":[],"meta":{}},{"ancestorTitles":["relay SDK endpoint"],"fullName":"relay SDK endpoint rejects an invalid or credential-bearing configuration: broken address","status":"passed","title":"rejects an invalid or credential-bearing configuration: broken address","duration":0.06600000000003092,"failureMessages":[],"meta":{}}],"startTime":1789442822018,"endTime":1789442822020.2424,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/composables/__tests__/useRelayEndpoint.spec.ts"},{"assertionResults":[{"ancestorTitles":["useRoutePrefetch","_isAdminRoute"],"fullName":"useRoutePrefetch _isAdminRoute 应该正确识别管理员路由","status":"passed","title":"应该正确识别管理员路由","duration":2.380100000000084,"failureMessages":[],"meta":{}},{"ancestorTitles":["useRoutePrefetch","_isAdminRoute"],"fullName":"useRoutePrefetch _isAdminRoute 应该正确识别非管理员路由","status":"passed","title":"应该正确识别非管理员路由","duration":0.3479000000002088,"failureMessages":[],"meta":{}},{"ancestorTitles":["useRoutePrefetch","_getPrefetchConfig"],"fullName":"useRoutePrefetch _getPrefetchConfig 管理员 dashboard 应该返回正确的预加载配置","status":"passed","title":"管理员 dashboard 应该返回正确的预加载配置","duration":1.1522999999999683,"failureMessages":[],"meta":{}},{"ancestorTitles":["useRoutePrefetch","_getPrefetchConfig"],"fullName":"useRoutePrefetch _getPrefetchConfig 普通用户 dashboard 应该返回正确的预加载配置","status":"passed","title":"普通用户 dashboard 应该返回正确的预加载配置","duration":0.4256000000000313,"failureMessages":[],"meta":{}},{"ancestorTitles":["useRoutePrefetch","_getPrefetchConfig"],"fullName":"useRoutePrefetch _getPrefetchConfig 未定义的路由应该返回空数组","status":"passed","title":"未定义的路由应该返回空数组","duration":0.43050000000016553,"failureMessages":[],"meta":{}},{"ancestorTitles":["useRoutePrefetch","triggerPrefetch"],"fullName":"useRoutePrefetch triggerPrefetch 应该在浏览器空闲时触发预加载","status":"passed","title":"应该在浏览器空闲时触发预加载","duration":110.59999999999991,"failureMessages":[],"meta":{}},{"ancestorTitles":["useRoutePrefetch","triggerPrefetch"],"fullName":"useRoutePrefetch triggerPrefetch 应该避免重复预加载同一路由","status":"passed","title":"应该避免重复预加载同一路由","duration":213.08320000000003,"failureMessages":[],"meta":{}},{"ancestorTitles":["useRoutePrefetch","cancelPendingPrefetch"],"fullName":"useRoutePrefetch cancelPendingPrefetch 应该取消挂起的预加载任务","status":"passed","title":"应该取消挂起的预加载任务","duration":0.3367000000000644,"failureMessages":[],"meta":{}},{"ancestorTitles":["useRoutePrefetch","路由变化时取消之前的预加载"],"fullName":"useRoutePrefetch 路由变化时取消之前的预加载 应该在路由变化时取消之前的预加载任务","status":"passed","title":"应该在路由变化时取消之前的预加载任务","duration":107.22330000000011,"failureMessages":[],"meta":{}},{"ancestorTitles":["useRoutePrefetch","resetPrefetchState"],"fullName":"useRoutePrefetch resetPrefetchState 应该重置所有预加载状态","status":"passed","title":"应该重置所有预加载状态","duration":107.45769999999993,"failureMessages":[],"meta":{}},{"ancestorTitles":["useRoutePrefetch","预加载映射表"],"fullName":"useRoutePrefetch 预加载映射表 管理员预加载映射表应该包含正确的路由","status":"passed","title":"管理员预加载映射表应该包含正确的路由","duration":0.37390000000004875,"failureMessages":[],"meta":{}},{"ancestorTitles":["useRoutePrefetch","预加载映射表"],"fullName":"useRoutePrefetch 预加载映射表 用户预加载映射表应该包含正确的路由","status":"passed","title":"用户预加载映射表应该包含正确的路由","duration":0.1879999999998745,"failureMessages":[],"meta":{}},{"ancestorTitles":["useRoutePrefetch","requestIdleCallback 超时处理"],"fullName":"useRoutePrefetch requestIdleCallback 超时处理 超时后仍能正常执行预加载","status":"passed","title":"超时后仍能正常执行预加载","duration":2107.1958999999997,"failureMessages":[],"meta":{}},{"ancestorTitles":["useRoutePrefetch","预加载失败处理"],"fullName":"useRoutePrefetch 预加载失败处理 预加载失败时应该静默处理不影响页面功能","status":"passed","title":"预加载失败时应该静默处理不影响页面功能","duration":0.8795000000000073,"failureMessages":[],"meta":{}},{"ancestorTitles":["useRoutePrefetch","无 router 时的行为"],"fullName":"useRoutePrefetch 无 router 时的行为 没有传入 router 时应该正常工作但不执行预加载","status":"passed","title":"没有传入 router 时应该正常工作但不执行预加载","duration":106.4731999999999,"failureMessages":[],"meta":{}}],"startTime":1789442777913,"endTime":1789442780672.4731,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/composables/__tests__/useRoutePrefetch.spec.ts"},{"assertionResults":[{"ancestorTitles":["useStepUp error classification"],"fullName":"useStepUp error classification detects STEP_UP_REQUIRED from code field","status":"passed","title":"detects STEP_UP_REQUIRED from code field","duration":0.6965999999999894,"failureMessages":[],"meta":{}},{"ancestorTitles":["useStepUp error classification"],"fullName":"useStepUp error classification detects blocked (non-retryable) step-up errors","status":"passed","title":"detects blocked (non-retryable) step-up errors","duration":0.15419999999994616,"failureMessages":[],"meta":{}},{"ancestorTitles":["useStepUp error classification"],"fullName":"useStepUp error classification surfaces the block reason marker","status":"passed","title":"surfaces the block reason marker","duration":0.10219999999992524,"failureMessages":[],"meta":{}},{"ancestorTitles":["useStepUp.run"],"fullName":"useStepUp.run returns the action result directly on success","status":"passed","title":"returns the action result directly on success","duration":0.28730000000007294,"failureMessages":[],"meta":{}},{"ancestorTitles":["useStepUp.run"],"fullName":"useStepUp.run re-throws non-step-up errors without prompting","status":"passed","title":"re-throws non-step-up errors without prompting","duration":0.3710999999999558,"failureMessages":[],"meta":{}},{"ancestorTitles":["useStepUp.run"],"fullName":"useStepUp.run re-throws blocked errors without prompting","status":"passed","title":"re-throws blocked errors without prompting","duration":0.2420999999999367,"failureMessages":[],"meta":{}},{"ancestorTitles":["useStepUp.run"],"fullName":"useStepUp.run prompts on STEP_UP_REQUIRED and retries after verification","status":"passed","title":"prompts on STEP_UP_REQUIRED and retries after verification","duration":59.60839999999996,"failureMessages":[],"meta":{}},{"ancestorTitles":["useStepUp.run"],"fullName":"useStepUp.run throws a cancellation sentinel (not the original error) if the user cancels the prompt","status":"passed","title":"throws a cancellation sentinel (not the original error) if the user cancels the prompt","duration":62.41489999999999,"failureMessages":[],"meta":{}},{"ancestorTitles":["useStepUp.run"],"fullName":"useStepUp.run classifies the cancellation sentinel distinctly from step-up errors","status":"passed","title":"classifies the cancellation sentinel distinctly from step-up errors","duration":0.14790000000004966,"failureMessages":[],"meta":{}}],"startTime":1789442796974,"endTime":1789442797098.4148,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/composables/__tests__/useStepUp.spec.ts"},{"assertionResults":[{"ancestorTitles":["findRowIndexByDomPosition (swipe-select full-render fallback)"],"fullName":"findRowIndexByDomPosition (swipe-select full-render fallback) returns -1 when no rows are rendered","status":"passed","title":"returns -1 when no rows are rendered","duration":0.6451999999999316,"failureMessages":[],"meta":{}},{"ancestorTitles":["findRowIndexByDomPosition (swipe-select full-render fallback)"],"fullName":"findRowIndexByDomPosition (swipe-select full-render fallback) locates the row whose rect contains the Y coordinate","status":"passed","title":"locates the row whose rect contains the Y coordinate","duration":0.1751000000000431,"failureMessages":[],"meta":{}},{"ancestorTitles":["findRowIndexByDomPosition (swipe-select full-render fallback)"],"fullName":"findRowIndexByDomPosition (swipe-select full-render fallback) clamps to the first/last row when Y is outside the rendered range","status":"passed","title":"clamps to the first/last row when Y is outside the rendered range","duration":0.09600000000000364,"failureMessages":[],"meta":{}},{"ancestorTitles":["findRowIndexByDomPosition (swipe-select full-render fallback)"],"fullName":"findRowIndexByDomPosition (swipe-select full-render fallback) picks the closer row when Y falls in a gap between rows","status":"passed","title":"picks the closer row when Y falls in a gap between rows","duration":0.07380000000000564,"failureMessages":[],"meta":{}},{"ancestorTitles":["findRowIndexByDomPosition (swipe-select full-render fallback)"],"fullName":"findRowIndexByDomPosition (swipe-select full-render fallback) returns the data-index attribute value, not the array position","status":"passed","title":"returns the data-index attribute value, not the array position","duration":0.0844000000000733,"failureMessages":[],"meta":{}}],"startTime":1789442802210,"endTime":1789442802211.096,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/composables/__tests__/useSwipeSelect.spec.ts"},{"assertionResults":[{"ancestorTitles":["useTableLoader","基础加载"],"fullName":"useTableLoader 基础加载 load 执行 fetchFn 并更新 items","status":"passed","title":"load 执行 fetchFn 并更新 items","duration":3.40969999999993,"failureMessages":[],"meta":{}},{"ancestorTitles":["useTableLoader","基础加载"],"fullName":"useTableLoader 基础加载 load 期间 loading 为 true","status":"passed","title":"load 期间 loading 为 true","duration":0.45069999999998345,"failureMessages":[],"meta":{}},{"ancestorTitles":["useTableLoader","基础加载"],"fullName":"useTableLoader 基础加载 使用默认 pageSize=20","status":"passed","title":"使用默认 pageSize=20","duration":1.4109000000000833,"failureMessages":[],"meta":{}},{"ancestorTitles":["useTableLoader","基础加载"],"fullName":"useTableLoader 基础加载 可自定义 pageSize","status":"passed","title":"可自定义 pageSize","duration":0.40260000000000673,"failureMessages":[],"meta":{}},{"ancestorTitles":["useTableLoader","分页"],"fullName":"useTableLoader 分页 handlePageChange 更新页码并加载","status":"passed","title":"handlePageChange 更新页码并加载","duration":0.7915000000000418,"failureMessages":[],"meta":{}},{"ancestorTitles":["useTableLoader","分页"],"fullName":"useTableLoader 分页 handlePageSizeChange 重置到第1页并加载","status":"passed","title":"handlePageSizeChange 重置到第1页并加载","duration":0.6363000000000056,"failureMessages":[],"meta":{}},{"ancestorTitles":["useTableLoader","分页"],"fullName":"useTableLoader 分页 handlePageChange 限制页码范围","status":"passed","title":"handlePageChange 限制页码范围","duration":0.37590000000000146,"failureMessages":[],"meta":{}},{"ancestorTitles":["useTableLoader","搜索防抖"],"fullName":"useTableLoader 搜索防抖 debouncedReload 在 300ms 内多次调用只执行一次","status":"passed","title":"debouncedReload 在 300ms 内多次调用只执行一次","duration":0.6934999999999718,"failureMessages":[],"meta":{}},{"ancestorTitles":["useTableLoader","搜索防抖"],"fullName":"useTableLoader 搜索防抖 reload 重置到第 1 页","status":"passed","title":"reload 重置到第 1 页","duration":0.3423000000000229,"failureMessages":[],"meta":{}},{"ancestorTitles":["useTableLoader","请求取消"],"fullName":"useTableLoader 请求取消 新请求取消前一个未完成的请求","status":"passed","title":"新请求取消前一个未完成的请求","duration":0.5865999999999758,"failureMessages":[],"meta":{}},{"ancestorTitles":["useTableLoader","错误处理"],"fullName":"useTableLoader 错误处理 非取消错误会被抛出","status":"passed","title":"非取消错误会被抛出","duration":3.2922999999999547,"failureMessages":[],"meta":{}},{"ancestorTitles":["useTableLoader","错误处理"],"fullName":"useTableLoader 错误处理 取消错误被静默处理","status":"passed","title":"取消错误被静默处理","duration":0.3226999999999407,"failureMessages":[],"meta":{}}],"startTime":1789442783557,"endTime":1789442783570.3228,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/composables/__tests__/useTableLoader.spec.ts"},{"assertionResults":[{"ancestorTitles":["feature route guard"],"fullName":"feature route guard waits for the first public-settings request before deciding payment access","status":"passed","title":"waits for the first public-settings request before deciding payment access","duration":2.2240000000000464,"failureMessages":[],"meta":{}},{"ancestorTitles":["feature route guard"],"fullName":"feature route guard does not treat a failed payment settings load as explicitly disabled","status":"passed","title":"does not treat a failed payment settings load as explicitly disabled","duration":0.6367999999999938,"failureMessages":[],"meta":{}},{"ancestorTitles":["feature route guard"],"fullName":"feature route guard does not treat a failed risk control settings load as explicitly disabled","status":"passed","title":"does not treat a failed risk control settings load as explicitly disabled","duration":0.2098999999999478,"failureMessages":[],"meta":{}},{"ancestorTitles":["feature route guard"],"fullName":"feature route guard redirects when loaded settings explicitly disable payment","status":"passed","title":"redirects when loaded settings explicitly disable payment","duration":0.36019999999996344,"failureMessages":[],"meta":{}},{"ancestorTitles":["feature route guard"],"fullName":"feature route guard redirects when loaded settings explicitly disable risk control","status":"passed","title":"redirects when loaded settings explicitly disable risk control","duration":0.2442999999999529,"failureMessages":[],"meta":{}}],"startTime":1789442790042,"endTime":1789442790045.36,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/router/__tests__/feature-access.spec.ts"},{"assertionResults":[{"ancestorTitles":["路由守卫逻辑","未认证用户"],"fullName":"路由守卫逻辑 未认证用户 访问需要认证的页面重定向到 /login","status":"passed","title":"访问需要认证的页面重定向到 /login","duration":2.648800000000165,"failureMessages":[],"meta":{}},{"ancestorTitles":["路由守卫逻辑","未认证用户"],"fullName":"路由守卫逻辑 未认证用户 访问管理页面重定向到 /login","status":"passed","title":"访问管理页面重定向到 /login","duration":0.3290999999999258,"failureMessages":[],"meta":{}},{"ancestorTitles":["路由守卫逻辑","未认证用户"],"fullName":"路由守卫逻辑 未认证用户 访问公开页面允许通过","status":"passed","title":"访问公开页面允许通过","duration":0.2641000000000986,"failureMessages":[],"meta":{}},{"ancestorTitles":["路由守卫逻辑","未认证用户"],"fullName":"路由守卫逻辑 未认证用户 访问 /home 公开页面允许通过","status":"passed","title":"访问 /home 公开页面允许通过","duration":0.30729999999994106,"failureMessages":[],"meta":{}},{"ancestorTitles":["路由守卫逻辑","已认证普通用户"],"fullName":"路由守卫逻辑 已认证普通用户 访问 /login 重定向到 /dashboard","status":"passed","title":"访问 /login 重定向到 /dashboard","duration":0.39809999999988577,"failureMessages":[],"meta":{}},{"ancestorTitles":["路由守卫逻辑","已认证普通用户"],"fullName":"路由守卫逻辑 已认证普通用户 访问 /register 重定向到 /dashboard","status":"passed","title":"访问 /register 重定向到 /dashboard","duration":0.31359999999995125,"failureMessages":[],"meta":{}},{"ancestorTitles":["路由守卫逻辑","已认证普通用户"],"fullName":"路由守卫逻辑 已认证普通用户 访问 /dashboard 允许通过","status":"passed","title":"访问 /dashboard 允许通过","duration":0.1835000000000946,"failureMessages":[],"meta":{}},{"ancestorTitles":["路由守卫逻辑","已认证普通用户"],"fullName":"路由守卫逻辑 已认证普通用户 访问管理页面被拒绝,重定向到 /dashboard","status":"passed","title":"访问管理页面被拒绝,重定向到 /dashboard","duration":0.18380000000001928,"failureMessages":[],"meta":{}},{"ancestorTitles":["路由守卫逻辑","已认证普通用户"],"fullName":"路由守卫逻辑 已认证普通用户 访问 /admin/users 被拒绝","status":"passed","title":"访问 /admin/users 被拒绝","duration":0.19849999999996726,"failureMessages":[],"meta":{}},{"ancestorTitles":["路由守卫逻辑","已认证管理员"],"fullName":"路由守卫逻辑 已认证管理员 访问 /login 重定向到 /admin/dashboard","status":"passed","title":"访问 /login 重定向到 /admin/dashboard","duration":0.23890000000005784,"failureMessages":[],"meta":{}},{"ancestorTitles":["路由守卫逻辑","已认证管理员"],"fullName":"路由守卫逻辑 已认证管理员 访问管理页面允许通过","status":"passed","title":"访问管理页面允许通过","duration":0.45299999999997453,"failureMessages":[],"meta":{}},{"ancestorTitles":["路由守卫逻辑","已认证管理员"],"fullName":"路由守卫逻辑 已认证管理员 访问用户页面允许通过","status":"passed","title":"访问用户页面允许通过","duration":0.20070000000009713,"failureMessages":[],"meta":{}},{"ancestorTitles":["路由守卫逻辑","简易模式受限路由"],"fullName":"路由守卫逻辑 简易模式受限路由 普通用户简易模式访问 /subscriptions 重定向到 /dashboard","status":"passed","title":"普通用户简易模式访问 /subscriptions 重定向到 /dashboard","duration":0.19260000000008404,"failureMessages":[],"meta":{}},{"ancestorTitles":["路由守卫逻辑","简易模式受限路由"],"fullName":"路由守卫逻辑 简易模式受限路由 普通用户简易模式访问 /redeem 重定向到 /dashboard","status":"passed","title":"普通用户简易模式访问 /redeem 重定向到 /dashboard","duration":0.21969999999987522,"failureMessages":[],"meta":{}},{"ancestorTitles":["路由守卫逻辑","简易模式受限路由"],"fullName":"路由守卫逻辑 简易模式受限路由 管理员简易模式访问 /admin/groups 允许通过","status":"passed","title":"管理员简易模式访问 /admin/groups 允许通过","duration":0.2498000000000502,"failureMessages":[],"meta":{}},{"ancestorTitles":["路由守卫逻辑","简易模式受限路由"],"fullName":"路由守卫逻辑 简易模式受限路由 管理员简易模式访问 /admin/subscriptions 重定向","status":"passed","title":"管理员简易模式访问 /admin/subscriptions 重定向","duration":0.21679999999992106,"failureMessages":[],"meta":{}},{"ancestorTitles":["路由守卫逻辑","简易模式受限路由"],"fullName":"路由守卫逻辑 简易模式受限路由 简易模式下非受限页面正常访问","status":"passed","title":"简易模式下非受限页面正常访问","duration":0.21199999999998909,"failureMessages":[],"meta":{}},{"ancestorTitles":["路由守卫逻辑","简易模式受限路由"],"fullName":"路由守卫逻辑 简易模式受限路由 简易模式下 /keys 正常访问","status":"passed","title":"简易模式下 /keys 正常访问","duration":0.1792000000000371,"failureMessages":[],"meta":{}},{"ancestorTitles":["路由守卫逻辑","Backend Mode"],"fullName":"路由守卫逻辑 Backend Mode unauthenticated: /home redirects to /login","status":"passed","title":"unauthenticated: /home redirects to /login","duration":0.24130000000013752,"failureMessages":[],"meta":{}},{"ancestorTitles":["路由守卫逻辑","Backend Mode"],"fullName":"路由守卫逻辑 Backend Mode unauthenticated: /login is allowed","status":"passed","title":"unauthenticated: /login is allowed","duration":0.1776999999999589,"failureMessages":[],"meta":{}},{"ancestorTitles":["路由守卫逻辑","Backend Mode"],"fullName":"路由守卫逻辑 Backend Mode unauthenticated: /key-usage is allowed","status":"passed","title":"unauthenticated: /key-usage is allowed","duration":0.2339999999999236,"failureMessages":[],"meta":{}},{"ancestorTitles":["路由守卫逻辑","Backend Mode"],"fullName":"路由守卫逻辑 Backend Mode unauthenticated: /setup is allowed","status":"passed","title":"unauthenticated: /setup is allowed","duration":0.17859999999996035,"failureMessages":[],"meta":{}},{"ancestorTitles":["路由守卫逻辑","Backend Mode"],"fullName":"路由守卫逻辑 Backend Mode unauthenticated: initialized /setup redirects to /login","status":"passed","title":"unauthenticated: initialized /setup redirects to /login","duration":0.2436999999999898,"failureMessages":[],"meta":{}},{"ancestorTitles":["路由守卫逻辑","Backend Mode"],"fullName":"路由守卫逻辑 Backend Mode admin: initialized /setup redirects to /admin/dashboard","status":"passed","title":"admin: initialized /setup redirects to /admin/dashboard","duration":0.1573000000000775,"failureMessages":[],"meta":{}},{"ancestorTitles":["路由守卫逻辑","Backend Mode"],"fullName":"路由守卫逻辑 Backend Mode admin: /admin/dashboard is allowed","status":"passed","title":"admin: /admin/dashboard is allowed","duration":0.13800000000014734,"failureMessages":[],"meta":{}},{"ancestorTitles":["路由守卫逻辑","Backend Mode"],"fullName":"路由守卫逻辑 Backend Mode admin: /login redirects to /admin/dashboard","status":"passed","title":"admin: /login redirects to /admin/dashboard","duration":0.14660000000003492,"failureMessages":[],"meta":{}},{"ancestorTitles":["路由守卫逻辑","Backend Mode"],"fullName":"路由守卫逻辑 Backend Mode non-admin authenticated: /dashboard redirects to /login","status":"passed","title":"non-admin authenticated: /dashboard redirects to /login","duration":0.20069999999986976,"failureMessages":[],"meta":{}},{"ancestorTitles":["路由守卫逻辑","Backend Mode"],"fullName":"路由守卫逻辑 Backend Mode non-admin authenticated: /login is allowed (no redirect loop)","status":"passed","title":"non-admin authenticated: /login is allowed (no redirect loop)","duration":0.1632999999999356,"failureMessages":[],"meta":{}},{"ancestorTitles":["路由守卫逻辑","Backend Mode"],"fullName":"路由守卫逻辑 Backend Mode non-admin authenticated: /key-usage is allowed","status":"passed","title":"non-admin authenticated: /key-usage is allowed","duration":0.17699999999990723,"failureMessages":[],"meta":{}},{"ancestorTitles":["路由守卫逻辑","Backend Mode"],"fullName":"路由守卫逻辑 Backend Mode unauthenticated: callback routes are allowed","status":"passed","title":"unauthenticated: callback routes are allowed","duration":0.2277000000001408,"failureMessages":[],"meta":{}},{"ancestorTitles":["路由守卫逻辑","Backend Mode"],"fullName":"路由守卫逻辑 Backend Mode unauthenticated: WeChat payment callback route is allowed","status":"passed","title":"unauthenticated: WeChat payment callback route is allowed","duration":0.5098000000000411,"failureMessages":[],"meta":{}},{"ancestorTitles":["路由守卫逻辑","Backend Mode"],"fullName":"路由守卫逻辑 Backend Mode unauthenticated: /payment/result is allowed","status":"passed","title":"unauthenticated: /payment/result is allowed","duration":0.1834000000001197,"failureMessages":[],"meta":{}},{"ancestorTitles":["路由守卫逻辑","Backend Mode"],"fullName":"路由守卫逻辑 Backend Mode unauthenticated: /register is allowed when a pending auth session exists","status":"passed","title":"unauthenticated: /register is allowed when a pending auth session exists","duration":0.1473999999998341,"failureMessages":[],"meta":{}},{"ancestorTitles":["路由守卫逻辑","Backend Mode"],"fullName":"路由守卫逻辑 Backend Mode unauthenticated: /email-verify is blocked without a pending auth session","status":"passed","title":"unauthenticated: /email-verify is blocked without a pending auth session","duration":0.18819999999982429,"failureMessages":[],"meta":{}}],"startTime":1789442766032,"endTime":1789442766044.1882,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/router/__tests__/guards.spec.ts"},{"assertionResults":[{"ancestorTitles":["resolveDocumentTitle"],"fullName":"resolveDocumentTitle 路由存在标题时,使用“路由标题 - 站点名”格式","status":"passed","title":"路由存在标题时,使用“路由标题 - 站点名”格式","duration":0.6814000000000533,"failureMessages":[],"meta":{}},{"ancestorTitles":["resolveDocumentTitle"],"fullName":"resolveDocumentTitle 路由无标题时,回退到站点名","status":"passed","title":"路由无标题时,回退到站点名","duration":0.1129999999999427,"failureMessages":[],"meta":{}},{"ancestorTitles":["resolveDocumentTitle"],"fullName":"resolveDocumentTitle 站点名为空时,回退默认站点名","status":"passed","title":"站点名为空时,回退默认站点名","duration":0.11840000000006512,"failureMessages":[],"meta":{}},{"ancestorTitles":["resolveDocumentTitle"],"fullName":"resolveDocumentTitle 站点名变更时仅影响后续路由标题计算","status":"passed","title":"站点名变更时仅影响后续路由标题计算","duration":0.07230000000004111,"failureMessages":[],"meta":{}},{"ancestorTitles":["resolveRouteDocumentTitle"],"fullName":"resolveRouteDocumentTitle 自定义页面菜单加载后,使用菜单名称作为标题","status":"passed","title":"自定义页面菜单加载后,使用菜单名称作为标题","duration":0.13829999999995835,"failureMessages":[],"meta":{}}],"startTime":1789442812965,"endTime":1789442812966.1382,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/router/__tests__/title.spec.ts"},{"assertionResults":[{"ancestorTitles":["router WeChat OAuth route"],"fullName":"router WeChat OAuth route registers the WeChat callback route as a public route","status":"passed","title":"registers the WeChat callback route as a public route","duration":85.41180000000008,"failureMessages":[],"meta":{}},{"ancestorTitles":["router WeChat OAuth route"],"fullName":"router WeChat OAuth route registers the WeChat payment callback route as a public route","status":"passed","title":"registers the WeChat payment callback route as a public route","duration":0.29120000000000346,"failureMessages":[],"meta":{}}],"startTime":1789442811813,"endTime":1789442811898.4119,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/router/__tests__/wechat-route.spec.ts"},{"assertionResults":[{"ancestorTitles":["useAppStore","Toast 消息管理"],"fullName":"useAppStore Toast 消息管理 showSuccess 创建 success 类型 toast","status":"passed","title":"showSuccess 创建 success 类型 toast","duration":4.031300000000101,"failureMessages":[],"meta":{}},{"ancestorTitles":["useAppStore","Toast 消息管理"],"fullName":"useAppStore Toast 消息管理 showError 创建 error 类型 toast","status":"passed","title":"showError 创建 error 类型 toast","duration":0.8139000000001033,"failureMessages":[],"meta":{}},{"ancestorTitles":["useAppStore","Toast 消息管理"],"fullName":"useAppStore Toast 消息管理 showWarning 创建 warning 类型 toast","status":"passed","title":"showWarning 创建 warning 类型 toast","duration":0.619899999999916,"failureMessages":[],"meta":{}},{"ancestorTitles":["useAppStore","Toast 消息管理"],"fullName":"useAppStore Toast 消息管理 showInfo 创建 info 类型 toast","status":"passed","title":"showInfo 创建 info 类型 toast","duration":0.5421000000001186,"failureMessages":[],"meta":{}},{"ancestorTitles":["useAppStore","Toast 消息管理"],"fullName":"useAppStore Toast 消息管理 toast 在指定 duration 后自动消失","status":"passed","title":"toast 在指定 duration 后自动消失","duration":1.0455999999999221,"failureMessages":[],"meta":{}},{"ancestorTitles":["useAppStore","Toast 消息管理"],"fullName":"useAppStore Toast 消息管理 hideToast 移除指定 toast","status":"passed","title":"hideToast 移除指定 toast","duration":0.6174000000000888,"failureMessages":[],"meta":{}},{"ancestorTitles":["useAppStore","Toast 消息管理"],"fullName":"useAppStore Toast 消息管理 clearAllToasts 清除所有 toast","status":"passed","title":"clearAllToasts 清除所有 toast","duration":0.6824000000001433,"failureMessages":[],"meta":{}},{"ancestorTitles":["useAppStore","Toast 消息管理"],"fullName":"useAppStore Toast 消息管理 hasActiveToasts 正确反映 toast 状态","status":"passed","title":"hasActiveToasts 正确反映 toast 状态","duration":0.8369999999999891,"failureMessages":[],"meta":{}},{"ancestorTitles":["useAppStore","Toast 消息管理"],"fullName":"useAppStore Toast 消息管理 多个 toast 的 ID 唯一","status":"passed","title":"多个 toast 的 ID 唯一","duration":0.8733999999999469,"failureMessages":[],"meta":{}},{"ancestorTitles":["useAppStore","侧边栏管理"],"fullName":"useAppStore 侧边栏管理 toggleSidebar 切换折叠状态","status":"passed","title":"toggleSidebar 切换折叠状态","duration":0.5244000000000142,"failureMessages":[],"meta":{}},{"ancestorTitles":["useAppStore","侧边栏管理"],"fullName":"useAppStore 侧边栏管理 setSidebarCollapsed 直接设置状态","status":"passed","title":"setSidebarCollapsed 直接设置状态","duration":0.38239999999996144,"failureMessages":[],"meta":{}},{"ancestorTitles":["useAppStore","侧边栏管理"],"fullName":"useAppStore 侧边栏管理 sidebarScrollTop 默认为 0 且可读写","status":"passed","title":"sidebarScrollTop 默认为 0 且可读写","duration":0.36439999999993233,"failureMessages":[],"meta":{}},{"ancestorTitles":["useAppStore","侧边栏管理"],"fullName":"useAppStore 侧边栏管理 toggleMobileSidebar 切换移动端状态","status":"passed","title":"toggleMobileSidebar 切换移动端状态","duration":0.3949000000000069,"failureMessages":[],"meta":{}},{"ancestorTitles":["useAppStore","Loading 状态管理"],"fullName":"useAppStore Loading 状态管理 setLoading 管理引用计数","status":"passed","title":"setLoading 管理引用计数","duration":0.3929000000000542,"failureMessages":[],"meta":{}},{"ancestorTitles":["useAppStore","Loading 状态管理"],"fullName":"useAppStore Loading 状态管理 setLoading(false) 不会使计数为负","status":"passed","title":"setLoading(false) 不会使计数为负","duration":0.3825000000001637,"failureMessages":[],"meta":{}},{"ancestorTitles":["useAppStore","Loading 状态管理"],"fullName":"useAppStore Loading 状态管理 withLoading 自动管理 loading 状态","status":"passed","title":"withLoading 自动管理 loading 状态","duration":0.4093000000000302,"failureMessages":[],"meta":{}},{"ancestorTitles":["useAppStore","Loading 状态管理"],"fullName":"useAppStore Loading 状态管理 withLoading 错误时也恢复 loading 状态","status":"passed","title":"withLoading 错误时也恢复 loading 状态","duration":1.2386000000001332,"failureMessages":[],"meta":{}},{"ancestorTitles":["useAppStore","Loading 状态管理"],"fullName":"useAppStore Loading 状态管理 withLoadingAndError 错误时显示 toast 并返回 null","status":"passed","title":"withLoadingAndError 错误时显示 toast 并返回 null","duration":0.6752000000001317,"failureMessages":[],"meta":{}},{"ancestorTitles":["useAppStore","reset"],"fullName":"useAppStore reset 重置所有 UI 状态","status":"passed","title":"重置所有 UI 状态","duration":0.443599999999833,"failureMessages":[],"meta":{}},{"ancestorTitles":["useAppStore","公开设置加载"],"fullName":"useAppStore 公开设置加载 并发调用复用并等待同一个请求,包括 force 调用","status":"passed","title":"并发调用复用并等待同一个请求,包括 force 调用","duration":1.2672999999999774,"failureMessages":[],"meta":{}},{"ancestorTitles":["useAppStore","公开设置加载"],"fullName":"useAppStore 公开设置加载 force 在无活动请求时绕过缓存,刷新期间的普通调用等待刷新结果","status":"passed","title":"force 在无活动请求时绕过缓存,刷新期间的普通调用等待刷新结果","duration":0.9597000000001117,"failureMessages":[],"meta":{}},{"ancestorTitles":["useAppStore","公开设置加载"],"fullName":"useAppStore 公开设置加载 并发请求失败时所有调用得到 null,且不会标记设置已加载","status":"passed","title":"并发请求失败时所有调用得到 null,且不会标记设置已加载","duration":0.6313999999999851,"failureMessages":[],"meta":{}},{"ancestorTitles":["useAppStore","公开设置加载"],"fullName":"useAppStore 公开设置加载 从 window.__APP_CONFIG__ 初始化","status":"passed","title":"从 window.__APP_CONFIG__ 初始化","duration":0.4114999999999327,"failureMessages":[],"meta":{}},{"ancestorTitles":["useAppStore","公开设置加载"],"fullName":"useAppStore 公开设置加载 无注入配置时返回 false","status":"passed","title":"无注入配置时返回 false","duration":0.2943000000000211,"failureMessages":[],"meta":{}},{"ancestorTitles":["useAppStore","公开设置加载"],"fullName":"useAppStore 公开设置加载 clearPublicSettingsCache 清除缓存","status":"passed","title":"clearPublicSettingsCache 清除缓存","duration":0.3446000000001277,"failureMessages":[],"meta":{}},{"ancestorTitles":["useAppStore","公开设置加载"],"fullName":"useAppStore 公开设置加载 fetchPublicSettings(force) 会同步更新运行时注入配置","status":"passed","title":"fetchPublicSettings(force) 会同步更新运行时注入配置","duration":0.4901999999999589,"failureMessages":[],"meta":{}}],"startTime":1789442769800,"endTime":1789442769820.4902,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/stores/__tests__/app.spec.ts"},{"assertionResults":[{"ancestorTitles":["useAuthStore","login"],"fullName":"useAuthStore login 成功登录后设置 token 和 user","status":"passed","title":"成功登录后设置 token 和 user","duration":4.0487000000000535,"failureMessages":[],"meta":{}},{"ancestorTitles":["useAuthStore","login"],"fullName":"useAuthStore login 登录失败时清除状态并抛出错误","status":"passed","title":"登录失败时清除状态并抛出错误","duration":1.2876999999999725,"failureMessages":[],"meta":{}},{"ancestorTitles":["useAuthStore","login"],"fullName":"useAuthStore login 需要 2FA 时返回响应但不设置认证状态","status":"passed","title":"需要 2FA 时返回响应但不设置认证状态","duration":0.41190000000005966,"failureMessages":[],"meta":{}},{"ancestorTitles":["useAuthStore","login2FA"],"fullName":"useAuthStore login2FA 2FA 验证成功后设置认证状态","status":"passed","title":"2FA 验证成功后设置认证状态","duration":1.298400000000015,"failureMessages":[],"meta":{}},{"ancestorTitles":["useAuthStore","login2FA"],"fullName":"useAuthStore login2FA 2FA 验证失败时清除状态并抛出错误","status":"passed","title":"2FA 验证失败时清除状态并抛出错误","duration":0.5311000000000377,"failureMessages":[],"meta":{}},{"ancestorTitles":["useAuthStore","logout"],"fullName":"useAuthStore logout 注销后清除所有状态和 localStorage","status":"passed","title":"注销后清除所有状态和 localStorage","duration":0.786200000000008,"failureMessages":[],"meta":{}},{"ancestorTitles":["useAuthStore","checkAuth"],"fullName":"useAuthStore checkAuth 从 localStorage 恢复持久化状态","status":"passed","title":"从 localStorage 恢复持久化状态","duration":0.5816999999999553,"failureMessages":[],"meta":{}},{"ancestorTitles":["useAuthStore","checkAuth"],"fullName":"useAuthStore checkAuth localStorage 无数据时保持未认证状态","status":"passed","title":"localStorage 无数据时保持未认证状态","duration":0.300899999999956,"failureMessages":[],"meta":{}},{"ancestorTitles":["useAuthStore","checkAuth"],"fullName":"useAuthStore checkAuth localStorage 中用户数据损坏时清除状态","status":"passed","title":"localStorage 中用户数据损坏时清除状态","duration":3.467899999999986,"failureMessages":[],"meta":{}},{"ancestorTitles":["useAuthStore","checkAuth"],"fullName":"useAuthStore checkAuth 恢复 refresh token 和过期时间","status":"passed","title":"恢复 refresh token 和过期时间","duration":0.5199999999999818,"failureMessages":[],"meta":{}},{"ancestorTitles":["useAuthStore","checkAuth"],"fullName":"useAuthStore checkAuth 恢复持久化 pending auth session","status":"passed","title":"恢复持久化 pending auth session","duration":0.3991999999999507,"failureMessages":[],"meta":{}},{"ancestorTitles":["useAuthStore","pending auth session"],"fullName":"useAuthStore pending auth session persists and clears pending auth session state","status":"passed","title":"persists and clears pending auth session state","duration":0.36179999999990287,"failureMessages":[],"meta":{}},{"ancestorTitles":["useAuthStore","pending auth session"],"fullName":"useAuthStore pending auth session restores a persisted pending oauth session without requiring a token value","status":"passed","title":"restores a persisted pending oauth session without requiring a token value","duration":0.427599999999984,"failureMessages":[],"meta":{}},{"ancestorTitles":["useAuthStore","pending auth session"],"fullName":"useAuthStore pending auth session preserves pending auth session when registration fails","status":"passed","title":"preserves pending auth session when registration fails","duration":0.5489000000000033,"failureMessages":[],"meta":{}},{"ancestorTitles":["useAuthStore","isAdmin"],"fullName":"useAuthStore isAdmin 管理员用户返回 true","status":"passed","title":"管理员用户返回 true","duration":0.3448999999999387,"failureMessages":[],"meta":{}},{"ancestorTitles":["useAuthStore","isAdmin"],"fullName":"useAuthStore isAdmin 普通用户返回 false","status":"passed","title":"普通用户返回 false","duration":0.31510000000002947,"failureMessages":[],"meta":{}},{"ancestorTitles":["useAuthStore","isAdmin"],"fullName":"useAuthStore isAdmin 未登录时返回 false","status":"passed","title":"未登录时返回 false","duration":0.23500000000001364,"failureMessages":[],"meta":{}},{"ancestorTitles":["useAuthStore","refreshUser"],"fullName":"useAuthStore refreshUser 刷新用户数据并更新 localStorage","status":"passed","title":"刷新用户数据并更新 localStorage","duration":0.41009999999994307,"failureMessages":[],"meta":{}},{"ancestorTitles":["useAuthStore","refreshUser"],"fullName":"useAuthStore refreshUser 未认证时抛出错误","status":"passed","title":"未认证时抛出错误","duration":0.34579999999994016,"failureMessages":[],"meta":{}},{"ancestorTitles":["useAuthStore","isSimpleMode"],"fullName":"useAuthStore isSimpleMode run_mode 为 simple 时返回 true","status":"passed","title":"run_mode 为 simple 时返回 true","duration":0.35429999999996653,"failureMessages":[],"meta":{}},{"ancestorTitles":["useAuthStore","isSimpleMode"],"fullName":"useAuthStore isSimpleMode 默认为 standard 模式","status":"passed","title":"默认为 standard 模式","duration":0.20119999999997162,"failureMessages":[],"meta":{}}],"startTime":1789442774158,"endTime":1789442774176.2012,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/stores/__tests__/auth.spec.ts"},{"assertionResults":[{"ancestorTitles":["useSubscriptionStore","fetchActiveSubscriptions"],"fullName":"useSubscriptionStore fetchActiveSubscriptions 成功获取活跃订阅","status":"passed","title":"成功获取活跃订阅","duration":3.7571000000000367,"failureMessages":[],"meta":{}},{"ancestorTitles":["useSubscriptionStore","fetchActiveSubscriptions"],"fullName":"useSubscriptionStore fetchActiveSubscriptions 缓存有效时返回缓存数据","status":"passed","title":"缓存有效时返回缓存数据","duration":0.7110000000000127,"failureMessages":[],"meta":{}},{"ancestorTitles":["useSubscriptionStore","fetchActiveSubscriptions"],"fullName":"useSubscriptionStore fetchActiveSubscriptions 缓存过期后重新请求","status":"passed","title":"缓存过期后重新请求","duration":0.6350999999999658,"failureMessages":[],"meta":{}},{"ancestorTitles":["useSubscriptionStore","fetchActiveSubscriptions"],"fullName":"useSubscriptionStore fetchActiveSubscriptions force=true 强制重新请求","status":"passed","title":"force=true 强制重新请求","duration":0.4033999999999196,"failureMessages":[],"meta":{}},{"ancestorTitles":["useSubscriptionStore","fetchActiveSubscriptions"],"fullName":"useSubscriptionStore fetchActiveSubscriptions 并发请求共享同一个 Promise(去重)","status":"passed","title":"并发请求共享同一个 Promise(去重)","duration":0.39650000000006,"failureMessages":[],"meta":{}},{"ancestorTitles":["useSubscriptionStore","fetchActiveSubscriptions"],"fullName":"useSubscriptionStore fetchActiveSubscriptions API 错误时抛出异常","status":"passed","title":"API 错误时抛出异常","duration":3.592399999999998,"failureMessages":[],"meta":{}},{"ancestorTitles":["useSubscriptionStore","hasActiveSubscriptions"],"fullName":"useSubscriptionStore hasActiveSubscriptions 有订阅时返回 true","status":"passed","title":"有订阅时返回 true","duration":0.5924999999999727,"failureMessages":[],"meta":{}},{"ancestorTitles":["useSubscriptionStore","hasActiveSubscriptions"],"fullName":"useSubscriptionStore hasActiveSubscriptions 无订阅时返回 false","status":"passed","title":"无订阅时返回 false","duration":0.29539999999997235,"failureMessages":[],"meta":{}},{"ancestorTitles":["useSubscriptionStore","hasActiveSubscriptions"],"fullName":"useSubscriptionStore hasActiveSubscriptions 清除后返回 false","status":"passed","title":"清除后返回 false","duration":0.526299999999992,"failureMessages":[],"meta":{}},{"ancestorTitles":["useSubscriptionStore","invalidateCache"],"fullName":"useSubscriptionStore invalidateCache 失效缓存后下次请求重新获取数据","status":"passed","title":"失效缓存后下次请求重新获取数据","duration":0.38440000000002783,"failureMessages":[],"meta":{}},{"ancestorTitles":["useSubscriptionStore","clear"],"fullName":"useSubscriptionStore clear 清除所有订阅数据","status":"passed","title":"清除所有订阅数据","duration":0.7839000000000169,"failureMessages":[],"meta":{}},{"ancestorTitles":["useSubscriptionStore","startPolling / stopPolling"],"fullName":"useSubscriptionStore startPolling / stopPolling startPolling 不会创建重复 interval","status":"passed","title":"startPolling 不会创建重复 interval","duration":0.5885000000000673,"failureMessages":[],"meta":{}},{"ancestorTitles":["useSubscriptionStore","startPolling / stopPolling"],"fullName":"useSubscriptionStore startPolling / stopPolling stopPolling 停止定期刷新","status":"passed","title":"stopPolling 停止定期刷新","duration":0.3913000000000011,"failureMessages":[],"meta":{}}],"startTime":1789442781025,"endTime":1789442781038.3914,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/stores/__tests__/subscriptions.spec.ts"},{"assertionResults":[{"ancestorTitles":["HomeView compact mode"],"fullName":"HomeView compact mode never renders executable branding URLs as document links or images","status":"passed","title":"never renders executable branding URLs as document links or images","duration":30.581800000000044,"failureMessages":[],"meta":{}},{"ancestorTitles":["HomeView compact mode"],"fullName":"HomeView compact mode renders custom HTML ahead of compact mode","status":"passed","title":"renders custom HTML ahead of compact mode","duration":4.375999999999976,"failureMessages":[],"meta":{}},{"ancestorTitles":["HomeView compact mode"],"fullName":"HomeView compact mode renders custom URL content ahead of compact mode","status":"passed","title":"renders custom URL content ahead of compact mode","duration":1.9782000000000153,"failureMessages":[],"meta":{}},{"ancestorTitles":["HomeView compact mode"],"fullName":"HomeView compact mode treats whitespace-only custom content as empty and selects compact mode","status":"passed","title":"treats whitespace-only custom content as empty and selects compact mode","duration":2.9347000000000207,"failureMessages":[],"meta":{}},{"ancestorTitles":["HomeView compact mode"],"fullName":"HomeView compact mode selects the default home when compact mode is undefined","status":"passed","title":"selects the default home when compact mode is undefined","duration":8.213799999999992,"failureMessages":[],"meta":{}},{"ancestorTitles":["HomeView compact mode"],"fullName":"HomeView compact mode selects the default home when compact mode is false","status":"passed","title":"selects the default home when compact mode is false","duration":7.764699999999948,"failureMessages":[],"meta":{}},{"ancestorTitles":["HomeView compact mode"],"fullName":"HomeView compact mode links unauthenticated visitors to login","status":"passed","title":"links unauthenticated visitors to login","duration":2.7718999999999596,"failureMessages":[],"meta":{}},{"ancestorTitles":["HomeView compact mode"],"fullName":"HomeView compact mode links authenticated users to their dashboard","status":"passed","title":"links authenticated users to their dashboard","duration":2.2479999999999336,"failureMessages":[],"meta":{}},{"ancestorTitles":["HomeView compact mode"],"fullName":"HomeView compact mode links administrators to the admin dashboard","status":"passed","title":"links administrators to the admin dashboard","duration":2.478800000000092,"failureMessages":[],"meta":{}},{"ancestorTitles":["HomeView compact mode"],"fullName":"HomeView compact mode shows the model plaza link to anonymous visitors when public access is enabled","status":"passed","title":"shows the model plaza link to anonymous visitors when public access is enabled","duration":2.544200000000046,"failureMessages":[],"meta":{}},{"ancestorTitles":["HomeView compact mode"],"fullName":"HomeView compact mode hides the model plaza link from anonymous visitors when sign-in is required","status":"passed","title":"hides the model plaza link from anonymous visitors when sign-in is required","duration":1.846400000000017,"failureMessages":[],"meta":{}},{"ancestorTitles":["HomeView compact mode"],"fullName":"HomeView compact mode shows the model plaza link to authenticated visitors when sign-in is required","status":"passed","title":"shows the model plaza link to authenticated visitors when sign-in is required","duration":2.2087000000000216,"failureMessages":[],"meta":{}},{"ancestorTitles":["HomeView compact mode"],"fullName":"HomeView compact mode shows the model plaza link in the default home header","status":"passed","title":"shows the model plaza link in the default home header","duration":5.205000000000041,"failureMessages":[],"meta":{}},{"ancestorTitles":["HomeView compact mode"],"fullName":"HomeView compact mode hides the model plaza link when the feature is disabled","status":"passed","title":"hides the model plaza link when the feature is disabled","duration":5.442000000000007,"failureMessages":[],"meta":{}}],"startTime":1789442786314,"endTime":1789442786394.442,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/views/__tests__/HomeView.compact.spec.ts"},{"assertionResults":[{"ancestorTitles":["KeyUsageView daily detail"],"fullName":"KeyUsageView daily detail renders daily usage detail rows after a successful query","status":"passed","title":"renders daily usage detail rows after a successful query","duration":58.89589999999998,"failureMessages":[],"meta":{}},{"ancestorTitles":["KeyUsageView daily detail"],"fullName":"KeyUsageView daily detail queries the current local calendar date near midnight","status":"passed","title":"queries the current local calendar date near midnight","duration":13.695600000000013,"failureMessages":[],"meta":{}}],"startTime":1789442781984,"endTime":1789442782056.6956,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/views/__tests__/KeyUsageView.spec.ts"},{"assertionResults":[{"ancestorTitles":["fetchAllAccountIds"],"fullName":"fetchAllAccountIds loads every page with the same filter snapshot and returns unique account IDs","status":"passed","title":"loads every page with the same filter snapshot and returns unique account IDs","duration":2.185100000000034,"failureMessages":[],"meta":{}},{"ancestorTitles":["fetchAllAccountIds"],"fullName":"fetchAllAccountIds rejects an incomplete or duplicated result instead of returning a partial selection","status":"passed","title":"rejects an incomplete or duplicated result instead of returning a partial selection","duration":0.7088999999999714,"failureMessages":[],"meta":{}},{"ancestorTitles":["fetchAllAccountIds"],"fullName":"fetchAllAccountIds propagates a later page failure","status":"passed","title":"propagates a later page failure","duration":0.34600000000000364,"failureMessages":[],"meta":{}}],"startTime":1789442810453,"endTime":1789442810456.346,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/utils/__tests__/accountSelection.spec.ts"},{"assertionResults":[{"ancestorTitles":["buildOpenAIUsageRefreshKey"],"fullName":"buildOpenAIUsageRefreshKey 会在 codex 快照变化时生成不同 key","status":"passed","title":"会在 codex 快照变化时生成不同 key","duration":0.8977999999999611,"failureMessages":[],"meta":{}},{"ancestorTitles":["buildOpenAIUsageRefreshKey"],"fullName":"buildOpenAIUsageRefreshKey 会在 last_used_at 变化时生成不同 key","status":"passed","title":"会在 last_used_at 变化时生成不同 key","duration":0.12530000000003838,"failureMessages":[],"meta":{}},{"ancestorTitles":["buildOpenAIUsageRefreshKey"],"fullName":"buildOpenAIUsageRefreshKey 非 OpenAI OAuth 账号返回空 key","status":"passed","title":"非 OpenAI OAuth 账号返回空 key","duration":0.0846000000000231,"failureMessages":[],"meta":{}},{"ancestorTitles":["buildGrokUsageRefreshKey"],"fullName":"buildGrokUsageRefreshKey changes when a canonical Grok billing or usage snapshot changes","status":"passed","title":"changes when a canonical Grok billing or usage snapshot changes","duration":5.9278000000000475,"failureMessages":[],"meta":{}},{"ancestorTitles":["buildGrokUsageRefreshKey"],"fullName":"buildGrokUsageRefreshKey ignores object key order and a legacy alias shadowed by canonical usage","status":"passed","title":"ignores object key order and a legacy alias shadowed by canonical usage","duration":0.13579999999990378,"failureMessages":[],"meta":{}},{"ancestorTitles":["buildGrokUsageRefreshKey"],"fullName":"buildGrokUsageRefreshKey uses the legacy quota alias only when the canonical snapshot is absent","status":"passed","title":"uses the legacy quota alias only when the canonical snapshot is absent","duration":0.11189999999999145,"failureMessages":[],"meta":{}},{"ancestorTitles":["buildGrokUsageRefreshKey"],"fullName":"buildGrokUsageRefreshKey tracks the legacy tier when the canonical snapshot has no usable tier","status":"passed","title":"tracks the legacy tier when the canonical snapshot has no usable tier","duration":0.14830000000006294,"failureMessages":[],"meta":{}},{"ancestorTitles":["buildGrokUsageRefreshKey"],"fullName":"buildGrokUsageRefreshKey returns an empty key for non-Grok accounts","status":"passed","title":"returns an empty key for non-Grok accounts","duration":0.0667999999999438,"failureMessages":[],"meta":{}}],"startTime":1789442790657,"endTime":1789442790665.1482,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/utils/__tests__/accountUsageRefresh.spec.ts"},{"assertionResults":[{"ancestorTitles":["buildAuthErrorMessage"],"fullName":"buildAuthErrorMessage prefers response detail message when available","status":"passed","title":"prefers response detail message when available","duration":0.7196999999999889,"failureMessages":[],"meta":{}},{"ancestorTitles":["buildAuthErrorMessage"],"fullName":"buildAuthErrorMessage falls back to response message when detail is unavailable","status":"passed","title":"falls back to response message when detail is unavailable","duration":0.10760000000004766,"failureMessages":[],"meta":{}},{"ancestorTitles":["buildAuthErrorMessage"],"fullName":"buildAuthErrorMessage falls back to error.message when response payload is unavailable","status":"passed","title":"falls back to error.message when response payload is unavailable","duration":0.08109999999999218,"failureMessages":[],"meta":{}},{"ancestorTitles":["buildAuthErrorMessage"],"fullName":"buildAuthErrorMessage uses fallback when no message can be extracted","status":"passed","title":"uses fallback when no message can be extracted","duration":0.06639999999993051,"failureMessages":[],"meta":{}}],"startTime":1789442818955,"endTime":1789442818956.1077,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/utils/__tests__/authError.spec.ts"},{"assertionResults":[{"ancestorTitles":["billingMode helpers"],"fullName":"billingMode helpers prefers explicit video mode over image_count","status":"passed","title":"prefers explicit video mode over image_count","duration":0.6419999999999391,"failureMessages":[],"meta":{}},{"ancestorTitles":["billingMode helpers"],"fullName":"billingMode helpers infers image when image_count set and mode missing","status":"passed","title":"infers image when image_count set and mode missing","duration":0.09839999999996962,"failureMessages":[],"meta":{}},{"ancestorTitles":["billingMode helpers"],"fullName":"billingMode helpers keeps token mode even with image_count","status":"passed","title":"keeps token mode even with image_count","duration":0.08490000000006148,"failureMessages":[],"meta":{}}],"startTime":1789442823099,"endTime":1789442823100.0984,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/utils/__tests__/billingMode.spec.ts"},{"assertionResults":[{"ancestorTitles":["updateFavicon"],"fullName":"updateFavicon replaces the default favicon with the configured logo","status":"passed","title":"replaces the default favicon with the configured logo","duration":6.812099999999987,"failureMessages":[],"meta":{}},{"ancestorTitles":["updateFavicon"],"fullName":"updateFavicon ignores unsafe logo URLs","status":"passed","title":"ignores unsafe logo URLs","duration":0.758199999999988,"failureMessages":[],"meta":{}}],"startTime":1789442824089,"endTime":1789442824096.7583,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/utils/__tests__/branding.spec.ts"},{"assertionResults":[{"ancestorTitles":["ccswitchImport utils"],"fullName":"ccswitchImport utils defaults OpenAI CC Switch imports to the current Codex model","status":"passed","title":"defaults OpenAI CC Switch imports to the current Codex model","duration":0.5978999999999814,"failureMessages":[],"meta":{}},{"ancestorTitles":["ccswitchImport utils"],"fullName":"ccswitchImport utils defaults Grok Build imports to the current Grok model","status":"passed","title":"defaults Grok Build imports to the current Grok model","duration":0.09590000000002874,"failureMessages":[],"meta":{}},{"ancestorTitles":["ccswitchImport utils"],"fullName":"ccswitchImport utils adds the Codex model parameter for OpenAI imports","status":"passed","title":"adds the Codex model parameter for OpenAI imports","duration":0.7932999999999311,"failureMessages":[],"meta":{}},{"ancestorTitles":["ccswitchImport utils"],"fullName":"ccswitchImport utils imports Grok Build with one /v1 suffix for base URL https://api.example.com","status":"passed","title":"imports Grok Build with one /v1 suffix for base URL https://api.example.com","duration":0.5093000000000529,"failureMessages":[],"meta":{}},{"ancestorTitles":["ccswitchImport utils"],"fullName":"ccswitchImport utils imports Grok Build with one /v1 suffix for base URL https://api.example.com/","status":"passed","title":"imports Grok Build with one /v1 suffix for base URL https://api.example.com/","duration":0.3991999999999507,"failureMessages":[],"meta":{}},{"ancestorTitles":["ccswitchImport utils"],"fullName":"ccswitchImport utils imports Grok Build with one /v1 suffix for base URL https://api.example.com/v1","status":"passed","title":"imports Grok Build with one /v1 suffix for base URL https://api.example.com/v1","duration":0.248299999999972,"failureMessages":[],"meta":{}},{"ancestorTitles":["ccswitchImport utils"],"fullName":"ccswitchImport utils imports Grok Build with one /v1 suffix for base URL https://api.example.com/v1/","status":"passed","title":"imports Grok Build with one /v1 suffix for base URL https://api.example.com/v1/","duration":0.22329999999999472,"failureMessages":[],"meta":{}},{"ancestorTitles":["ccswitchImport utils"],"fullName":"ccswitchImport utils does not add a model parameter for 'anthropic' imports","status":"passed","title":"does not add a model parameter for 'anthropic' imports","duration":0.40829999999994016,"failureMessages":[],"meta":{}},{"ancestorTitles":["ccswitchImport utils"],"fullName":"ccswitchImport utils does not add a model parameter for 'gemini' imports","status":"passed","title":"does not add a model parameter for 'gemini' imports","duration":0.24639999999999418,"failureMessages":[],"meta":{}},{"ancestorTitles":["ccswitchImport utils"],"fullName":"ccswitchImport utils keeps Antigravity imports on the selected client endpoint without a model parameter","status":"passed","title":"keeps Antigravity imports on the selected client endpoint without a model parameter","duration":0.25109999999995125,"failureMessages":[],"meta":{}}],"startTime":1789442800847,"endTime":1789442800850.4082,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/utils/__tests__/ccswitchImport.spec.ts"},{"assertionResults":[{"ancestorTitles":["codexCatalogConfig"],"fullName":"codexCatalogConfig parses catalog slugs and finds a model by id","status":"passed","title":"parses catalog slugs and finds a model by id","duration":1.1844999999999573,"failureMessages":[],"meta":{}},{"ancestorTitles":["codexCatalogConfig"],"fullName":"codexCatalogConfig omits effort when the descriptor only advertises none","status":"passed","title":"omits effort when the descriptor only advertises none","duration":0.1897000000000162,"failureMessages":[],"meta":{}},{"ancestorTitles":["codexCatalogConfig"],"fullName":"codexCatalogConfig does not emit an effort absent from supported_reasoning_levels","status":"passed","title":"does not emit an effort absent from supported_reasoning_levels","duration":0.08830000000000382,"failureMessages":[],"meta":{}},{"ancestorTitles":["codexCatalogConfig"],"fullName":"codexCatalogConfig uses the catalog default when it is a supported non-none effort","status":"passed","title":"uses the catalog default when it is a supported non-none effort","duration":0.07609999999999673,"failureMessages":[],"meta":{}},{"ancestorTitles":["codexCatalogConfig"],"fullName":"codexCatalogConfig falls back to the first usable supported effort when default is missing","status":"passed","title":"falls back to the first usable supported effort when default is missing","duration":0.05679999999995289,"failureMessages":[],"meta":{}}],"startTime":1789442809823,"endTime":1789442809825.1897,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/utils/__tests__/codexCatalogConfig.spec.ts"},{"assertionResults":[{"ancestorTitles":["detectMobileDevice"],"fullName":"detectMobileDevice prefers userAgentData.mobile when available","status":"passed","title":"prefers userAgentData.mobile when available","duration":0.6376000000000204,"failureMessages":[],"meta":{}},{"ancestorTitles":["detectMobileDevice"],"fullName":"detectMobileDevice recognizes handheld browsers from the mobile UA token","status":"passed","title":"recognizes handheld browsers from the mobile UA token","duration":0.19690000000002783,"failureMessages":[],"meta":{}},{"ancestorTitles":["detectMobileDevice"],"fullName":"detectMobileDevice recognizes iPadOS desktop mode via touch capability","status":"passed","title":"recognizes iPadOS desktop mode via touch capability","duration":0.1349999999999909,"failureMessages":[],"meta":{}},{"ancestorTitles":["detectMobileDevice"],"fullName":"detectMobileDevice falls back to input capability detection for touch-first devices","status":"passed","title":"falls back to input capability detection for touch-first devices","duration":0.16360000000008768,"failureMessages":[],"meta":{}},{"ancestorTitles":["detectMobileDevice"],"fullName":"detectMobileDevice keeps desktop environments as non-mobile","status":"passed","title":"keeps desktop environments as non-mobile","duration":0.09070000000008349,"failureMessages":[],"meta":{}},{"ancestorTitles":["detectIOSDevice"],"fullName":"detectIOSDevice recognizes iPhone from the UA token","status":"passed","title":"recognizes iPhone from the UA token","duration":0.13750000000004547,"failureMessages":[],"meta":{}},{"ancestorTitles":["detectIOSDevice"],"fullName":"detectIOSDevice recognizes iPadOS desktop mode via touch capability","status":"passed","title":"recognizes iPadOS desktop mode via touch capability","duration":0.0867999999999256,"failureMessages":[],"meta":{}},{"ancestorTitles":["detectIOSDevice"],"fullName":"detectIOSDevice keeps Android devices as non-iOS","status":"passed","title":"keeps Android devices as non-iOS","duration":0.0585999999999558,"failureMessages":[],"meta":{}},{"ancestorTitles":["detectIOSDevice"],"fullName":"detectIOSDevice keeps desktop macOS without touch as non-iOS","status":"passed","title":"keeps desktop macOS without touch as non-iOS","duration":0.0644999999999527,"failureMessages":[],"meta":{}}],"startTime":1789442800857,"endTime":1789442800859.1375,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/utils/__tests__/device.spec.ts"},{"assertionResults":[{"ancestorTitles":["embedded-url"],"fullName":"embedded-url adds embedded query parameters including locale and source context","status":"passed","title":"adds embedded query parameters including locale and source context","duration":3.0489000000000033,"failureMessages":[],"meta":{}},{"ancestorTitles":["embedded-url"],"fullName":"embedded-url omits optional params when they are empty","status":"passed","title":"omits optional params when they are empty","duration":0.8560999999999694,"failureMessages":[],"meta":{}},{"ancestorTitles":["embedded-url"],"fullName":"embedded-url returns original string for invalid url input","status":"passed","title":"returns original string for invalid url input","duration":0.18190000000004147,"failureMessages":[],"meta":{}},{"ancestorTitles":["embedded-url"],"fullName":"embedded-url detects dark mode from document root class","status":"passed","title":"detects dark mode from document root class","duration":0.6156999999999471,"failureMessages":[],"meta":{}}],"startTime":1789442807897,"endTime":1789442807901.6157,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/utils/__tests__/embedded-url.spec.ts"},{"assertionResults":[{"ancestorTitles":["getFloatingPanelPosition"],"fullName":"getFloatingPanelPosition 移动端使用视口安全边距,不再从靠左按钮向屏幕外展开","status":"passed","title":"移动端使用视口安全边距,不再从靠左按钮向屏幕外展开","duration":1.1248999999999114,"failureMessages":[],"meta":{}},{"ancestorTitles":["getFloatingPanelPosition"],"fullName":"getFloatingPanelPosition 桌面端与按钮右侧对齐","status":"passed","title":"桌面端与按钮右侧对齐","duration":0.16620000000000346,"failureMessages":[],"meta":{}},{"ancestorTitles":["getFloatingPanelPosition"],"fullName":"getFloatingPanelPosition 按钮下方空间不足时改为向上展开","status":"passed","title":"按钮下方空间不足时改为向上展开","duration":0.1349999999999909,"failureMessages":[],"meta":{}}],"startTime":1789442820169,"endTime":1789442820171.135,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/utils/__tests__/floatingPanel.spec.ts"},{"assertionResults":[{"ancestorTitles":["formatCompactNumber"],"fullName":"formatCompactNumber formats boundary values with K/M/B","status":"passed","title":"formats boundary values with K/M/B","duration":0.7053999999999405,"failureMessages":[],"meta":{}},{"ancestorTitles":["formatCompactNumber"],"fullName":"formatCompactNumber supports disabling billion unit (requests style)","status":"passed","title":"supports disabling billion unit (requests style)","duration":0.09190000000000964,"failureMessages":[],"meta":{}},{"ancestorTitles":["formatCompactNumber"],"fullName":"formatCompactNumber returns 0 for nullish input","status":"passed","title":"returns 0 for nullish input","duration":0.08199999999999363,"failureMessages":[],"meta":{}}],"startTime":1789442823731,"endTime":1789442823732.0918,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/utils/__tests__/formatCompactNumber.spec.ts"},{"assertionResults":[{"ancestorTitles":["formatDateLocalInput"],"fullName":"formatDateLocalInput formats the calendar date in local time","status":"passed","title":"formats the calendar date in local time","duration":1.0062000000000353,"failureMessages":[],"meta":{}},{"ancestorTitles":["formatDateLocalInput"],"fullName":"formatDateLocalInput returns an empty string for an invalid date","status":"passed","title":"returns an empty string for an invalid date","duration":0.09739999999999327,"failureMessages":[],"meta":{}}],"startTime":1789442824917,"endTime":1789442824918.0974,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/utils/__tests__/formatDateLocalInput.spec.ts"},{"assertionResults":[{"ancestorTitles":["formatDateTimeLocalInput"],"fullName":"formatDateTimeLocalInput round-trips a minute-precision local timestamp","status":"passed","title":"round-trips a minute-precision local timestamp","duration":0.8665999999999485,"failureMessages":[],"meta":{}},{"ancestorTitles":["parseDateTimeLocalInput"],"fullName":"parseDateTimeLocalInput uses local date components and rejects timezone-bearing values","status":"passed","title":"uses local date components and rejects timezone-bearing values","duration":0.21720000000004802,"failureMessages":[],"meta":{}},{"ancestorTitles":["parseDateTimeLocalInput"],"fullName":"parseDateTimeLocalInput rejects empty, malformed, and overflowing calendar values","status":"passed","title":"rejects empty, malformed, and overflowing calendar values","duration":0.1413000000000011,"failureMessages":[],"meta":{}},{"ancestorTitles":["parseDateTimeLocalInput"],"fullName":"parseDateTimeLocalInput accepts optional seconds and fractional seconds","status":"passed","title":"accepts optional seconds and fractional seconds","duration":0.0808999999999287,"failureMessages":[],"meta":{}},{"ancestorTitles":["getBrowserTimeZone"],"fullName":"getBrowserTimeZone returns a timezone identifier or the UTC fallback","status":"passed","title":"returns a timezone identifier or the UTC fallback","duration":10.528799999999933,"failureMessages":[],"meta":{}}],"startTime":1789442813536,"endTime":1789442813547.5288,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/utils/__tests__/formatDateTimeLocalInput.spec.ts"},{"assertionResults":[{"ancestorTitles":["formatDateTimeToMinute"],"fullName":"formatDateTimeToMinute formats local date and time without seconds","status":"passed","title":"formats local date and time without seconds","duration":10.523400000000038,"failureMessages":[],"meta":{}},{"ancestorTitles":["formatDateTimeToMinute"],"fullName":"formatDateTimeToMinute returns an empty string for an invalid date","status":"passed","title":"returns an empty string for an invalid date","duration":0.09199999999998454,"failureMessages":[],"meta":{}}],"startTime":1789442825513,"endTime":1789442825524.092,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/utils/__tests__/formatDateTimeToMinute.spec.ts"},{"assertionResults":[{"ancestorTitles":["formatMultiplier"],"fullName":"formatMultiplier keeps significant decimals instead of rounding to 2 places","status":"passed","title":"keeps significant decimals instead of rounding to 2 places","duration":0.7286000000000286,"failureMessages":[],"meta":{}},{"ancestorTitles":["formatMultiplier"],"fullName":"formatMultiplier pads to at least 2 decimals for round values","status":"passed","title":"pads to at least 2 decimals for round values","duration":0.15809999999999036,"failureMessages":[],"meta":{}},{"ancestorTitles":["formatMultiplier"],"fullName":"formatMultiplier handles small values down to 4 decimals","status":"passed","title":"handles small values down to 4 decimals","duration":0.09699999999997999,"failureMessages":[],"meta":{}},{"ancestorTitles":["formatMultiplier"],"fullName":"formatMultiplier falls back to 2 significant digits below 0.0001","status":"passed","title":"falls back to 2 significant digits below 0.0001","duration":0.09649999999999181,"failureMessages":[],"meta":{}}],"startTime":1789442822258,"endTime":1789442822259.1582,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/utils/__tests__/formatMultiplier.spec.ts"},{"assertionResults":[{"ancestorTitles":["formatReasoningEffort"],"fullName":"formatReasoningEffort title-cases known effort values","status":"passed","title":"title-cases known effort values","duration":0.8817000000000235,"failureMessages":[],"meta":{}},{"ancestorTitles":["formatReasoningEffortMapping"],"fullName":"formatReasoningEffortMapping shows a single value when requested and forwarded match","status":"passed","title":"shows a single value when requested and forwarded match","duration":0.1590999999999667,"failureMessages":[],"meta":{}},{"ancestorTitles":["formatReasoningEffortMapping"],"fullName":"formatReasoningEffortMapping shows requested then forwarded when mapping changed the value","status":"passed","title":"shows requested then forwarded when mapping changed the value","duration":0.08929999999998017,"failureMessages":[],"meta":{}},{"ancestorTitles":["reasoningEffortValuesEqual"],"fullName":"reasoningEffortValuesEqual treats x-high aliases as equal","status":"passed","title":"treats x-high aliases as equal","duration":0.07949999999993906,"failureMessages":[],"meta":{}}],"startTime":1789442819162,"endTime":1789442819163.1592,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/utils/__tests__/formatReasoningEffort.spec.ts"},{"assertionResults":[{"ancestorTitles":["resolveIntervalPrices"],"fullName":"resolveIntervalPrices inherits base prices without overrides","status":"passed","title":"inherits base prices without overrides","duration":1.0605999999999085,"failureMessages":[],"meta":{}},{"ancestorTitles":["resolveIntervalPrices"],"fullName":"resolveIntervalPrices applies cache multiplier to both durations","status":"passed","title":"applies cache multiplier to both durations","duration":0.15399999999999636,"failureMessages":[],"meta":{}},{"ancestorTitles":["resolveIntervalPrices"],"fullName":"resolveIntervalPrices uses explicit cache write for both durations before multiplier","status":"passed","title":"uses explicit cache write for both durations before multiplier","duration":0.10550000000000637,"failureMessages":[],"meta":{}},{"ancestorTitles":["resolveIntervalPrices"],"fullName":"resolveIntervalPrices preserves explicit zero and separate 1h override","status":"passed","title":"preserves explicit zero and separate 1h override","duration":0.0886000000000422,"failureMessages":[],"meta":{}}],"startTime":1789442817721,"endTime":1789442817723.1055,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/utils/__tests__/intervalPrices.spec.ts"},{"assertionResults":[{"ancestorTitles":["isPrivateIp"],"fullName":"isPrivateIp identifies private/reserved IPv4 ranges","status":"passed","title":"identifies private/reserved IPv4 ranges","duration":0.997600000000034,"failureMessages":[],"meta":{}},{"ancestorTitles":["isPrivateIp"],"fullName":"isPrivateIp does not flag public IPv4 addresses","status":"passed","title":"does not flag public IPv4 addresses","duration":0.14279999999996562,"failureMessages":[],"meta":{}},{"ancestorTitles":["isPrivateIp"],"fullName":"isPrivateIp identifies private/reserved IPv6 addresses","status":"passed","title":"identifies private/reserved IPv6 addresses","duration":0.2117999999999256,"failureMessages":[],"meta":{}},{"ancestorTitles":["isPrivateIp"],"fullName":"isPrivateIp does not overmatch public IPv6 addresses near private ranges","status":"passed","title":"does not overmatch public IPv6 addresses near private ranges","duration":0.0786000000000513,"failureMessages":[],"meta":{}},{"ancestorTitles":["getEntry"],"fullName":"getEntry returns an idle entry for an IP that has never been fetched","status":"passed","title":"returns an idle entry for an IP that has never been fetched","duration":0.7417999999998983,"failureMessages":[],"meta":{}},{"ancestorTitles":["formatGeoLabel"],"fullName":"formatGeoLabel joins country/region/city with a separator","status":"passed","title":"joins country/region/city with a separator","duration":0.16269999999997253,"failureMessages":[],"meta":{}},{"ancestorTitles":["formatGeoLabel"],"fullName":"formatGeoLabel skips missing fields","status":"passed","title":"skips missing fields","duration":0.2766000000000304,"failureMessages":[],"meta":{}},{"ancestorTitles":["fetchOne"],"fullName":"fetchOne marks a private IP without making a network request","status":"passed","title":"marks a private IP without making a network request","duration":0.9030999999999949,"failureMessages":[],"meta":{}},{"ancestorTitles":["fetchOne"],"fullName":"fetchOne fetches and stores a successful geolocation result","status":"passed","title":"fetches and stores a successful geolocation result","duration":0.9483000000000175,"failureMessages":[],"meta":{}},{"ancestorTitles":["fetchOne"],"fullName":"fetchOne marks the entry as error when the response has no country_code","status":"passed","title":"marks the entry as error when the response has no country_code","duration":0.23270000000002256,"failureMessages":[],"meta":{}},{"ancestorTitles":["fetchOne"],"fullName":"fetchOne marks the entry as error when the request rejects","status":"passed","title":"marks the entry as error when the request rejects","duration":0.16849999999999454,"failureMessages":[],"meta":{}},{"ancestorTitles":["fetchOne"],"fullName":"fetchOne does not re-fetch a cached successful IP unless forced","status":"passed","title":"does not re-fetch a cached successful IP unless forced","duration":0.3247000000000071,"failureMessages":[],"meta":{}},{"ancestorTitles":["fetchBatch"],"fullName":"fetchBatch deduplicates IPs and skips private addresses without a network call","status":"passed","title":"deduplicates IPs and skips private addresses without a network call","duration":0.4116999999999962,"failureMessages":[],"meta":{}},{"ancestorTitles":["fetchBatch"],"fullName":"fetchBatch splits more than 50 IPs into multiple chunk requests","status":"passed","title":"splits more than 50 IPs into multiple chunk requests","duration":3.4668000000000347,"failureMessages":[],"meta":{}},{"ancestorTitles":["fetchBatch"],"fullName":"fetchBatch marks individual IPs as error when they are missing from the batch response","status":"passed","title":"marks individual IPs as error when they are missing from the batch response","duration":0.6096999999999753,"failureMessages":[],"meta":{}},{"ancestorTitles":["fetchBatch"],"fullName":"fetchBatch returns false when a chunk request fails at the network level","status":"passed","title":"returns false when a chunk request fails at the network level","duration":0.2155999999999949,"failureMessages":[],"meta":{}},{"ancestorTitles":["fetchBatch"],"fullName":"fetchBatch skips IPs that already have a cached success entry","status":"passed","title":"skips IPs that already have a cached success entry","duration":1.0229999999999109,"failureMessages":[],"meta":{}},{"ancestorTitles":["ipGeoLookup localStorage persistence"],"fullName":"ipGeoLookup localStorage persistence hydrates the in-memory cache from a non-expired localStorage entry on module load","status":"passed","title":"hydrates the in-memory cache from a non-expired localStorage entry on module load","duration":3.4156999999999016,"failureMessages":[],"meta":{}},{"ancestorTitles":["ipGeoLookup localStorage persistence"],"fullName":"ipGeoLookup localStorage persistence ignores expired localStorage entries on module load","status":"passed","title":"ignores expired localStorage entries on module load","duration":1.3990999999999758,"failureMessages":[],"meta":{}},{"ancestorTitles":["ipGeoLookup localStorage persistence"],"fullName":"ipGeoLookup localStorage persistence persists a successful fetch result to localStorage","status":"passed","title":"persists a successful fetch result to localStorage","duration":1.5283999999999196,"failureMessages":[],"meta":{}},{"ancestorTitles":["ipGeoLookup localStorage persistence"],"fullName":"ipGeoLookup localStorage persistence expires a hydrated in-memory entry after the TTL elapses","status":"passed","title":"expires a hydrated in-memory entry after the TTL elapses","duration":1.3986999999999625,"failureMessages":[],"meta":{}},{"ancestorTitles":["ipGeoLookup localStorage persistence"],"fullName":"ipGeoLookup localStorage persistence re-fetches a successful in-memory cache entry after the TTL elapses","status":"passed","title":"re-fetches a successful in-memory cache entry after the TTL elapses","duration":1.1843999999999824,"failureMessages":[],"meta":{}}],"startTime":1789442775015,"endTime":1789442775036.1843,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/utils/__tests__/ipGeoLookup.spec.ts"},{"assertionResults":[{"ancestorTitles":["latencyHealth"],"fullName":"latencyHealth classifies first-token latency at 10s/30s/60s boundaries","status":"passed","title":"classifies first-token latency at 10s/30s/60s boundaries","duration":0.745200000000068,"failureMessages":[],"meta":{}},{"ancestorTitles":["latencyHealth"],"fullName":"latencyHealth classifies total duration at 1min/3min/5min boundaries","status":"passed","title":"classifies total duration at 1min/3min/5min boundaries","duration":0.24240000000008877,"failureMessages":[],"meta":{}}],"startTime":1789442821051,"endTime":1789442821052.2424,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/utils/__tests__/latencyHealth.spec.ts"},{"assertionResults":[{"ancestorTitles":["oauthAffiliate"],"fullName":"oauthAffiliate persists affiliate referral code across pages","status":"passed","title":"persists affiliate referral code across pages","duration":1.0326000000000022,"failureMessages":[],"meta":{}},{"ancestorTitles":["oauthAffiliate"],"fullName":"oauthAffiliate expires stale affiliate referral code","status":"passed","title":"expires stale affiliate referral code","duration":0.35810000000003583,"failureMessages":[],"meta":{}},{"ancestorTitles":["oauthAffiliate"],"fullName":"oauthAffiliate keeps oauth transient code separate from persistent referral code","status":"passed","title":"keeps oauth transient code separate from persistent referral code","duration":0.2516999999999143,"failureMessages":[],"meta":{}}],"startTime":1789442814778,"endTime":1789442814780.2517,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/utils/__tests__/oauthAffiliate.spec.ts"},{"assertionResults":[{"ancestorTitles":["openaiWsMode utils"],"fullName":"openaiWsMode utils normalizes mode values","status":"passed","title":"normalizes mode values","duration":0.7364000000000033,"failureMessages":[],"meta":{}},{"ancestorTitles":["openaiWsMode utils"],"fullName":"openaiWsMode utils maps legacy enabled flag to mode","status":"passed","title":"maps legacy enabled flag to mode","duration":0.12760000000002947,"failureMessages":[],"meta":{}},{"ancestorTitles":["openaiWsMode utils"],"fullName":"openaiWsMode utils resolves by mode key first, then enabled, then fallback enabled keys","status":"passed","title":"resolves by mode key first, then enabled, then fallback enabled keys","duration":0.1069999999999709,"failureMessages":[],"meta":{}},{"ancestorTitles":["openaiWsMode utils"],"fullName":"openaiWsMode utils falls back to default when nothing is present","status":"passed","title":"falls back to default when nothing is present","duration":0.0626999999999498,"failureMessages":[],"meta":{}},{"ancestorTitles":["openaiWsMode utils"],"fullName":"openaiWsMode utils treats off as disabled and non-off modes as enabled","status":"passed","title":"treats off as disabled and non-off modes as enabled","duration":0.09459999999990032,"failureMessages":[],"meta":{}},{"ancestorTitles":["openaiWsMode utils"],"fullName":"openaiWsMode utils resolves concurrency hint key by mode","status":"passed","title":"resolves concurrency hint key by mode","duration":0.10410000000001673,"failureMessages":[],"meta":{}}],"startTime":1789442797860,"endTime":1789442797862.104,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/utils/__tests__/openaiWsMode.spec.ts"},{"assertionResults":[{"ancestorTitles":["daysUntil"],"fullName":"daysUntil 返回距今整天数","status":"passed","title":"返回距今整天数","duration":1.8343999999999596,"failureMessages":[],"meta":{}},{"ancestorTitles":["proxyExpiryBadgeClass"],"fullName":"proxyExpiryBadgeClass status=expired → danger","status":"passed","title":"status=expired → danger","duration":0.37750000000005457,"failureMessages":[],"meta":{}},{"ancestorTitles":["proxyExpiryBadgeClass"],"fullName":"proxyExpiryBadgeClass ≤3 天 → danger(含边界 3)","status":"passed","title":"≤3 天 → danger(含边界 3)","duration":0.1895999999999276,"failureMessages":[],"meta":{}},{"ancestorTitles":["proxyExpiryBadgeClass"],"fullName":"proxyExpiryBadgeClass 4–7 天 → warning(含边界 7)","status":"passed","title":"4–7 天 → warning(含边界 7)","duration":0.16390000000001237,"failureMessages":[],"meta":{}},{"ancestorTitles":["proxyExpiryBadgeClass"],"fullName":"proxyExpiryBadgeClass >7 天 → gray","status":"passed","title":">7 天 → gray","duration":0.12479999999993652,"failureMessages":[],"meta":{}},{"ancestorTitles":["proxyExpiryLabelKey"],"fullName":"proxyExpiryLabelKey status=expired → expired key","status":"passed","title":"status=expired → expired key","duration":0.4704999999999018,"failureMessages":[],"meta":{}},{"ancestorTitles":["proxyExpiryLabelKey"],"fullName":"proxyExpiryLabelKey 已逾期(d<0) → overdueDays","status":"passed","title":"已逾期(d<0) → overdueDays","duration":0.1935999999999467,"failureMessages":[],"meta":{}},{"ancestorTitles":["proxyExpiryLabelKey"],"fullName":"proxyExpiryLabelKey ≤7 天 → expiringInDays","status":"passed","title":"≤7 天 → expiringInDays","duration":0.14639999999997144,"failureMessages":[],"meta":{}},{"ancestorTitles":["proxyExpiryLabelKey"],"fullName":"proxyExpiryLabelKey >7 天 → remainingDays","status":"passed","title":">7 天 → remainingDays","duration":0.1630999999999858,"failureMessages":[],"meta":{}}],"startTime":1789442808687,"endTime":1789442808690.1936,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/utils/__tests__/proxyExpiry.spec.ts"},{"assertionResults":[{"ancestorTitles":["parseProxyInput"],"fullName":"parseProxyInput accepts the documented host:port:user:pass form","status":"passed","title":"accepts the documented host:port:user:pass form","duration":1.4074999999999136,"failureMessages":[],"meta":{}},{"ancestorTitles":["parseProxyInput"],"fullName":"parseProxyInput accepts the documented user:pass@host:port form","status":"passed","title":"accepts the documented user:pass@host:port form","duration":0.26949999999999363,"failureMessages":[],"meta":{}},{"ancestorTitles":["parseProxyInput"],"fullName":"parseProxyInput accepts the documented user:pass:host:port form","status":"passed","title":"accepts the documented user:pass:host:port form","duration":0.22339999999996962,"failureMessages":[],"meta":{}},{"ancestorTitles":["parseProxyInput"],"fullName":"parseProxyInput uses http for a scheme-less host","status":"passed","title":"uses http for a scheme-less host","duration":0.20310000000006312,"failureMessages":[],"meta":{}},{"ancestorTitles":["parseProxyInput"],"fullName":"parseProxyInput uses https for a scheme-less host","status":"passed","title":"uses https for a scheme-less host","duration":0.07439999999996871,"failureMessages":[],"meta":{}},{"ancestorTitles":["parseProxyInput"],"fullName":"parseProxyInput uses socks5 for a scheme-less host","status":"passed","title":"uses socks5 for a scheme-less host","duration":0.07169999999996435,"failureMessages":[],"meta":{}},{"ancestorTitles":["parseProxyInput"],"fullName":"parseProxyInput accepts explicit http(s), socks5 and encoded credentials","status":"passed","title":"accepts explicit http(s), socks5 and encoded credentials","duration":0.14679999999998472,"failureMessages":[],"meta":{}},{"ancestorTitles":["parseProxyInput"],"fullName":"parseProxyInput rejects malformed or unsupported lines","status":"passed","title":"rejects malformed or unsupported lines","duration":0.12649999999996453,"failureMessages":[],"meta":{}}],"startTime":1789442815739,"endTime":1789442815742.1467,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/utils/__tests__/proxyParser.spec.ts"},{"assertionResults":[{"ancestorTitles":["registrationEmailPolicy utils"],"fullName":"registrationEmailPolicy utils normalizeRegistrationEmailSuffixDomain lowercases, strips @, and ignores invalid chars","status":"passed","title":"normalizeRegistrationEmailSuffixDomain lowercases, strips @, and ignores invalid chars","duration":0.7421000000000504,"failureMessages":[],"meta":{}},{"ancestorTitles":["registrationEmailPolicy utils"],"fullName":"registrationEmailPolicy utils normalizeRegistrationEmailSuffixDomains deduplicates normalized domains","status":"passed","title":"normalizeRegistrationEmailSuffixDomains deduplicates normalized domains","duration":0.491800000000012,"failureMessages":[],"meta":{}},{"ancestorTitles":["registrationEmailPolicy utils"],"fullName":"registrationEmailPolicy utils parseRegistrationEmailSuffixWhitelistInput supports separators and deduplicates","status":"passed","title":"parseRegistrationEmailSuffixWhitelistInput supports separators and deduplicates","duration":0.22339999999996962,"failureMessages":[],"meta":{}},{"ancestorTitles":["registrationEmailPolicy utils"],"fullName":"registrationEmailPolicy utils parseRegistrationEmailSuffixWhitelistInput drops tokens containing invalid chars","status":"passed","title":"parseRegistrationEmailSuffixWhitelistInput drops tokens containing invalid chars","duration":0.12059999999996762,"failureMessages":[],"meta":{}},{"ancestorTitles":["registrationEmailPolicy utils"],"fullName":"registrationEmailPolicy utils parseRegistrationEmailSuffixWhitelistInput drops structurally invalid domains","status":"passed","title":"parseRegistrationEmailSuffixWhitelistInput drops structurally invalid domains","duration":0.094600000000014,"failureMessages":[],"meta":{}},{"ancestorTitles":["registrationEmailPolicy utils"],"fullName":"registrationEmailPolicy utils parseRegistrationEmailSuffixWhitelistInput returns empty list for blank input","status":"passed","title":"parseRegistrationEmailSuffixWhitelistInput returns empty list for blank input","duration":0.08119999999996708,"failureMessages":[],"meta":{}},{"ancestorTitles":["registrationEmailPolicy utils"],"fullName":"registrationEmailPolicy utils normalizeRegistrationEmailSuffixWhitelist returns canonical @domain list","status":"passed","title":"normalizeRegistrationEmailSuffixWhitelist returns canonical @domain list","duration":0.10609999999996944,"failureMessages":[],"meta":{}},{"ancestorTitles":["registrationEmailPolicy utils"],"fullName":"registrationEmailPolicy utils isRegistrationEmailSuffixDomainValid matches backend-compatible domain rules","status":"passed","title":"isRegistrationEmailSuffixDomainValid matches backend-compatible domain rules","duration":0.16470000000003893,"failureMessages":[],"meta":{}},{"ancestorTitles":["registrationEmailPolicy utils"],"fullName":"registrationEmailPolicy utils isRegistrationEmailSuffixAllowed allows any email when whitelist is empty","status":"passed","title":"isRegistrationEmailSuffixAllowed allows any email when whitelist is empty","duration":0.0848999999999478,"failureMessages":[],"meta":{}},{"ancestorTitles":["registrationEmailPolicy utils"],"fullName":"registrationEmailPolicy utils isRegistrationEmailSuffixAllowed applies exact suffix matching","status":"passed","title":"isRegistrationEmailSuffixAllowed applies exact suffix matching","duration":0.1574000000000524,"failureMessages":[],"meta":{}},{"ancestorTitles":["registrationEmailPolicy utils"],"fullName":"registrationEmailPolicy utils isRegistrationEmailSuffixAllowed applies wildcard suffix matching","status":"passed","title":"isRegistrationEmailSuffixAllowed applies wildcard suffix matching","duration":0.09720000000004347,"failureMessages":[],"meta":{}},{"ancestorTitles":["registrationEmailPolicy utils"],"fullName":"registrationEmailPolicy utils isRegistrationEmailSuffixAllowed supports mixed exact and wildcard entries","status":"passed","title":"isRegistrationEmailSuffixAllowed supports mixed exact and wildcard entries","duration":0.10399999999992815,"failureMessages":[],"meta":{}},{"ancestorTitles":["registrationEmailPolicy utils"],"fullName":"registrationEmailPolicy utils formatRegistrationEmailSuffixWhitelistForMessage lists up to five entries","status":"passed","title":"formatRegistrationEmailSuffixWhitelistForMessage lists up to five entries","duration":0.10419999999999163,"failureMessages":[],"meta":{}}],"startTime":1789442788031,"endTime":1789442788033.1575,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/utils/__tests__/registrationEmailPolicy.spec.ts"},{"assertionResults":[{"ancestorTitles":["createStableObjectKeyResolver"],"fullName":"createStableObjectKeyResolver 对同一对象返回稳定 key","status":"passed","title":"对同一对象返回稳定 key","duration":0.6768000000000711,"failureMessages":[],"meta":{}},{"ancestorTitles":["createStableObjectKeyResolver"],"fullName":"createStableObjectKeyResolver 不同对象返回不同 key","status":"passed","title":"不同对象返回不同 key","duration":0.39440000000001874,"failureMessages":[],"meta":{}},{"ancestorTitles":["createStableObjectKeyResolver"],"fullName":"createStableObjectKeyResolver 不同 resolver 互不影响","status":"passed","title":"不同 resolver 互不影响","duration":0.14679999999998472,"failureMessages":[],"meta":{}}],"startTime":1789442819784,"endTime":1789442819785.1467,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/utils/__tests__/stableObjectKey.spec.ts"},{"assertionResults":[{"ancestorTitles":["subscription expiry timing"],"fullName":"subscription expiry timing uses local calendar dates for today and tomorrow","status":"passed","title":"uses local calendar dates for today and tomorrow","duration":0.6712999999999738,"failureMessages":[],"meta":{}},{"ancestorTitles":["subscription expiry timing"],"fullName":"subscription expiry timing treats the exact expiry instant and elapsed expiries as expired","status":"passed","title":"treats the exact expiry instant and elapsed expiries as expired","duration":0.2074000000000069,"failureMessages":[],"meta":{}},{"ancestorTitles":["subscription expiry timing"],"fullName":"subscription expiry timing rejects invalid target and current dates","status":"passed","title":"rejects invalid target and current dates","duration":0.12549999999998818,"failureMessages":[],"meta":{}},{"ancestorTitles":["subscription expiry timing"],"fullName":"subscription expiry timing returns rounded-up hours and minutes for an expiry under 24 hours away","status":"passed","title":"returns rounded-up hours and minutes for an expiry under 24 hours away","duration":0.4151000000000522,"failureMessages":[],"meta":{}},{"ancestorTitles":["subscription expiry timing"],"fullName":"subscription expiry timing preserves rounded-up day display from 24 hours onward","status":"passed","title":"preserves rounded-up day display from 24 hours onward","duration":0.12790000000006785,"failureMessages":[],"meta":{}}],"startTime":1789442806691,"endTime":1789442806693.128,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/utils/__tests__/subscriptionQuota.spec.ts"},{"assertionResults":[{"ancestorTitles":["tablePreferences"],"fullName":"tablePreferences returns built-in defaults when app config is missing","status":"passed","title":"returns built-in defaults when app config is missing","duration":0.9465999999999894,"failureMessages":[],"meta":{}},{"ancestorTitles":["tablePreferences"],"fullName":"tablePreferences uses configured defaults when app config is valid","status":"passed","title":"uses configured defaults when app config is valid","duration":0.17889999999999873,"failureMessages":[],"meta":{}},{"ancestorTitles":["tablePreferences"],"fullName":"tablePreferences allows default page size outside selectable options","status":"passed","title":"allows default page size outside selectable options","duration":0.20019999999999527,"failureMessages":[],"meta":{}},{"ancestorTitles":["tablePreferences"],"fullName":"tablePreferences normalizes invalid options without rewriting the configured default itself","status":"passed","title":"normalizes invalid options without rewriting the configured default itself","duration":0.11930000000006658,"failureMessages":[],"meta":{}},{"ancestorTitles":["tablePreferences"],"fullName":"tablePreferences normalizes page size against configured options by rounding up","status":"passed","title":"normalizes page size against configured options by rounding up","duration":0.13789999999994507,"failureMessages":[],"meta":{}},{"ancestorTitles":["tablePreferences"],"fullName":"tablePreferences keeps built-in selectable defaults at 10, 20, 50, 100","status":"passed","title":"keeps built-in selectable defaults at 10, 20, 50, 100","duration":0.09609999999997854,"failureMessages":[],"meta":{}}],"startTime":1789442805473,"endTime":1789442805474.2002,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/utils/__tests__/tablePreferences.spec.ts"},{"assertionResults":[{"ancestorTitles":["usageServiceTier utils"],"fullName":"usageServiceTier utils normalizes fast/default aliases","status":"passed","title":"normalizes fast/default aliases","duration":0.6650999999999385,"failureMessages":[],"meta":{}},{"ancestorTitles":["usageServiceTier utils"],"fullName":"usageServiceTier utils preserves supported tiers","status":"passed","title":"preserves supported tiers","duration":0.130800000000022,"failureMessages":[],"meta":{}},{"ancestorTitles":["usageServiceTier utils"],"fullName":"usageServiceTier utils formats empty values as standard","status":"passed","title":"formats empty values as standard","duration":0.09429999999997563,"failureMessages":[],"meta":{}},{"ancestorTitles":["usageServiceTier utils"],"fullName":"usageServiceTier utils passes through unknown non-empty tiers for display fallback","status":"passed","title":"passes through unknown non-empty tiers for display fallback","duration":0.08639999999991232,"failureMessages":[],"meta":{}},{"ancestorTitles":["usageServiceTier utils"],"fullName":"usageServiceTier utils maps tiers to translated labels","status":"passed","title":"maps tiers to translated labels","duration":0.13440000000002783,"failureMessages":[],"meta":{}}],"startTime":1789442812908,"endTime":1789442812909.1345,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/utils/__tests__/usageServiceTier.spec.ts"},{"assertionResults":[{"ancestorTitles":["EmailOAuthButtons"],"fullName":"EmailOAuthButtons emits the GitHub OAuth request with redirect and affiliate parameters","status":"passed","title":"emits the GitHub OAuth request with redirect and affiliate parameters","duration":15.168499999999995,"failureMessages":[],"meta":{}},{"ancestorTitles":["EmailOAuthButtons"],"fullName":"EmailOAuthButtons emits the Google provider without navigating directly","status":"passed","title":"emits the Google provider without navigating directly","duration":1.981800000000021,"failureMessages":[],"meta":{}},{"ancestorTitles":["EmailOAuthButtons"],"fullName":"EmailOAuthButtons uses a full-width descriptive button when only GitHub is enabled","status":"passed","title":"uses a full-width descriptive button when only GitHub is enabled","duration":3.1657000000000153,"failureMessages":[],"meta":{}},{"ancestorTitles":["EmailOAuthButtons"],"fullName":"EmailOAuthButtons uses compact labels and two columns when GitHub and Google are both enabled","status":"passed","title":"uses compact labels and two columns when GitHub and Google are both enabled","duration":1.9676999999999225,"failureMessages":[],"meta":{}}],"startTime":1789442796495,"endTime":1789442796516.9678,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/components/auth/__tests__/EmailOAuthButtons.spec.ts"},{"assertionResults":[{"ancestorTitles":["OAuth login sections"],"fullName":"OAuth login sections emits a linuxdo start request from the original button","status":"passed","title":"emits a linuxdo start request from the original button","duration":21.339300000000094,"failureMessages":[],"meta":{}},{"ancestorTitles":["OAuth login sections"],"fullName":"OAuth login sections emits a dingtalk start request from the original button","status":"passed","title":"emits a dingtalk start request from the original button","duration":2.169300000000021,"failureMessages":[],"meta":{}},{"ancestorTitles":["OAuth login sections"],"fullName":"OAuth login sections emits a oidc start request from the original button","status":"passed","title":"emits a oidc start request from the original button","duration":1.7854999999999563,"failureMessages":[],"meta":{}},{"ancestorTitles":["OAuth login sections"],"fullName":"OAuth login sections includes a trimmed promo code in the LinuxDo OAuth request","status":"passed","title":"includes a trimmed promo code in the LinuxDo OAuth request","duration":1.6598999999999933,"failureMessages":[],"meta":{}}],"startTime":1789442811697,"endTime":1789442811723.66,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/components/auth/__tests__/OAuthLoginSections.spec.ts"},{"assertionResults":[{"ancestorTitles":["PendingOAuthCreateAccountForm"],"fullName":"PendingOAuthCreateAccountForm acquires separate proofs for pending OAuth send-code and create-account","status":"passed","title":"acquires separate proofs for pending OAuth send-code and create-account","duration":25.84820000000002,"failureMessages":[],"meta":{}},{"ancestorTitles":["PendingOAuthCreateAccountForm"],"fullName":"PendingOAuthCreateAccountForm emits trimmed email, password, and verify code on submit","status":"passed","title":"emits trimmed email, password, and verify code on submit","duration":4.42229999999995,"failureMessages":[],"meta":{}},{"ancestorTitles":["PendingOAuthCreateAccountForm"],"fullName":"PendingOAuthCreateAccountForm renders action labels through i18n keys","status":"passed","title":"renders action labels through i18n keys","duration":1.6634000000001379,"failureMessages":[],"meta":{}},{"ancestorTitles":["PendingOAuthCreateAccountForm"],"fullName":"PendingOAuthCreateAccountForm hides email verification controls when public settings disable email verification","status":"passed","title":"hides email verification controls when public settings disable email verification","duration":2.853399999999965,"failureMessages":[],"meta":{}},{"ancestorTitles":["PendingOAuthCreateAccountForm"],"fullName":"PendingOAuthCreateAccountForm shows and emits invitation code when invitation-only signup is enabled","status":"passed","title":"shows and emits invitation code when invitation-only signup is enabled","duration":3.057399999999916,"failureMessages":[],"meta":{}},{"ancestorTitles":["PendingOAuthCreateAccountForm"],"fullName":"PendingOAuthCreateAccountForm sends a verify code for the trimmed email value","status":"passed","title":"sends a verify code for the trimmed email value","duration":2.33849999999984,"failureMessages":[],"meta":{}},{"ancestorTitles":["PendingOAuthCreateAccountForm"],"fullName":"PendingOAuthCreateAccountForm shows send-code failures via toast without rendering inline error text","status":"passed","title":"shows send-code failures via toast without rendering inline error text","duration":2.2390000000000327,"failureMessages":[],"meta":{}},{"ancestorTitles":["PendingOAuthCreateAccountForm"],"fullName":"PendingOAuthCreateAccountForm consumes the captcha proof when sending a verify code fails","status":"passed","title":"consumes the captcha proof when sending a verify code fails","duration":11.571500000000015,"failureMessages":[],"meta":{}},{"ancestorTitles":["PendingOAuthCreateAccountForm"],"fullName":"PendingOAuthCreateAccountForm requires a turnstile token before sending a verify code when turnstile is enabled","status":"passed","title":"requires a turnstile token before sending a verify code when turnstile is enabled","duration":5.416800000000194,"failureMessages":[],"meta":{}},{"ancestorTitles":["PendingOAuthCreateAccountForm"],"fullName":"PendingOAuthCreateAccountForm requires a turnstile token before submitting when turnstile is enabled","status":"passed","title":"requires a turnstile token before submitting when turnstile is enabled","duration":5.246300000000019,"failureMessages":[],"meta":{}},{"ancestorTitles":["PendingOAuthCreateAccountForm"],"fullName":"PendingOAuthCreateAccountForm blocks submit again after sending a verify code consumes the turnstile proof","status":"passed","title":"blocks submit again after sending a verify code consumes the turnstile proof","duration":5.040200000000141,"failureMessages":[],"meta":{}}],"startTime":1789442770573,"endTime":1789442770643.0403,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/components/auth/__tests__/PendingOAuthCreateAccountForm.spec.ts"},{"assertionResults":[{"ancestorTitles":["TotpLoginModal"],"fullName":"TotpLoginModal sends verification errors to toast and does not render inline red text","status":"passed","title":"sends verification errors to toast and does not render inline red text","duration":16.93610000000001,"failureMessages":[],"meta":{}}],"startTime":1789442820391,"endTime":1789442820407.936,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/components/auth/__tests__/TotpLoginModal.spec.ts"},{"assertionResults":[{"ancestorTitles":["WechatOAuthSection"],"fullName":"WechatOAuthSection starts the open WeChat OAuth flow with the current redirect target when open mode is configured","status":"passed","title":"starts the open WeChat OAuth flow with the current redirect target when open mode is configured","duration":15.560300000000097,"failureMessages":[],"meta":{}},{"ancestorTitles":["WechatOAuthSection"],"fullName":"WechatOAuthSection uses mp mode inside the WeChat browser when mp mode is configured","status":"passed","title":"uses mp mode inside the WeChat browser when mp mode is configured","duration":1.985400000000027,"failureMessages":[],"meta":{}},{"ancestorTitles":["WechatOAuthSection"],"fullName":"WechatOAuthSection disables the button outside the WeChat browser when only mp mode is configured","status":"passed","title":"disables the button outside the WeChat browser when only mp mode is configured","duration":1.8720999999999322,"failureMessages":[],"meta":{}},{"ancestorTitles":["WechatOAuthSection"],"fullName":"WechatOAuthSection disables the button inside the WeChat browser when only open mode is configured","status":"passed","title":"disables the button inside the WeChat browser when only open mode is configured","duration":1.4552999999999656,"failureMessages":[],"meta":{}},{"ancestorTitles":["WechatOAuthSection"],"fullName":"WechatOAuthSection uses the legacy overall enabled flag when per-mode settings are not present","status":"passed","title":"uses the legacy overall enabled flag when per-mode settings are not present","duration":1.3607999999999265,"failureMessages":[],"meta":{}},{"ancestorTitles":["WechatOAuthSection"],"fullName":"WechatOAuthSection shows the localized not-configured hint when WeChat OAuth is unavailable","status":"passed","title":"shows the localized not-configured hint when WeChat OAuth is unavailable","duration":1.0135999999999967,"failureMessages":[],"meta":{}}],"startTime":1789442783991,"endTime":1789442784015.0137,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/components/auth/__tests__/WechatOAuthSection.spec.ts"},{"assertionResults":[{"ancestorTitles":["AvailableChannelsTable scroll integration"],"fullName":"AvailableChannelsTable scroll integration mounts the table on the .table-wrapper scroll hook","status":"passed","title":"mounts the table on the .table-wrapper scroll hook","duration":0.636600000000044,"failureMessages":[],"meta":{}},{"ancestorTitles":["AvailableChannelsTable scroll integration"],"fullName":"AvailableChannelsTable scroll integration does not clip content with its own overflow-hidden card wrapper","status":"passed","title":"does not clip content with its own overflow-hidden card wrapper","duration":0.14670000000000982,"failureMessages":[],"meta":{}},{"ancestorTitles":["AvailableChannelsTable responsive surfaces"],"fullName":"AvailableChannelsTable responsive surfaces keeps the five-column table as the desktop-only surface","status":"passed","title":"keeps the five-column table as the desktop-only surface","duration":26.88670000000002,"failureMessages":[],"meta":{}},{"ancestorTitles":["AvailableChannelsTable responsive surfaces"],"fullName":"AvailableChannelsTable responsive surfaces renders a mobile-only readable surface with groups, rates, peaks, and model pricing chips","status":"passed","title":"renders a mobile-only readable surface with groups, rates, peaks, and model pricing chips","duration":6.5,"failureMessages":[],"meta":{}},{"ancestorTitles":["AvailableChannelsTable responsive surfaces"],"fullName":"AvailableChannelsTable responsive surfaces keeps the mobile placeholders when a platform has no groups or models","status":"passed","title":"keeps the mobile placeholders when a platform has no groups or models","duration":2.497600000000034,"failureMessages":[],"meta":{}},{"ancestorTitles":["AvailableChannelsTable responsive surfaces"],"fullName":"AvailableChannelsTable responsive surfaces provides loading and empty states on both responsive surfaces","status":"passed","title":"provides loading and empty states on both responsive surfaces","duration":4.352499999999964,"failureMessages":[],"meta":{}}],"startTime":1789442784865,"endTime":1789442784906.3525,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/components/channels/__tests__/AvailableChannelsTable.spec.ts"},{"assertionResults":[{"ancestorTitles":["SupportedModelChip"],"fullName":"SupportedModelChip 仅配置区间倍率时按基础价展示 token 档位","status":"passed","title":"仅配置区间倍率时按基础价展示 token 档位","duration":21.58960000000002,"failureMessages":[],"meta":{}}],"startTime":1789442814847,"endTime":1789442814868.5896,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/components/channels/__tests__/SupportedModelChip.spec.ts"},{"assertionResults":[{"ancestorTitles":["getAccountExpiryTimestamp"],"fullName":"getAccountExpiryTimestamp adds 2026-01-31T12:34:56.789 by 1 calendar months with month-end clamping","status":"passed","title":"adds 2026-01-31T12:34:56.789 by 1 calendar months with month-end clamping","duration":0.6816000000000031,"failureMessages":[],"meta":{}},{"ancestorTitles":["getAccountExpiryTimestamp"],"fullName":"getAccountExpiryTimestamp adds 2028-01-31T12:34:56.789 by 1 calendar months with month-end clamping","status":"passed","title":"adds 2028-01-31T12:34:56.789 by 1 calendar months with month-end clamping","duration":0.10609999999996944,"failureMessages":[],"meta":{}},{"ancestorTitles":["getAccountExpiryTimestamp"],"fullName":"getAccountExpiryTimestamp adds 2028-02-29T12:34:56.789 by 12 calendar months with month-end clamping","status":"passed","title":"adds 2028-02-29T12:34:56.789 by 12 calendar months with month-end clamping","duration":0.0866000000000895,"failureMessages":[],"meta":{}},{"ancestorTitles":["getAccountExpiryTimestamp"],"fullName":"getAccountExpiryTimestamp adds 2026-12-31T12:34:56.789 by 1 calendar months with month-end clamping","status":"passed","title":"adds 2026-12-31T12:34:56.789 by 1 calendar months with month-end clamping","duration":0.06889999999998508,"failureMessages":[],"meta":{}},{"ancestorTitles":["getAccountExpiryTimestamp"],"fullName":"getAccountExpiryTimestamp adds 2028-10-31T02:30:00 by 1 calendar months with month-end clamping","status":"passed","title":"adds 2028-10-31T02:30:00 by 1 calendar months with month-end clamping","duration":0.06880000000001019,"failureMessages":[],"meta":{}}],"startTime":1789442822846,"endTime":1789442822847.1062,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/components/account/__tests__/accountExpiry.spec.ts"},{"assertionResults":[{"ancestorTitles":["AccountStatusIndicator"],"fullName":"AccountStatusIndicator Claude 5 模型限流时显示 Opus 和 Sonnet 的短别名","status":"passed","title":"Claude 5 模型限流时显示 Opus 和 Sonnet 的短别名","duration":21.469400000000064,"failureMessages":[],"meta":{}},{"ancestorTitles":["AccountStatusIndicator"],"fullName":"AccountStatusIndicator Grok 账号额度限流时显示自动恢复时间而非临时不可调度","status":"passed","title":"Grok 账号额度限流时显示自动恢复时间而非临时不可调度","duration":5.051500000000033,"failureMessages":[],"meta":{}},{"ancestorTitles":["AccountStatusIndicator"],"fullName":"AccountStatusIndicator 模型限流 + overages 启用 + 无 AICredits key → 显示 ⚡ (credits_active)","status":"passed","title":"模型限流 + overages 启用 + 无 AICredits key → 显示 ⚡ (credits_active)","duration":1.4557000000000926,"failureMessages":[],"meta":{}},{"ancestorTitles":["AccountStatusIndicator"],"fullName":"AccountStatusIndicator 模型限流 + overages 未启用 → 普通限流样式(无 ⚡)","status":"passed","title":"模型限流 + overages 未启用 → 普通限流样式(无 ⚡)","duration":1.4653000000000702,"failureMessages":[],"meta":{}},{"ancestorTitles":["AccountStatusIndicator"],"fullName":"AccountStatusIndicator AICredits key 生效 → 显示积分已用尽 (credits_exhausted)","status":"passed","title":"AICredits key 生效 → 显示积分已用尽 (credits_exhausted)","duration":1.2150000000000318,"failureMessages":[],"meta":{}},{"ancestorTitles":["AccountStatusIndicator"],"fullName":"AccountStatusIndicator 模型限流 + overages 启用 + AICredits key 生效 → 普通限流样式(积分耗尽,无 ⚡)","status":"passed","title":"模型限流 + overages 启用 + AICredits key 生效 → 普通限流样式(积分耗尽,无 ⚡)","duration":1.5066000000000486,"failureMessages":[],"meta":{}}],"startTime":1789442785883,"endTime":1789442785915.5066,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/components/account/__tests__/AccountStatusIndicator.spec.ts"},{"assertionResults":[{"ancestorTitles":["AccountTestModal"],"fullName":"AccountTestModal posts compact mode for OpenAI compact probe","status":"passed","title":"posts compact mode for OpenAI compact probe","duration":33.78100000000006,"failureMessages":[],"meta":{}},{"ancestorTitles":["AccountTestModal"],"fullName":"AccountTestModal renders Chat Completions path status from test SSE","status":"passed","title":"renders Chat Completions path status from test SSE","duration":7.3197999999999865,"failureMessages":[],"meta":{}}],"startTime":1789442790607,"endTime":1789442790648.3198,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/components/account/__tests__/AccountTestModal.spec.ts"},{"assertionResults":[{"ancestorTitles":["review reproductions: assertions express expected correct behavior"],"fullName":"review reproductions: assertions express expected correct behavior old status refresh must not overwrite a just-saved enabled policy","status":"passed","title":"old status refresh must not overwrite a just-saved enabled policy","duration":26.58630000000005,"failureMessages":[],"meta":{}},{"ancestorTitles":["review reproductions: assertions express expected correct behavior"],"fullName":"review reproductions: assertions express expected correct behavior invalid independent traffic draft must not block saving the surrounding account form","status":"passed","title":"invalid independent traffic draft must not block saving the surrounding account form","duration":10.217399999999998,"failureMessages":[],"meta":{}},{"ancestorTitles":["review reproductions: assertions express expected correct behavior"],"fullName":"review reproductions: assertions express expected correct behavior only the top nested dialog should respond to Escape","status":"passed","title":"only the top nested dialog should respond to Escape","duration":18.778599999999983,"failureMessages":[],"meta":{}},{"ancestorTitles":["review reproductions: assertions express expected correct behavior"],"fullName":"review reproductions: assertions express expected correct behavior closing the child dialog should keep scrolling locked while the account dialog is open","status":"passed","title":"closing the child dialog should keep scrolling locked while the account dialog is open","duration":5.736799999999903,"failureMessages":[],"meta":{}}],"startTime":1789442792500,"endTime":1789442792561.7368,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/components/account/__tests__/AccountTrafficControls.regression.spec.ts"},{"assertionResults":[{"ancestorTitles":["optional account traffic controls"],"fullName":"optional account traffic controls can disable a policy after invalid edits without submitting hidden invalid values","status":"passed","title":"can disable a policy after invalid edits without submitting hidden invalid values","duration":26.599099999999908,"failureMessages":[],"meta":{}},{"ancestorTitles":["optional account traffic controls"],"fullName":"optional account traffic controls does not load or enable policies until the panel is opened","status":"passed","title":"does not load or enable policies until the panel is opened","duration":3.522199999999998,"failureMessages":[],"meta":{}},{"ancestorTitles":["optional account traffic controls"],"fullName":"optional account traffic controls independently enables strict RPM and automatic adaptation, then allows both to be disabled","status":"passed","title":"independently enables strict RPM and automatic adaptation, then allows both to be disabled","duration":9.426300000000083,"failureMessages":[],"meta":{}},{"ancestorTitles":["optional account traffic controls"],"fullName":"optional account traffic controls does not save a burst larger than the rolling minute limit","status":"passed","title":"does not save a burst larger than the rolling minute limit","duration":3.8461999999999534,"failureMessages":[],"meta":{}},{"ancestorTitles":["optional account traffic controls"],"fullName":"optional account traffic controls only fills recommended numbers and permits administrator overrides without changing switches or mode","status":"passed","title":"only fills recommended numbers and permits administrator overrides without changing switches or mode","duration":7.830100000000016,"failureMessages":[],"meta":{}}],"startTime":1789442787352,"endTime":1789442787402.83,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/components/account/__tests__/AccountTrafficControls.spec.ts"},{"assertionResults":[{"ancestorTitles":["AccountUsageCell"],"fullName":"AccountUsageCell renders eligible Ollama Cloud state and forwards query updates","status":"passed","title":"renders eligible Ollama Cloud state and forwards query updates","duration":29.507300000000214,"failureMessages":[],"meta":{}},{"ancestorTitles":["AccountUsageCell"],"fullName":"AccountUsageCell kimi apikey 账号 Ollama Cloud eligible 时渲染 Ollama 用量单元格并跳过 CN 子单元格","status":"passed","title":"kimi apikey 账号 Ollama Cloud eligible 时渲染 Ollama 用量单元格并跳过 CN 子单元格","duration":4.960199999999986,"failureMessages":[],"meta":{}},{"ancestorTitles":["AccountUsageCell"],"fullName":"AccountUsageCell zhipu apikey 账号 Ollama Cloud eligible 时渲染 Ollama 用量单元格并跳过 CN 子单元格","status":"passed","title":"zhipu apikey 账号 Ollama Cloud eligible 时渲染 Ollama 用量单元格并跳过 CN 子单元格","duration":2.0771999999997206,"failureMessages":[],"meta":{}},{"ancestorTitles":["AccountUsageCell"],"fullName":"AccountUsageCell deepseek apikey 账号 Ollama Cloud eligible 时渲染 Ollama 用量单元格并跳过 CN 子单元格","status":"passed","title":"deepseek apikey 账号 Ollama Cloud eligible 时渲染 Ollama 用量单元格并跳过 CN 子单元格","duration":1.7089999999998327,"failureMessages":[],"meta":{}},{"ancestorTitles":["AccountUsageCell"],"fullName":"AccountUsageCell minimax apikey 账号 Ollama Cloud eligible 时渲染 Ollama 用量单元格并跳过 CN 子单元格","status":"passed","title":"minimax apikey 账号 Ollama Cloud eligible 时渲染 Ollama 用量单元格并跳过 CN 子单元格","duration":1.61200000000008,"failureMessages":[],"meta":{}},{"ancestorTitles":["AccountUsageCell"],"fullName":"AccountUsageCell CN 平台 Ollama Cloud eligible 账号的用量更新经 account-updated 透传","status":"passed","title":"CN 平台 Ollama Cloud eligible 账号的用量更新经 account-updated 透传","duration":2.505999999999858,"failureMessages":[],"meta":{}},{"ancestorTitles":["AccountUsageCell"],"fullName":"AccountUsageCell 普通 kimi apikey 账号('无 ollama_cloud_usage')仍渲染 CN 子单元格","status":"passed","title":"普通 kimi apikey 账号('无 ollama_cloud_usage')仍渲染 CN 子单元格","duration":2.2839999999996508,"failureMessages":[],"meta":{}},{"ancestorTitles":["AccountUsageCell"],"fullName":"AccountUsageCell 普通 kimi apikey 账号('eligible=false')仍渲染 CN 子单元格","status":"passed","title":"普通 kimi apikey 账号('eligible=false')仍渲染 CN 子单元格","duration":1.4161999999996624,"failureMessages":[],"meta":{}},{"ancestorTitles":["AccountUsageCell"],"fullName":"AccountUsageCell Antigravity 图片用量会聚合新旧 image 模型","status":"passed","title":"Antigravity 图片用量会聚合新旧 image 模型","duration":6.160200000000259,"failureMessages":[],"meta":{}},{"ancestorTitles":["AccountUsageCell"],"fullName":"AccountUsageCell Antigravity 会显示 AI Credits 余额信息","status":"passed","title":"Antigravity 会显示 AI Credits 余额信息","duration":2.429700000000139,"failureMessages":[],"meta":{}},{"ancestorTitles":["AccountUsageCell"],"fullName":"AccountUsageCell OpenAI OAuth 快照已过期时首屏会重新请求 usage","status":"passed","title":"OpenAI OAuth 快照已过期时首屏会重新请求 usage","duration":11.010200000000168,"failureMessages":[],"meta":{}},{"ancestorTitles":["AccountUsageCell"],"fullName":"AccountUsageCell OpenAI OAuth 有 codex 快照时仍然使用 /usage API 数据渲染","status":"passed","title":"OpenAI OAuth 有 codex 快照时仍然使用 /usage API 数据渲染","duration":4.92029999999977,"failureMessages":[],"meta":{}},{"ancestorTitles":["AccountUsageCell"],"fullName":"AccountUsageCell 仅为 OpenAI OAuth 7d 窗口计算预计总费用","status":"passed","title":"仅为 OpenAI OAuth 7d 窗口计算预计总费用","duration":5.2970000000000255,"failureMessages":[],"meta":{}},{"ancestorTitles":["AccountUsageCell"],"fullName":"AccountUsageCell OpenAI OAuth 7d 输入无效时不显示预计总费用 ({ id: 6801, utilization: +0, cost: 12 })","status":"passed","title":"OpenAI OAuth 7d 输入无效时不显示预计总费用 ({ id: 6801, utilization: +0, cost: 12 })","duration":4.174599999999828,"failureMessages":[],"meta":{}},{"ancestorTitles":["AccountUsageCell"],"fullName":"AccountUsageCell OpenAI OAuth 7d 输入无效时不显示预计总费用 ({ id: 6802, utilization: -1, cost: 12 })","status":"passed","title":"OpenAI OAuth 7d 输入无效时不显示预计总费用 ({ id: 6802, utilization: -1, cost: 12 })","duration":4.3771999999999025,"failureMessages":[],"meta":{}},{"ancestorTitles":["AccountUsageCell"],"fullName":"AccountUsageCell OpenAI OAuth 7d 输入无效时不显示预计总费用 ({ id: 6803, utilization: NaN, cost: 12 })","status":"passed","title":"OpenAI OAuth 7d 输入无效时不显示预计总费用 ({ id: 6803, utilization: NaN, cost: 12 })","duration":3.590299999999843,"failureMessages":[],"meta":{}},{"ancestorTitles":["AccountUsageCell"],"fullName":"AccountUsageCell OpenAI OAuth 7d 输入无效时不显示预计总费用 ({ id: 6804, utilization: 40, cost: +0 })","status":"passed","title":"OpenAI OAuth 7d 输入无效时不显示预计总费用 ({ id: 6804, utilization: 40, cost: +0 })","duration":3.7420999999999367,"failureMessages":[],"meta":{}},{"ancestorTitles":["AccountUsageCell"],"fullName":"AccountUsageCell OpenAI OAuth 7d 输入无效时不显示预计总费用 ({ id: 6805, utilization: 40, cost: Infinity })","status":"passed","title":"OpenAI OAuth 7d 输入无效时不显示预计总费用 ({ id: 6805, utilization: 40, cost: Infinity })","duration":3.2953999999999724,"failureMessages":[],"meta":{}},{"ancestorTitles":["AccountUsageCell"],"fullName":"AccountUsageCell OpenAI OAuth 有现成快照时,手动刷新信号会触发 usage 重拉","status":"passed","title":"OpenAI OAuth 有现成快照时,手动刷新信号会触发 usage 重拉","duration":4.444700000000012,"failureMessages":[],"meta":{}},{"ancestorTitles":["AccountUsageCell"],"fullName":"AccountUsageCell OpenAI OAuth 在无 codex 快照时会回退显示 usage 接口窗口","status":"passed","title":"OpenAI OAuth 在无 codex 快照时会回退显示 usage 接口窗口","duration":6.1107999999999265,"failureMessages":[],"meta":{}},{"ancestorTitles":["AccountUsageCell"],"fullName":"AccountUsageCell OpenAI OAuth 在行数据刷新但仍无 codex 快照时会重新拉取 usage","status":"passed","title":"OpenAI OAuth 在行数据刷新但仍无 codex 快照时会重新拉取 usage","duration":5.200800000000072,"failureMessages":[],"meta":{}},{"ancestorTitles":["AccountUsageCell"],"fullName":"AccountUsageCell OpenAI 重置响应更新账号行后重新拉取 usage","status":"passed","title":"OpenAI 重置响应更新账号行后重新拉取 usage","duration":3.643199999999979,"failureMessages":[],"meta":{}},{"ancestorTitles":["AccountUsageCell"],"fullName":"AccountUsageCell OpenAI OAuth 已限额时显示 /usage API 返回的限额数据","status":"passed","title":"OpenAI OAuth 已限额时显示 /usage API 返回的限额数据","duration":3.4668000000001484,"failureMessages":[],"meta":{}},{"ancestorTitles":["AccountUsageCell"],"fullName":"AccountUsageCell Key 账号会展示 today stats 徽章并带 A/U 提示","status":"passed","title":"Key 账号会展示 today stats 徽章并带 A/U 提示","duration":1.7856999999999061,"failureMessages":[],"meta":{}},{"ancestorTitles":["AccountUsageCell"],"fullName":"AccountUsageCell Grok OAuth compact UI drops local chips and header quota bars","status":"passed","title":"Grok OAuth compact UI drops local chips and header quota bars","duration":2.5056000000004133,"failureMessages":[],"meta":{}},{"ancestorTitles":["AccountUsageCell"],"fullName":"AccountUsageCell Grok paid monthly limits show 30d bar without free 24h","status":"passed","title":"Grok paid monthly limits show 30d bar without free 24h","duration":3.4139000000000124,"failureMessages":[],"meta":{}},{"ancestorTitles":["AccountUsageCell"],"fullName":"AccountUsageCell Grok OAuth uses the official weekly billing percentage when available","status":"passed","title":"Grok OAuth uses the official weekly billing percentage when available","duration":2.0794999999998254,"failureMessages":[],"meta":{}},{"ancestorTitles":["AccountUsageCell"],"fullName":"AccountUsageCell Grok Free derives its 1M quota from local tokens: +0 -> +0% { tokens: +0, expected: +0 }","status":"passed","title":"Grok Free derives its 1M quota from local tokens: +0 -> +0% { tokens: +0, expected: +0 }","duration":3.2640000000001237,"failureMessages":[],"meta":{}},{"ancestorTitles":["AccountUsageCell"],"fullName":"AccountUsageCell Grok Free derives its 1M quota from local tokens: 500000 -> 50% { tokens: 500000, expected: 50 }","status":"passed","title":"Grok Free derives its 1M quota from local tokens: 500000 -> 50% { tokens: 500000, expected: 50 }","duration":1.8893000000002758,"failureMessages":[],"meta":{}},{"ancestorTitles":["AccountUsageCell"],"fullName":"AccountUsageCell Grok Free derives its 1M quota from local tokens: 1000000 -> 100% { tokens: 1000000, expected: 100 }","status":"passed","title":"Grok Free derives its 1M quota from local tokens: 1000000 -> 100% { tokens: 1000000, expected: 100 }","duration":1.8326999999999316,"failureMessages":[],"meta":{}},{"ancestorTitles":["AccountUsageCell"],"fullName":"AccountUsageCell Grok Free derives its 1M quota from local tokens: 1100000 -> 100% { tokens: 1100000, expected: 100 }","status":"passed","title":"Grok Free derives its 1M quota from local tokens: 1100000 -> 100% { tokens: 1100000, expected: 100 }","duration":1.7862999999997555,"failureMessages":[],"meta":{}},{"ancestorTitles":["AccountUsageCell"],"fullName":"AccountUsageCell Grok Free uses rolling 24h usage instead of today-only usage","status":"passed","title":"Grok Free uses rolling 24h usage instead of today-only usage","duration":2.0179000000002816,"failureMessages":[],"meta":{}},{"ancestorTitles":["AccountUsageCell"],"fullName":"AccountUsageCell Grok Free does not substitute today stats when rolling 24h usage is unavailable","status":"passed","title":"Grok Free does not substitute today stats when rolling 24h usage is unavailable","duration":2.1156999999998334,"failureMessages":[],"meta":{}},{"ancestorTitles":["AccountUsageCell"],"fullName":"AccountUsageCell Grok JWT free tier shows 24h bar even when leftover Heavy billing metrics remain","status":"passed","title":"Grok JWT free tier shows 24h bar even when leftover Heavy billing metrics remain","duration":1.5972999999999047,"failureMessages":[],"meta":{}},{"ancestorTitles":["AccountUsageCell"],"fullName":"AccountUsageCell Grok SuperGrok Lite stays on paid 7d bar, not free 24h","status":"passed","title":"Grok SuperGrok Lite stays on paid 7d bar, not free 24h","duration":1.5734000000002197,"failureMessages":[],"meta":{}},{"ancestorTitles":["AccountUsageCell"],"fullName":"AccountUsageCell Grok credential Free tier keeps the 1M fallback when billing is unavailable","status":"passed","title":"Grok credential Free tier keeps the 1M fallback when billing is unavailable","duration":6.269900000000234,"failureMessages":[],"meta":{}},{"ancestorTitles":["AccountUsageCell"],"fullName":"AccountUsageCell Grok Free 24h bar shows rolling local usage chips","status":"passed","title":"Grok Free 24h bar shows rolling local usage chips","duration":1.719000000000051,"failureMessages":[],"meta":{}},{"ancestorTitles":["AccountUsageCell"],"fullName":"AccountUsageCell Grok SuperGrok and Heavy bars show period-aligned local 7d and 30d usage","status":"passed","title":"Grok SuperGrok and Heavy bars show period-aligned local 7d and 30d usage","duration":2.0149999999998727,"failureMessages":[],"meta":{}},{"ancestorTitles":["AccountUsageCell"],"fullName":"AccountUsageCell Grok paid bars fall back to official seven_day and thirty_day window_stats","status":"passed","title":"Grok paid bars fall back to official seven_day and thirty_day window_stats","duration":1.8062999999997373,"failureMessages":[],"meta":{}},{"ancestorTitles":["AccountUsageCell"],"fullName":"AccountUsageCell Grok paid hides zero prepaid and hides used/limit when monthly limit is 0","status":"passed","title":"Grok paid hides zero prepaid and hides used/limit when monthly limit is 0","duration":1.6066000000000713,"failureMessages":[],"meta":{}},{"ancestorTitles":["AccountUsageCell"],"fullName":"AccountUsageCell Grok paid shows used/limit without prepaid, and prepaid without a zero monthly limit","status":"passed","title":"Grok paid shows used/limit without prepaid, and prepaid without a zero monthly limit","duration":3.2708999999999833,"failureMessages":[],"meta":{}},{"ancestorTitles":["AccountUsageCell"],"fullName":"AccountUsageCell Key 账号在 today stats loading 时显示骨架屏","status":"passed","title":"Key 账号在 today stats loading 时显示骨架屏","duration":1.2287999999998647,"failureMessages":[],"meta":{}},{"ancestorTitles":["AccountUsageCell"],"fullName":"AccountUsageCell Key 账号在无 today stats 且无配额时显示兜底短横线","status":"passed","title":"Key 账号在无 today stats 且无配额时显示兜底短横线","duration":0.8684000000002925,"failureMessages":[],"meta":{}},{"ancestorTitles":["AccountUsageCell"],"fullName":"AccountUsageCell Vertex 账号会在 Gemini 用量窗口里展示 today stats 徽章","status":"passed","title":"Vertex 账号会在 Gemini 用量窗口里展示 today stats 徽章","duration":2.8912999999997737,"failureMessages":[],"meta":{}},{"ancestorTitles":["AccountUsageCell"],"fullName":"AccountUsageCell Anthropic OAuth 会渲染 7d F (Fable) 进度条,且 7d S 逻辑保留","status":"passed","title":"Anthropic OAuth 会渲染 7d F (Fable) 进度条,且 7d S 逻辑保留","duration":1.9171000000001186,"failureMessages":[],"meta":{}},{"ancestorTitles":["AccountUsageCell"],"fullName":"AccountUsageCell Anthropic OAuth 无 Fable 数据时不渲染 7d F 进度条","status":"passed","title":"Anthropic OAuth 无 Fable 数据时不渲染 7d F 进度条","duration":1.7752000000000407,"failureMessages":[],"meta":{}}],"startTime":1789442755593,"endTime":1789442755762.7751,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/components/account/__tests__/AccountUsageCell.spec.ts"},{"assertionResults":[{"ancestorTitles":["BulkEditAccountModal"],"fullName":"BulkEditAccountModal 批量修改倍率时提示自动同步账号需要先关闭同步","status":"passed","title":"批量修改倍率时提示自动同步账号需要先关闭同步","duration":53.51290000000017,"failureMessages":[],"meta":{}},{"ancestorTitles":["BulkEditAccountModal"],"fullName":"BulkEditAccountModal 后端拒绝修改同步账号倍率时展示专用错误","status":"passed","title":"后端拒绝修改同步账号倍率时展示专用错误","duration":13.541799999999967,"failureMessages":[],"meta":{}},{"ancestorTitles":["BulkEditAccountModal"],"fullName":"BulkEditAccountModal antigravity 白名单包含 Gemini 图片模型且过滤掉普通 GPT 模型","status":"passed","title":"antigravity 白名单包含 Gemini 图片模型且过滤掉普通 GPT 模型","duration":14.158199999999852,"failureMessages":[],"meta":{}},{"ancestorTitles":["BulkEditAccountModal"],"fullName":"BulkEditAccountModal antigravity 映射预设包含图片映射并过滤 OpenAI 预设","status":"passed","title":"antigravity 映射预设包含图片映射并过滤 OpenAI 预设","duration":8.073399999999765,"failureMessages":[],"meta":{}},{"ancestorTitles":["BulkEditAccountModal"],"fullName":"BulkEditAccountModal 仅勾选模型限制且白名单留空时,应提交空 model_mapping 以支持所有模型","status":"passed","title":"仅勾选模型限制且白名单留空时,应提交空 model_mapping 以支持所有模型","duration":7.762200000000121,"failureMessages":[],"meta":{}},{"ancestorTitles":["BulkEditAccountModal"],"fullName":"BulkEditAccountModal 全部目标为 Grok OAuth 时,官方主机 base_url 作为手动端点切换正常提交","status":"passed","title":"全部目标为 Grok OAuth 时,官方主机 base_url 作为手动端点切换正常提交","duration":9.600600000000213,"failureMessages":[],"meta":{}},{"ancestorTitles":["BulkEditAccountModal"],"fullName":"BulkEditAccountModal 所选全为 grok 时展示快捷端点,点击后填入并自动勾选 base_url","status":"passed","title":"所选全为 grok 时展示快捷端点,点击后填入并自动勾选 base_url","duration":13.136400000000322,"failureMessages":[],"meta":{}},{"ancestorTitles":["BulkEditAccountModal"],"fullName":"BulkEditAccountModal 所选含非 grok 平台时不展示快捷端点","status":"passed","title":"所选含非 grok 平台时不展示快捷端点","duration":6.521499999999833,"failureMessages":[],"meta":{}},{"ancestorTitles":["BulkEditAccountModal"],"fullName":"BulkEditAccountModal 全部目标为 kimi API Key 时展示请求头覆写","status":"passed","title":"全部目标为 kimi API Key 时展示请求头覆写","duration":6.690500000000156,"failureMessages":[],"meta":{}},{"ancestorTitles":["BulkEditAccountModal"],"fullName":"BulkEditAccountModal 全部目标为 zhipu API Key 时展示请求头覆写","status":"passed","title":"全部目标为 zhipu API Key 时展示请求头覆写","duration":7.086900000000242,"failureMessages":[],"meta":{}},{"ancestorTitles":["BulkEditAccountModal"],"fullName":"BulkEditAccountModal 全部目标为 deepseek API Key 时展示请求头覆写","status":"passed","title":"全部目标为 deepseek API Key 时展示请求头覆写","duration":8.178699999999935,"failureMessages":[],"meta":{}},{"ancestorTitles":["BulkEditAccountModal"],"fullName":"BulkEditAccountModal 全部目标为 minimax API Key 时展示请求头覆写","status":"passed","title":"全部目标为 minimax API Key 时展示请求头覆写","duration":7.645799999999781,"failureMessages":[],"meta":{}},{"ancestorTitles":["BulkEditAccountModal"],"fullName":"BulkEditAccountModal 目标为 kimi OAuth 时不展示请求头覆写","status":"passed","title":"目标为 kimi OAuth 时不展示请求头覆写","duration":6.412699999999859,"failureMessages":[],"meta":{}},{"ancestorTitles":["BulkEditAccountModal"],"fullName":"BulkEditAccountModal 目标为 zhipu OAuth 时不展示请求头覆写","status":"passed","title":"目标为 zhipu OAuth 时不展示请求头覆写","duration":3.867200000000139,"failureMessages":[],"meta":{}},{"ancestorTitles":["BulkEditAccountModal"],"fullName":"BulkEditAccountModal 目标为 deepseek OAuth 时不展示请求头覆写","status":"passed","title":"目标为 deepseek OAuth 时不展示请求头覆写","duration":10.765300000000025,"failureMessages":[],"meta":{}},{"ancestorTitles":["BulkEditAccountModal"],"fullName":"BulkEditAccountModal 目标为 minimax OAuth 时不展示请求头覆写","status":"passed","title":"目标为 minimax OAuth 时不展示请求头覆写","duration":4.398000000000138,"failureMessages":[],"meta":{}},{"ancestorTitles":["BulkEditAccountModal"],"fullName":"BulkEditAccountModal 全部目标为 Grok OAuth 时,第三方 base_url 正常提交","status":"passed","title":"全部目标为 Grok OAuth 时,第三方 base_url 正常提交","duration":8.495300000000043,"failureMessages":[],"meta":{}},{"ancestorTitles":["BulkEditAccountModal"],"fullName":"BulkEditAccountModal 混合类型选择(含 apikey)时官方主机 base_url 不拦截","status":"passed","title":"混合类型选择(含 apikey)时官方主机 base_url 不拦截","duration":7.5767000000000735,"failureMessages":[],"meta":{}},{"ancestorTitles":["BulkEditAccountModal"],"fullName":"BulkEditAccountModal OpenAI 账号批量编辑可开启自动透传","status":"passed","title":"OpenAI 账号批量编辑可开启自动透传","duration":10.676899999999932,"failureMessages":[],"meta":{}},{"ancestorTitles":["BulkEditAccountModal"],"fullName":"BulkEditAccountModal OpenAI OAuth 批量编辑可开启 namespace 摊平兼容开关","status":"passed","title":"OpenAI OAuth 批量编辑可开启 namespace 摊平兼容开关","duration":11.749500000000353,"failureMessages":[],"meta":{}},{"ancestorTitles":["BulkEditAccountModal"],"fullName":"BulkEditAccountModal namespace 摊平开关不对 setup-token 等非 OAuth 选择展示","status":"passed","title":"namespace 摊平开关不对 setup-token 等非 OAuth 选择展示","duration":5.966899999999896,"failureMessages":[],"meta":{}},{"ancestorTitles":["BulkEditAccountModal"],"fullName":"BulkEditAccountModal OpenAI OAuth 批量编辑应提交 OAuth 专属 WS mode 字段(含 http_bridge)","status":"passed","title":"OpenAI OAuth 批量编辑应提交 OAuth 专属 WS mode 字段(含 http_bridge)","duration":14.186899999999696,"failureMessages":[],"meta":{}},{"ancestorTitles":["BulkEditAccountModal"],"fullName":"BulkEditAccountModal OpenAI API Key 批量编辑不显示 WS mode 入口","status":"passed","title":"OpenAI API Key 批量编辑不显示 WS mode 入口","duration":8.565299999999752,"failureMessages":[],"meta":{}},{"ancestorTitles":["BulkEditAccountModal"],"fullName":"BulkEditAccountModal OpenAI OAuth 批量编辑应提交 codex_cli_only 字段","status":"passed","title":"OpenAI OAuth 批量编辑应提交 codex_cli_only 字段","duration":12.755799999999908,"failureMessages":[],"meta":{}},{"ancestorTitles":["BulkEditAccountModal"],"fullName":"BulkEditAccountModal OpenAI OAuth 批量编辑应提交 codex_cli_only_allow_app_server 字段(需同时开启父开关)","status":"passed","title":"OpenAI OAuth 批量编辑应提交 codex_cli_only_allow_app_server 字段(需同时开启父开关)","duration":10.156500000000051,"failureMessages":[],"meta":{}},{"ancestorTitles":["BulkEditAccountModal"],"fullName":"BulkEditAccountModal 未同时开启父开关时不应写入 codex_cli_only_allow_app_server","status":"passed","title":"未同时开启父开关时不应写入 codex_cli_only_allow_app_server","duration":13.912699999999859,"failureMessages":[],"meta":{}},{"ancestorTitles":["BulkEditAccountModal"],"fullName":"BulkEditAccountModal OpenAI API Key 批量编辑应提交 API Key 专属 WS mode 字段","status":"passed","title":"OpenAI API Key 批量编辑应提交 API Key 专属 WS mode 字段","duration":11.223500000000058,"failureMessages":[],"meta":{}},{"ancestorTitles":["BulkEditAccountModal"],"fullName":"BulkEditAccountModal OpenAI 支持类型展示长上下文设置,混合平台隐藏全部新增设置","status":"passed","title":"OpenAI 支持类型展示长上下文设置,混合平台隐藏全部新增设置","duration":25.50019999999995,"failureMessages":[],"meta":{}},{"ancestorTitles":["BulkEditAccountModal"],"fullName":"BulkEditAccountModal 端点能力与 Responses 路由仅对全部 OpenAI API Key 目标展示","status":"passed","title":"端点能力与 Responses 路由仅对全部 OpenAI API Key 目标展示","duration":10.913700000000063,"failureMessages":[],"meta":{}},{"ancestorTitles":["BulkEditAccountModal"],"fullName":"BulkEditAccountModal 长上下文设置独立启用并提交布尔值","status":"passed","title":"长上下文设置独立启用并提交布尔值","duration":20.69719999999961,"failureMessages":[],"meta":{}},{"ancestorTitles":["BulkEditAccountModal"],"fullName":"BulkEditAccountModal 端点能力默认值提交 null,表示恢复两个默认端点","status":"passed","title":"端点能力默认值提交 null,表示恢复两个默认端点","duration":8.167500000000018,"failureMessages":[],"meta":{}},{"ancestorTitles":["BulkEditAccountModal"],"fullName":"BulkEditAccountModal Responses 路由独立启用,auto 提交 null,强制模式提交明确值","status":"passed","title":"Responses 路由独立启用,auto 提交 null,强制模式提交明确值","duration":18.203999999999724,"failureMessages":[],"meta":{}},{"ancestorTitles":["BulkEditAccountModal"],"fullName":"BulkEditAccountModal 仅启用 Embeddings 时恢复 Responses 自动模式并精确提交联动字段","status":"passed","title":"仅启用 Embeddings 时恢复 Responses 自动模式并精确提交联动字段","duration":12.552799999999934,"failureMessages":[],"meta":{}},{"ancestorTitles":["BulkEditAccountModal"],"fullName":"BulkEditAccountModal 关闭端点能力修改后 Responses 路由恢复独立可编辑","status":"passed","title":"关闭端点能力修改后 Responses 路由恢复独立可编辑","duration":10.619000000000142,"failureMessages":[],"meta":{}},{"ancestorTitles":["BulkEditAccountModal"],"fullName":"BulkEditAccountModal 目标变化后不提交已经隐藏的 OpenAI 设置","status":"passed","title":"目标变化后不提交已经隐藏的 OpenAI 设置","duration":9.423600000000079,"failureMessages":[],"meta":{}},{"ancestorTitles":["BulkEditAccountModal"],"fullName":"BulkEditAccountModal 至少保留一个端点能力","status":"passed","title":"至少保留一个端点能力","duration":10.394400000000132,"failureMessages":[],"meta":{}},{"ancestorTitles":["BulkEditAccountModal"],"fullName":"BulkEditAccountModal 关闭弹窗后重置新增设置的启用状态和值","status":"passed","title":"关闭弹窗后重置新增设置的启用状态和值","duration":10.79359999999997,"failureMessages":[],"meta":{}},{"ancestorTitles":["BulkEditAccountModal"],"fullName":"BulkEditAccountModal 筛选全量模式固定展示影子继承说明并按 filters 提交","status":"passed","title":"筛选全量模式固定展示影子继承说明并按 filters 提交","duration":18.522199999999884,"failureMessages":[],"meta":{}},{"ancestorTitles":["BulkEditAccountModal"],"fullName":"BulkEditAccountModal 成功响应包含影子继承数量时展示专用提示","status":"passed","title":"成功响应包含影子继承数量时展示专用提示","duration":6.899700000000394,"failureMessages":[],"meta":{}},{"ancestorTitles":["BulkEditAccountModal"],"fullName":"BulkEditAccountModal 部分成功且包含影子继承数量时展示组合提示","status":"passed","title":"部分成功且包含影子继承数量时展示组合提示","duration":6.259700000000066,"failureMessages":[],"meta":{}},{"ancestorTitles":["BulkEditAccountModal"],"fullName":"BulkEditAccountModal 全影子长上下文错误使用专用提示并保持弹窗打开","status":"passed","title":"全影子长上下文错误使用专用提示并保持弹窗打开","duration":7.4133999999999105,"failureMessages":[],"meta":{}},{"ancestorTitles":["BulkEditAccountModal"],"fullName":"BulkEditAccountModal OpenAI API Key 批量编辑可统一开启上游倍率自动探测","status":"passed","title":"OpenAI API Key 批量编辑可统一开启上游倍率自动探测","duration":7.913800000000265,"failureMessages":[],"meta":{}},{"ancestorTitles":["BulkEditAccountModal"],"fullName":"BulkEditAccountModal 非 OpenAI 平台的 API Key 批量编辑同样可开启上游倍率自动探测","status":"passed","title":"非 OpenAI 平台的 API Key 批量编辑同样可开启上游倍率自动探测","duration":5.987800000000334,"failureMessages":[],"meta":{}},{"ancestorTitles":["BulkEditAccountModal"],"fullName":"BulkEditAccountModal OpenAI API Key 批量编辑可统一关闭上游倍率自动探测","status":"passed","title":"OpenAI API Key 批量编辑可统一关闭上游倍率自动探测","duration":7.5427999999997155,"failureMessages":[],"meta":{}},{"ancestorTitles":["BulkEditAccountModal"],"fullName":"BulkEditAccountModal 非 OpenAI API Key 目标不显示上游倍率自动探测批量开关","status":"passed","title":"非 OpenAI API Key 目标不显示上游倍率自动探测批量开关","duration":5.759900000000016,"failureMessages":[],"meta":{}},{"ancestorTitles":["BulkEditAccountModal"],"fullName":"BulkEditAccountModal 筛选结果批量编辑可统一开启上游倍率自动探测","status":"passed","title":"筛选结果批量编辑可统一开启上游倍率自动探测","duration":8.579099999999926,"failureMessages":[],"meta":{}},{"ancestorTitles":["BulkEditAccountModal"],"fullName":"BulkEditAccountModal 筛选 OpenAI 账号批量编辑应提交 Compact 模式和专属模型映射","status":"passed","title":"筛选 OpenAI 账号批量编辑应提交 Compact 模式和专属模型映射","duration":9.206499999999778,"failureMessages":[],"meta":{}},{"ancestorTitles":["BulkEditAccountModal"],"fullName":"BulkEditAccountModal OpenAI 账号批量编辑可关闭自动透传","status":"passed","title":"OpenAI 账号批量编辑可关闭自动透传","duration":13.05619999999999,"failureMessages":[],"meta":{}},{"ancestorTitles":["BulkEditAccountModal"],"fullName":"BulkEditAccountModal 开启 OpenAI 自动透传时不再同时提交模型限制","status":"passed","title":"开启 OpenAI 自动透传时不再同时提交模型限制","duration":8.41740000000027,"failureMessages":[],"meta":{}},{"ancestorTitles":["BulkEditAccountModal"],"fullName":"BulkEditAccountModal filtered-results 模式下应提交 filters 而不是 account_ids","status":"passed","title":"filtered-results 模式下应提交 filters 而不是 account_ids","duration":8.188300000000254,"failureMessages":[],"meta":{}},{"ancestorTitles":["BulkEditAccountModal"],"fullName":"BulkEditAccountModal OpenAI OAuth 批量编辑选择「关闭」时应显式提交 codex_fingerprint_mode=off(issue #6327)","status":"passed","title":"OpenAI OAuth 批量编辑选择「关闭」时应显式提交 codex_fingerprint_mode=off(issue #6327)","duration":7.225699999999961,"failureMessages":[],"meta":{}},{"ancestorTitles":["BulkEditAccountModal"],"fullName":"BulkEditAccountModal OpenAI OAuth 批量编辑显式 opt-in 模式仍原样提交","status":"passed","title":"OpenAI OAuth 批量编辑显式 opt-in 模式仍原样提交","duration":7.573499999999967,"failureMessages":[],"meta":{}},{"ancestorTitles":["BulkEditAccountModal"],"fullName":"BulkEditAccountModal 未勾选编辑该项时不写入 codex_fingerprint_mode","status":"passed","title":"未勾选编辑该项时不写入 codex_fingerprint_mode","duration":6.708399999999983,"failureMessages":[],"meta":{}}],"startTime":1789442756027,"endTime":1789442756597.7085,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/components/account/__tests__/BulkEditAccountModal.spec.ts"},{"assertionResults":[{"ancestorTitles":["CNProviderBalanceCell"],"fullName":"CNProviderBalanceCell renders the persisted balance as static text with an explicit query action","status":"passed","title":"renders the persisted balance as static text with an explicit query action","duration":17.929200000000037,"failureMessages":[],"meta":{}},{"ancestorTitles":["CNProviderBalanceCell"],"fullName":"CNProviderBalanceCell shows the low-balance badge from the snapshot marker","status":"passed","title":"shows the low-balance badge from the snapshot marker","duration":1.4108999999999696,"failureMessages":[],"meta":{}},{"ancestorTitles":["CNProviderBalanceCell"],"fullName":"CNProviderBalanceCell keeps the snapshot balance visible when a query fails","status":"passed","title":"keeps the snapshot balance visible when a query fails","duration":3.456199999999967,"failureMessages":[],"meta":{}}],"startTime":1789442807363,"endTime":1789442807385.4563,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/components/account/__tests__/CNProviderBalanceCell.spec.ts"},{"assertionResults":[{"ancestorTitles":["CNProviderQuotaCell"],"fullName":"CNProviderQuotaCell renders tier rows through the shared UsageProgressBar inside the account table cell","status":"passed","title":"renders tier rows through the shared UsageProgressBar inside the account table cell","duration":23.411200000000008,"failureMessages":[],"meta":{}},{"ancestorTitles":["CNProviderQuotaCell"],"fullName":"CNProviderQuotaCell labels the refresh control with an explicit action verb, not a data caption","status":"passed","title":"labels the refresh control with an explicit action verb, not a data caption","duration":3.5890000000000555,"failureMessages":[],"meta":{}}],"startTime":1789442794530,"endTime":1789442794556.589,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/components/account/__tests__/CNProviderQuotaCell.spec.ts"},{"assertionResults":[{"ancestorTitles":["CreateAccountModal Grok account types"],"fullName":"CreateAccountModal Grok account types offers API-key setup alongside OAuth with the official xAI default","status":"passed","title":"offers API-key setup alongside OAuth with the official xAI default","duration":1.006399999999985,"failureMessages":[],"meta":{}},{"ancestorTitles":["CreateAccountModal Grok account types"],"fullName":"CreateAccountModal Grok account types exposes custom upstream URL and header override for the OAuth create flow","status":"passed","title":"exposes custom upstream URL and header override for the OAuth create flow","duration":0.19050000000004275,"failureMessages":[],"meta":{}},{"ancestorTitles":["CreateAccountModal Grok account types"],"fullName":"CreateAccountModal Grok account types validates and applies upstream config on Grok OAuth create paths","status":"passed","title":"validates and applies upstream config on Grok OAuth create paths","duration":0.2661999999999125,"failureMessages":[],"meta":{}},{"ancestorTitles":["CreateAccountModal Grok account types"],"fullName":"CreateAccountModal Grok account types hides Grok password authorize option in the create flow","status":"passed","title":"hides Grok password authorize option in the create flow","duration":0.09770000000003165,"failureMessages":[],"meta":{}}],"startTime":1789442814166,"endTime":1789442814168.266,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/components/account/__tests__/CreateAccountModal.grok.spec.ts"},{"assertionResults":[{"ancestorTitles":["CreateAccountModal OpenAI long-context billing"],"fullName":"CreateAccountModal OpenAI long-context billing sets month and year expiry presets without submitting the account form","status":"passed","title":"sets month and year expiry presets without submitting the account form","duration":141.1635000000001,"failureMessages":[],"meta":{}},{"ancestorTitles":["CreateAccountModal OpenAI long-context billing"],"fullName":"CreateAccountModal OpenAI long-context billing allows a manually entered expiry to override a preset before account creation","status":"passed","title":"allows a manually entered expiry to override a preset before account creation","duration":38.65149999999994,"failureMessages":[],"meta":{}},{"ancestorTitles":["CreateAccountModal OpenAI long-context billing"],"fullName":"CreateAccountModal OpenAI long-context billing hides only the redundant account toggle when every selected group enables tier pricing","status":"passed","title":"hides only the redundant account toggle when every selected group enables tier pricing","duration":18.124500000000126,"failureMessages":[],"meta":{}},{"ancestorTitles":["CreateAccountModal OpenAI long-context billing"],"fullName":"CreateAccountModal OpenAI long-context billing keeps the account toggle when any selected group disables tier pricing","status":"passed","title":"keeps the account toggle when any selected group disables tier pricing","duration":14.778999999999996,"failureMessages":[],"meta":{}},{"ancestorTitles":["CreateAccountModal OpenAI long-context billing"],"fullName":"CreateAccountModal OpenAI long-context billing sends false explicitly for normal OpenAI account creation by default","status":"passed","title":"sends false explicitly for normal OpenAI account creation by default","duration":26.18249999999989,"failureMessages":[],"meta":{}},{"ancestorTitles":["CreateAccountModal OpenAI long-context billing"],"fullName":"CreateAccountModal OpenAI long-context billing omits the upstream request id header from extra when left empty","status":"passed","title":"omits the upstream request id header from extra when left empty","duration":19.297199999999975,"failureMessages":[],"meta":{}},{"ancestorTitles":["CreateAccountModal OpenAI long-context billing"],"fullName":"CreateAccountModal OpenAI long-context billing sends the trimmed upstream request id header in extra when filled","status":"passed","title":"sends the trimmed upstream request id header in extra when filled","duration":19.040500000000065,"failureMessages":[],"meta":{}},{"ancestorTitles":["CreateAccountModal OpenAI long-context billing"],"fullName":"CreateAccountModal OpenAI long-context billing omits images_url_to_b64_json from extra by default","status":"passed","title":"omits images_url_to_b64_json from extra by default","duration":23.773699999999735,"failureMessages":[],"meta":{}},{"ancestorTitles":["CreateAccountModal OpenAI long-context billing"],"fullName":"CreateAccountModal OpenAI long-context billing sends images_url_to_b64_json in extra when the toggle is enabled","status":"passed","title":"sends images_url_to_b64_json in extra when the toggle is enabled","duration":24.190599999999904,"failureMessages":[],"meta":{}},{"ancestorTitles":["CreateAccountModal OpenAI long-context billing"],"fullName":"CreateAccountModal OpenAI long-context billing persists upstream model metadata after creating an account from preview","status":"passed","title":"persists upstream model metadata after creating an account from preview","duration":24.226700000000164,"failureMessages":[],"meta":{}},{"ancestorTitles":["CreateAccountModal OpenAI long-context billing"],"fullName":"CreateAccountModal OpenAI long-context billing includes the current concrete model mapping in preview credentials","status":"passed","title":"includes the current concrete model mapping in preview credentials","duration":17.138300000000072,"failureMessages":[],"meta":{}},{"ancestorTitles":["CreateAccountModal OpenAI long-context billing"],"fullName":"CreateAccountModal OpenAI long-context billing runs formal capability sync after creating an account with explicit mappings","status":"passed","title":"runs formal capability sync after creating an account with explicit mappings","duration":36.94250000000011,"failureMessages":[],"meta":{}},{"ancestorTitles":["CreateAccountModal OpenAI long-context billing"],"fullName":"CreateAccountModal OpenAI long-context billing warns when post-create capability metadata remains incomplete","status":"passed","title":"warns when post-create capability metadata remains incomplete","duration":40.005499999999756,"failureMessages":[],"meta":{}},{"ancestorTitles":["CreateAccountModal OpenAI long-context billing"],"fullName":"CreateAccountModal OpenAI long-context billing shows the Codex namespace flatten toggle only for OpenAI OAuth accounts","status":"passed","title":"shows the Codex namespace flatten toggle only for OpenAI OAuth accounts","duration":17.13760000000002,"failureMessages":[],"meta":{}},{"ancestorTitles":["CreateAccountModal OpenAI long-context billing"],"fullName":"CreateAccountModal OpenAI long-context billing enables upstream billing probes by default for new OpenAI API key accounts","status":"passed","title":"enables upstream billing probes by default for new OpenAI API key accounts","duration":15.785499999999956,"failureMessages":[],"meta":{}},{"ancestorTitles":["CreateAccountModal OpenAI long-context billing"],"fullName":"CreateAccountModal OpenAI long-context billing waits for the initial upstream billing probe before refreshing the account list","status":"passed","title":"waits for the initial upstream billing probe before refreshing the account list","duration":16.707100000000082,"failureMessages":[],"meta":{}},{"ancestorTitles":["CreateAccountModal OpenAI long-context billing"],"fullName":"CreateAccountModal OpenAI long-context billing sends an explicit disabled state when the create toggle is turned off","status":"passed","title":"sends an explicit disabled state when the create toggle is turned off","duration":28.434499999999844,"failureMessages":[],"meta":{}},{"ancestorTitles":["CreateAccountModal OpenAI long-context billing"],"fullName":"CreateAccountModal OpenAI long-context billing submits adaptive Kimi protocol endpoints","status":"passed","title":"submits adaptive Kimi protocol endpoints","duration":19.653699999999844,"failureMessages":[],"meta":{}},{"ancestorTitles":["CreateAccountModal OpenAI long-context billing"],"fullName":"CreateAccountModal OpenAI long-context billing submits adaptive Kimi Coding Plan Responses endpoint","status":"passed","title":"submits adaptive Kimi Coding Plan Responses endpoint","duration":19.646000000000186,"failureMessages":[],"meta":{}},{"ancestorTitles":["CreateAccountModal OpenAI long-context billing"],"fullName":"CreateAccountModal OpenAI long-context billing submits adaptive MiniMax protocol endpoints","status":"passed","title":"submits adaptive MiniMax protocol endpoints","duration":12.250600000000304,"failureMessages":[],"meta":{}},{"ancestorTitles":["CreateAccountModal OpenAI long-context billing"],"fullName":"CreateAccountModal OpenAI long-context billing uses the edited adaptive Chat endpoint when previewing upstream models","status":"passed","title":"uses the edited adaptive Chat endpoint when previewing upstream models","duration":15.042899999999918,"failureMessages":[],"meta":{}},{"ancestorTitles":["CreateAccountModal OpenAI long-context billing"],"fullName":"CreateAccountModal OpenAI long-context billing exposes Agent Identity in the OpenAI authorization methods","status":"passed","title":"exposes Agent Identity in the OpenAI authorization methods","duration":15.246500000000196,"failureMessages":[],"meta":{}},{"ancestorTitles":["CreateAccountModal OpenAI long-context billing"],"fullName":"CreateAccountModal OpenAI long-context billing accepts backend-compatible camelCase Agent Identity imports","status":"passed","title":"accepts backend-compatible camelCase Agent Identity imports","duration":22.040700000000015,"failureMessages":[],"meta":{}},{"ancestorTitles":["CreateAccountModal OpenAI long-context billing"],"fullName":"CreateAccountModal OpenAI long-context billing accepts backend-compatible nested identity without auth_mode Agent Identity imports","status":"passed","title":"accepts backend-compatible nested identity without auth_mode Agent Identity imports","duration":11.80219999999963,"failureMessages":[],"meta":{}},{"ancestorTitles":["CreateAccountModal OpenAI long-context billing"],"fullName":"CreateAccountModal OpenAI long-context billing sends true explicitly when OpenAI long-context billing is enabled","status":"passed","title":"sends true explicitly when OpenAI long-context billing is enabled","duration":20.846199999999953,"failureMessages":[],"meta":{}},{"ancestorTitles":["CreateAccountModal OpenAI long-context billing"],"fullName":"CreateAccountModal OpenAI long-context billing omits the OpenAI setting for non-OpenAI account creation","status":"passed","title":"omits the OpenAI setting for non-OpenAI account creation","duration":15.964100000000144,"failureMessages":[],"meta":{}},{"ancestorTitles":["CreateAccountModal OpenAI long-context billing"],"fullName":"CreateAccountModal OpenAI long-context billing sends an explicit disabled state when the non-OpenAI create toggle is turned off","status":"passed","title":"sends an explicit disabled state when the non-OpenAI create toggle is turned off","duration":14.11929999999984,"failureMessages":[],"meta":{}},{"ancestorTitles":["CreateAccountModal OpenAI long-context billing"],"fullName":"CreateAccountModal OpenAI long-context billing antigravity upstream 创建默认携带上游倍率探测开关","status":"passed","title":"antigravity upstream 创建默认携带上游倍率探测开关","duration":27.36940000000004,"failureMessages":[],"meta":{}},{"ancestorTitles":["CreateAccountModal OpenAI long-context billing"],"fullName":"CreateAccountModal OpenAI long-context billing leaves Codex session import billing ownership to the backend","status":"passed","title":"leaves Codex session import billing ownership to the backend","duration":12.253999999999905,"failureMessages":[],"meta":{}},{"ancestorTitles":["CreateAccountModal OpenAI long-context billing"],"fullName":"CreateAccountModal OpenAI long-context billing leaves Codex PAT import billing ownership to the backend","status":"passed","title":"leaves Codex PAT import billing ownership to the backend","duration":12.538000000000011,"failureMessages":[],"meta":{}},{"ancestorTitles":["CreateAccountModal OpenAI long-context billing"],"fullName":"CreateAccountModal OpenAI long-context billing sends explicit true for Codex session import after the toggle is enabled","status":"passed","title":"sends explicit true for Codex session import after the toggle is enabled","duration":14.545599999999922,"failureMessages":[],"meta":{}},{"ancestorTitles":["CreateAccountModal OpenAI long-context billing"],"fullName":"CreateAccountModal OpenAI long-context billing sends explicit false for Codex session import after the toggle is changed back","status":"passed","title":"sends explicit false for Codex session import after the toggle is changed back","duration":15.242799999999988,"failureMessages":[],"meta":{}},{"ancestorTitles":["CreateAccountModal OpenAI long-context billing"],"fullName":"CreateAccountModal OpenAI long-context billing sends explicit true for Codex PAT import after the toggle is enabled","status":"passed","title":"sends explicit true for Codex PAT import after the toggle is enabled","duration":14.73969999999963,"failureMessages":[],"meta":{}},{"ancestorTitles":["CreateAccountModal OpenAI long-context billing"],"fullName":"CreateAccountModal OpenAI long-context billing sends explicit false for Codex PAT import after the toggle is changed back","status":"passed","title":"sends explicit false for Codex PAT import after the toggle is changed back","duration":19.440999999999804,"failureMessages":[],"meta":{}}],"startTime":1789442759360,"endTime":1789442760164.441,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/components/account/__tests__/CreateAccountModal.spec.ts"},{"assertionResults":[{"ancestorTitles":["cnSupportsNativeResponses"],"fullName":"cnSupportsNativeResponses is true for DeepSeek, Kimi, and MiniMax","status":"passed","title":"is true for DeepSeek, Kimi, and MiniMax","duration":0.6788999999999987,"failureMessages":[],"meta":{}},{"ancestorTitles":["defaultCNAdaptiveBaseUrls"],"fullName":"defaultCNAdaptiveBaseUrls resolves Kimi endpoints by account mode","status":"passed","title":"resolves Kimi endpoints by account mode","duration":0.44870000000003074,"failureMessages":[],"meta":{}},{"ancestorTitles":["defaultCNAdaptiveBaseUrls"],"fullName":"defaultCNAdaptiveBaseUrls resolves GLM endpoints by account mode","status":"passed","title":"resolves GLM endpoints by account mode","duration":0.233600000000024,"failureMessages":[],"meta":{}},{"ancestorTitles":["defaultCNAdaptiveBaseUrls"],"fullName":"defaultCNAdaptiveBaseUrls includes all three native DeepSeek endpoints","status":"passed","title":"includes all three native DeepSeek endpoints","duration":0.11829999999997654,"failureMessages":[],"meta":{}},{"ancestorTitles":["defaultCNAdaptiveBaseUrls"],"fullName":"defaultCNAdaptiveBaseUrls uses the same MiniMax CN endpoints for payg and coding","status":"passed","title":"uses the same MiniMax CN endpoints for payg and coding","duration":0.09389999999996235,"failureMessages":[],"meta":{}}],"startTime":1789442807282,"endTime":1789442807284.094,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/components/account/__tests__/credentialsBuilder.cnAdaptive.spec.ts"},{"assertionResults":[{"ancestorTitles":["applyInterceptWarmup"],"fullName":"applyInterceptWarmup create + enabled=true: should set intercept_warmup_requests to true","status":"passed","title":"create + enabled=true: should set intercept_warmup_requests to true","duration":1.4858000000000402,"failureMessages":[],"meta":{}},{"ancestorTitles":["applyInterceptWarmup"],"fullName":"applyInterceptWarmup create + enabled=false: should not add the field","status":"passed","title":"create + enabled=false: should not add the field","duration":0.2925000000000182,"failureMessages":[],"meta":{}},{"ancestorTitles":["applyInterceptWarmup"],"fullName":"applyInterceptWarmup edit + enabled=true: should set intercept_warmup_requests to true","status":"passed","title":"edit + enabled=true: should set intercept_warmup_requests to true","duration":0.19010000000002947,"failureMessages":[],"meta":{}},{"ancestorTitles":["applyInterceptWarmup"],"fullName":"applyInterceptWarmup edit + enabled=false + field exists: should delete the field","status":"passed","title":"edit + enabled=false + field exists: should delete the field","duration":0.19440000000008695,"failureMessages":[],"meta":{}},{"ancestorTitles":["applyInterceptWarmup"],"fullName":"applyInterceptWarmup edit + enabled=false + field absent: should not throw","status":"passed","title":"edit + enabled=false + field absent: should not throw","duration":0.16650000000004184,"failureMessages":[],"meta":{}},{"ancestorTitles":["applyInterceptWarmup"],"fullName":"applyInterceptWarmup should not affect other fields","status":"passed","title":"should not affect other fields","duration":0.28160000000002583,"failureMessages":[],"meta":{}},{"ancestorTitles":["applyAntigravityProjectID"],"fullName":"applyAntigravityProjectID create + project id: trims and stores configured project fallback","status":"passed","title":"create + project id: trims and stores configured project fallback","duration":0.26919999999995525,"failureMessages":[],"meta":{}},{"ancestorTitles":["applyAntigravityProjectID"],"fullName":"applyAntigravityProjectID create + empty project id: should not add the field","status":"passed","title":"create + empty project id: should not add the field","duration":0.18209999999999127,"failureMessages":[],"meta":{}},{"ancestorTitles":["applyAntigravityProjectID"],"fullName":"applyAntigravityProjectID edit + empty project id: deletes existing fallback","status":"passed","title":"edit + empty project id: deletes existing fallback","duration":0.17830000000003565,"failureMessages":[],"meta":{}},{"ancestorTitles":["applyAntigravityProjectID"],"fullName":"applyAntigravityProjectID does not affect onboard project_id or other credentials","status":"passed","title":"does not affect onboard project_id or other credentials","duration":0.8823999999999614,"failureMessages":[],"meta":{}},{"ancestorTitles":["isHeaderOverrideCapable"],"fullName":"isHeaderOverrideCapable anthropic/openai only support apikey accounts","status":"passed","title":"anthropic/openai only support apikey accounts","duration":0.24930000000006203,"failureMessages":[],"meta":{}},{"ancestorTitles":["isHeaderOverrideCapable"],"fullName":"isHeaderOverrideCapable kimi/zhipu/deepseek only support apikey accounts","status":"passed","title":"kimi/zhipu/deepseek only support apikey accounts","duration":0.3123000000000502,"failureMessages":[],"meta":{}},{"ancestorTitles":["isHeaderOverrideCapable"],"fullName":"isHeaderOverrideCapable grok supports both apikey and oauth accounts","status":"passed","title":"grok supports both apikey and oauth accounts","duration":0.1935000000000855,"failureMessages":[],"meta":{}},{"ancestorTitles":["isHeaderOverrideCapable"],"fullName":"isHeaderOverrideCapable other platforms are not supported","status":"passed","title":"other platforms are not supported","duration":0.12270000000000891,"failureMessages":[],"meta":{}},{"ancestorTitles":["parseHeaderOverridesJson"],"fullName":"parseHeaderOverridesJson parses a flat object and normalizes values to trimmed strings","status":"passed","title":"parses a flat object and normalizes values to trimmed strings","duration":10.739000000000033,"failureMessages":[],"meta":{}},{"ancestorTitles":["parseHeaderOverridesJson"],"fullName":"parseHeaderOverridesJson drops entries with blank names","status":"passed","title":"drops entries with blank names","duration":0.32590000000004693,"failureMessages":[],"meta":{}},{"ancestorTitles":["parseHeaderOverridesJson"],"fullName":"parseHeaderOverridesJson rejects invalid JSON, arrays, primitives and nested values","status":"passed","title":"rejects invalid JSON, arrays, primitives and nested values","duration":0.4148999999999887,"failureMessages":[],"meta":{}},{"ancestorTitles":["parseHeaderOverridesJson"],"fullName":"parseHeaderOverridesJson parses an empty object to an empty row list","status":"passed","title":"parses an empty object to an empty row list","duration":0.1595999999999549,"failureMessages":[],"meta":{}},{"ancestorTitles":["serializeHeaderOverrideRows"],"fullName":"serializeHeaderOverrideRows serializes named rows and skips empty placeholder rows","status":"passed","title":"serializes named rows and skips empty placeholder rows","duration":0.25900000000001455,"failureMessages":[],"meta":{}},{"ancestorTitles":["serializeHeaderOverrideRows"],"fullName":"serializeHeaderOverrideRows round-trips with parseHeaderOverridesJson","status":"passed","title":"round-trips with parseHeaderOverridesJson","duration":0.21050000000002456,"failureMessages":[],"meta":{}},{"ancestorTitles":["isCustomGrokBaseUrl"],"fullName":"isCustomGrokBaseUrl treats only the default CLI gateway host as not customized","status":"passed","title":"treats only the default CLI gateway host as not customized","duration":1.1825000000000045,"failureMessages":[],"meta":{}},{"ancestorTitles":["isCustomGrokBaseUrl"],"fullName":"isCustomGrokBaseUrl treats manually switched official/regional endpoints as customized (must echo back)","status":"passed","title":"treats manually switched official/regional endpoints as customized (must echo back)","duration":0.7417000000000371,"failureMessages":[],"meta":{}},{"ancestorTitles":["isCustomGrokBaseUrl"],"fullName":"isCustomGrokBaseUrl treats empty, non-string and unparseable values as not customized","status":"passed","title":"treats empty, non-string and unparseable values as not customized","duration":0.4916999999999234,"failureMessages":[],"meta":{}},{"ancestorTitles":["isCustomGrokBaseUrl"],"fullName":"isCustomGrokBaseUrl treats third-party hosts as customized","status":"passed","title":"treats third-party hosts as customized","duration":0.7824000000000524,"failureMessages":[],"meta":{}},{"ancestorTitles":["GROK_BASE_URL_PRESETS"],"fullName":"GROK_BASE_URL_PRESETS covers the CLI gateway, official API and regional endpoints","status":"passed","title":"covers the CLI gateway, official API and regional endpoints","duration":1.3834000000000515,"failureMessages":[],"meta":{}},{"ancestorTitles":["validateHeaderOverrideRows"],"fullName":"validateHeaderOverrideRows accepts valid rows and empty placeholder rows","status":"passed","title":"accepts valid rows and empty placeholder rows","duration":0.411200000000008,"failureMessages":[],"meta":{}},{"ancestorTitles":["validateHeaderOverrideRows"],"fullName":"validateHeaderOverrideRows rejects empty name with non-empty value","status":"passed","title":"rejects empty name with non-empty value","duration":0.1656999999999016,"failureMessages":[],"meta":{}},{"ancestorTitles":["validateHeaderOverrideRows"],"fullName":"validateHeaderOverrideRows rejects invalid header names","status":"passed","title":"rejects invalid header names","duration":0.217899999999986,"failureMessages":[],"meta":{}},{"ancestorTitles":["validateHeaderOverrideRows"],"fullName":"validateHeaderOverrideRows rejects blocked header names case-insensitively","status":"passed","title":"rejects blocked header names case-insensitively","duration":0.31169999999997344,"failureMessages":[],"meta":{}},{"ancestorTitles":["validateHeaderOverrideRows"],"fullName":"validateHeaderOverrideRows rejects duplicate names case-insensitively","status":"passed","title":"rejects duplicate names case-insensitively","duration":0.14679999999998472,"failureMessages":[],"meta":{}},{"ancestorTitles":["buildHeaderOverridesObject / splitHeaderOverridesObject"],"fullName":"buildHeaderOverridesObject / splitHeaderOverridesObject lowercases names, trims values and drops empty-name rows","status":"passed","title":"lowercases names, trims values and drops empty-name rows","duration":0.25929999999993925,"failureMessages":[],"meta":{}},{"ancestorTitles":["buildHeaderOverridesObject / splitHeaderOverridesObject"],"fullName":"buildHeaderOverridesObject / splitHeaderOverridesObject splits an object into sorted rows and ignores non-string values","status":"passed","title":"splits an object into sorted rows and ignores non-string values","duration":0.4236999999999398,"failureMessages":[],"meta":{}},{"ancestorTitles":["buildHeaderOverridesObject / splitHeaderOverridesObject"],"fullName":"buildHeaderOverridesObject / splitHeaderOverridesObject roundtrips through build and split","status":"passed","title":"roundtrips through build and split","duration":0.1671000000000049,"failureMessages":[],"meta":{}},{"ancestorTitles":["applyHeaderOverride"],"fullName":"applyHeaderOverride create + enabled: writes enabled flag and overrides object","status":"passed","title":"create + enabled: writes enabled flag and overrides object","duration":0.25290000000006785,"failureMessages":[],"meta":{}},{"ancestorTitles":["applyHeaderOverride"],"fullName":"applyHeaderOverride create + disabled: does not add fields","status":"passed","title":"create + disabled: does not add fields","duration":0.12979999999993197,"failureMessages":[],"meta":{}},{"ancestorTitles":["applyHeaderOverride"],"fullName":"applyHeaderOverride edit + disabled: deletes existing fields","status":"passed","title":"edit + disabled: deletes existing fields","duration":0.30110000000001946,"failureMessages":[],"meta":{}},{"ancestorTitles":["applyHeaderOverride"],"fullName":"applyHeaderOverride edit + enabled: replaces overrides object wholesale","status":"passed","title":"edit + enabled: replaces overrides object wholesale","duration":0.15760000000000218,"failureMessages":[],"meta":{}},{"ancestorTitles":["validateHeaderOverrideRows value/entry limits"],"fullName":"validateHeaderOverrideRows value/entry limits rejects websocket handshake headers","status":"passed","title":"rejects websocket handshake headers","duration":0.1711999999999989,"failureMessages":[],"meta":{}},{"ancestorTitles":["validateHeaderOverrideRows value/entry limits"],"fullName":"validateHeaderOverrideRows value/entry limits rejects control characters in values","status":"passed","title":"rejects control characters in values","duration":0.12800000000004275,"failureMessages":[],"meta":{}},{"ancestorTitles":["validateHeaderOverrideRows value/entry limits"],"fullName":"validateHeaderOverrideRows value/entry limits rejects oversized values","status":"passed","title":"rejects oversized values","duration":0.28330000000005384,"failureMessages":[],"meta":{}},{"ancestorTitles":["validateHeaderOverrideRows value/entry limits"],"fullName":"validateHeaderOverrideRows value/entry limits measures value length in UTF-8 bytes to match backend","status":"passed","title":"measures value length in UTF-8 bytes to match backend","duration":0.3242999999999938,"failureMessages":[],"meta":{}},{"ancestorTitles":["validateHeaderOverrideRows value/entry limits"],"fullName":"validateHeaderOverrideRows value/entry limits rejects too many entries","status":"passed","title":"rejects too many entries","duration":0.37030000000004293,"failureMessages":[],"meta":{}},{"ancestorTitles":["validateHeaderOverrideRows session isolation headers"],"fullName":"validateHeaderOverrideRows session isolation headers rejects per-request session headers","status":"passed","title":"rejects per-request session headers","duration":0.25890000000003965,"failureMessages":[],"meta":{}},{"ancestorTitles":["validateHeaderOverrideRows session isolation headers"],"fullName":"validateHeaderOverrideRows session isolation headers allows tab inside value","status":"passed","title":"allows tab inside value","duration":0.21739999999999782,"failureMessages":[],"meta":{}},{"ancestorTitles":["validateHeaderOverrideRows session isolation headers"],"fullName":"validateHeaderOverrideRows session isolation headers rejects oversized names","status":"passed","title":"rejects oversized names","duration":0.1778999999999087,"failureMessages":[],"meta":{}},{"ancestorTitles":["plan_type helpers","planTypeDisplayLabel"],"fullName":"plan_type helpers planTypeDisplayLabel maps canonical + alias values to friendly labels","status":"passed","title":"maps canonical + alias values to friendly labels","duration":0.3199000000000751,"failureMessages":[],"meta":{}},{"ancestorTitles":["plan_type helpers","planTypeDisplayLabel"],"fullName":"plan_type helpers planTypeDisplayLabel returns unknown values verbatim","status":"passed","title":"returns unknown values verbatim","duration":0.0965000000001055,"failureMessages":[],"meta":{}},{"ancestorTitles":["plan_type helpers","readPlanType"],"fullName":"plan_type helpers readPlanType reads a string plan_type","status":"passed","title":"reads a string plan_type","duration":0.13040000000000873,"failureMessages":[],"meta":{}},{"ancestorTitles":["plan_type helpers","readPlanType"],"fullName":"plan_type helpers readPlanType treats non-string / missing values as empty","status":"passed","title":"treats non-string / missing values as empty","duration":0.17570000000000618,"failureMessages":[],"meta":{}},{"ancestorTitles":["plan_type helpers","buildPlanTypeOptions"],"fullName":"plan_type helpers buildPlanTypeOptions returns clear + presets when current is empty","status":"passed","title":"returns clear + presets when current is empty","duration":0.28359999999997854,"failureMessages":[],"meta":{}},{"ancestorTitles":["plan_type helpers","buildPlanTypeOptions"],"fullName":"plan_type helpers buildPlanTypeOptions keeps canonical chatgptpro under a single friendly \"Pro\" option (no duplicate)","status":"passed","title":"keeps canonical chatgptpro under a single friendly \"Pro\" option (no duplicate)","duration":0.7665000000000646,"failureMessages":[],"meta":{}},{"ancestorTitles":["plan_type helpers","buildPlanTypeOptions"],"fullName":"plan_type helpers buildPlanTypeOptions appends an unknown-but-labeled value (team) as its own option","status":"passed","title":"appends an unknown-but-labeled value (team) as its own option","duration":0.25739999999996144,"failureMessages":[],"meta":{}},{"ancestorTitles":["plan_type helpers","buildPlanTypeOptions"],"fullName":"plan_type helpers buildPlanTypeOptions appends a fully custom value with a raw label","status":"passed","title":"appends a fully custom value with a raw label","duration":0.13210000000003674,"failureMessages":[],"meta":{}},{"ancestorTitles":["plan_type helpers","buildPlanTypeOptions"],"fullName":"plan_type helpers buildPlanTypeOptions does not duplicate an exact preset value","status":"passed","title":"does not duplicate an exact preset value","duration":0.2866000000000213,"failureMessages":[],"meta":{}},{"ancestorTitles":["plan_type helpers","applyPlanType"],"fullName":"plan_type helpers applyPlanType sets plan_type and preserves all other credential keys","status":"passed","title":"sets plan_type and preserves all other credential keys","duration":0.21029999999996107,"failureMessages":[],"meta":{}},{"ancestorTitles":["plan_type helpers","applyPlanType"],"fullName":"plan_type helpers applyPlanType trims the value","status":"passed","title":"trims the value","duration":0.1107000000000653,"failureMessages":[],"meta":{}},{"ancestorTitles":["plan_type helpers","applyPlanType"],"fullName":"plan_type helpers applyPlanType deletes the key when cleared (empty), keeping other keys","status":"passed","title":"deletes the key when cleared (empty), keeping other keys","duration":0.1494000000000142,"failureMessages":[],"meta":{}}],"startTime":1789442764034,"endTime":1789442764065.2102,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/components/account/__tests__/credentialsBuilder.spec.ts"},{"assertionResults":[{"ancestorTitles":["EditAccountModal account protection"],"fullName":"EditAccountModal account protection keeps both mode buttons available, including previewing the active mode","status":"passed","title":"keeps both mode buttons available, including previewing the active mode","duration":227.56040000000007,"failureMessages":[],"meta":{}},{"ancestorTitles":["EditAccountModal account protection"],"fullName":"EditAccountModal account protection lets legacy observe request integrity without switching identity or TLS","status":"passed","title":"lets legacy observe request integrity without switching identity or TLS","duration":84.56970000000001,"failureMessages":[],"meta":{}},{"ancestorTitles":["EditAccountModal account protection"],"fullName":"EditAccountModal account protection lets the administrator explicitly disable mode1 request integrity","status":"passed","title":"lets the administrator explicitly disable mode1 request integrity","duration":52.53800000000001,"failureMessages":[],"meta":{}},{"ancestorTitles":["EditAccountModal account protection"],"fullName":"EditAccountModal account protection allows a concurrency value above strategy presets without changing the strategy","status":"passed","title":"allows a concurrency value above strategy presets without changing the strategy","duration":49.85850000000028,"failureMessages":[],"meta":{}},{"ancestorTitles":["EditAccountModal account protection"],"fullName":"EditAccountModal account protection exposes the original sub2 strategy as an explicit third option","status":"passed","title":"exposes the original sub2 strategy as an explicit third option","duration":72.49489999999969,"failureMessages":[],"meta":{}},{"ancestorTitles":["EditAccountModal account protection"],"fullName":"EditAccountModal account protection shows backend policy details and issues without claiming enabled markers are healthy","status":"passed","title":"shows backend policy details and issues without claiming enabled markers are healthy","duration":34.51080000000002,"failureMessages":[],"meta":{}},{"ancestorTitles":["EditAccountModal account protection"],"fullName":"EditAccountModal account protection only labels verified configuration as enabled and detects missing identity or TLS","status":"passed","title":"only labels verified configuration as enabled and detects missing identity or TLS","duration":37.553100000000086,"failureMessages":[],"meta":{}},{"ancestorTitles":["EditAccountModal account protection"],"fullName":"EditAccountModal account protection does not force the switch on when apply returns a disabled account","status":"passed","title":"does not force the switch on when apply returns a disabled account","duration":48.551400000000285,"failureMessages":[],"meta":{}},{"ancestorTitles":["EditAccountModal account protection"],"fullName":"EditAccountModal account protection shows v2 migration and recognizes v3 standard transport as configured","status":"passed","title":"shows v2 migration and recognizes v3 standard transport as configured","duration":43.10069999999996,"failureMessages":[],"meta":{}},{"ancestorTitles":["EditAccountModal account protection"],"fullName":"EditAccountModal account protection keeps returned mode1 fields across stale prop replacement, reopening and ordinary save","status":"passed","title":"keeps returned mode1 fields across stale prop replacement, reopening and ordinary save","duration":86.0306999999998,"failureMessages":[],"meta":{}},{"ancestorTitles":["EditAccountModal account protection"],"fullName":"EditAccountModal account protection switches to mode2 and restores complete server values on revert despite older props","status":"passed","title":"switches to mode2 and restores complete server values on revert despite older props","duration":147.18269999999984,"failureMessages":[],"meta":{}},{"ancestorTitles":["EditAccountModal account protection"],"fullName":"EditAccountModal account protection uses the returned marker when revert does not disable the configuration","status":"passed","title":"uses the returned marker when revert does not disable the configuration","duration":39.753600000000006,"failureMessages":[],"meta":{}},{"ancestorTitles":["EditAccountModal account protection"],"fullName":"EditAccountModal account protection retains an apply response arriving while closed and prevents overlapping ordinary save","status":"passed","title":"retains an apply response arriving while closed and prevents overlapping ordinary save","duration":57.527900000000045,"failureMessages":[],"meta":{}},{"ancestorTitles":["EditAccountModal account protection"],"fullName":"EditAccountModal account protection clears returned policy overrides for another account and accepts genuinely newer props","status":"passed","title":"clears returned policy overrides for another account and accepts genuinely newer props","duration":67.58870000000024,"failureMessages":[],"meta":{}},{"ancestorTitles":["EditAccountModal account protection"],"fullName":"EditAccountModal account protection does not show an unsupported apply action and ignores preview completion after close","status":"passed","title":"does not show an unsupported apply action and ignores preview completion after close","duration":97.85159999999996,"failureMessages":[],"meta":{}}],"startTime":1789442767366,"endTime":1789442768512.8516,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/components/account/__tests__/EditAccountModal.antiDegrade.spec.ts"},{"assertionResults":[{"ancestorTitles":["EditAccountModal Grok media eligibility"],"fullName":"EditAccountModal Grok media eligibility shows only for Grok OAuth and fills the current decision","status":"passed","title":"shows only for Grok OAuth and fills the current decision","duration":98.46890000000008,"failureMessages":[],"meta":{}},{"ancestorTitles":["EditAccountModal Grok media eligibility"],"fullName":"EditAccountModal Grok media eligibility updates the dedicated endpoint only when the mode changes","status":"passed","title":"updates the dedicated endpoint only when the mode changes","duration":22.31280000000004,"failureMessages":[],"meta":{}},{"ancestorTitles":["EditAccountModal Grok media eligibility"],"fullName":"EditAccountModal Grok media eligibility reports partial-save errors when the dedicated endpoint fails","status":"passed","title":"reports partial-save errors when the dedicated endpoint fails","duration":20.198200000000043,"failureMessages":[],"meta":{}}],"startTime":1789442789081,"endTime":1789442789222.1982,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/components/account/__tests__/EditAccountModal.grokMediaEligibility.spec.ts"},{"assertionResults":[{"ancestorTitles":["EditAccountModal Grok OAuth upstream config"],"fullName":"EditAccountModal Grok OAuth upstream config enabling the custom base URL toggle and saving persists base_url","status":"passed","title":"enabling the custom base URL toggle and saving persists base_url","duration":85.73289999999997,"failureMessages":[],"meta":{}},{"ancestorTitles":["EditAccountModal Grok OAuth upstream config"],"fullName":"EditAccountModal Grok OAuth upstream config accepts the official API host as a manual endpoint switch and persists it","status":"passed","title":"accepts the official API host as a manual endpoint switch and persists it","duration":28.729600000000005,"failureMessages":[],"meta":{}},{"ancestorTitles":["EditAccountModal Grok OAuth upstream config"],"fullName":"EditAccountModal Grok OAuth upstream config echoes a stored official API endpoint with the toggle on","status":"passed","title":"echoes a stored official API endpoint with the toggle on","duration":12.81899999999996,"failureMessages":[],"meta":{}},{"ancestorTitles":["EditAccountModal Grok OAuth upstream config"],"fullName":"EditAccountModal Grok OAuth upstream config fills the input from an endpoint preset chip","status":"passed","title":"fills the input from an endpoint preset chip","duration":12.95959999999991,"failureMessages":[],"meta":{}},{"ancestorTitles":["EditAccountModal Grok OAuth upstream config"],"fullName":"EditAccountModal Grok OAuth upstream config loads an existing custom base_url with the toggle on and keeps it on save","status":"passed","title":"loads an existing custom base_url with the toggle on and keeps it on save","duration":13.849000000000046,"failureMessages":[],"meta":{}},{"ancestorTitles":["EditAccountModal Grok OAuth upstream config"],"fullName":"EditAccountModal Grok OAuth upstream config keeps stored header overrides intact on an untouched save","status":"passed","title":"keeps stored header overrides intact on an untouched save","duration":48.4602000000001,"failureMessages":[],"meta":{}},{"ancestorTitles":["EditAccountModal Grok OAuth upstream config"],"fullName":"EditAccountModal Grok OAuth upstream config shows the client-tool cache switch only for Grok OAuth accounts","status":"passed","title":"shows the client-tool cache switch only for Grok OAuth accounts","duration":50.76440000000002,"failureMessages":[],"meta":{}},{"ancestorTitles":["EditAccountModal Grok OAuth upstream config"],"fullName":"EditAccountModal Grok OAuth upstream config loads and disables client-tool caching while preserving unrelated extra fields","status":"passed","title":"loads and disables client-tool caching while preserving unrelated extra fields","duration":14.982999999999947,"failureMessages":[],"meta":{}},{"ancestorTitles":["EditAccountModal Grok OAuth upstream config"],"fullName":"EditAccountModal Grok OAuth upstream config defaults client-tool caching on when the setting is missing and persists explicit true","status":"passed","title":"defaults client-tool caching on when the setting is missing and persists explicit true","duration":14.635100000000193,"failureMessages":[],"meta":{}},{"ancestorTitles":["EditAccountModal Grok OAuth upstream config"],"fullName":"EditAccountModal Grok OAuth upstream config keeps an explicit false opt-out when saving an untouched account","status":"passed","title":"keeps an explicit false opt-out when saving an untouched account","duration":11.340599999999995,"failureMessages":[],"meta":{}},{"ancestorTitles":["EditAccountModal Grok OAuth upstream config"],"fullName":"EditAccountModal Grok OAuth upstream config shows malformed cache settings as disabled so the UI matches the fail-closed backend","status":"passed","title":"shows malformed cache settings as disabled so the UI matches the fail-closed backend","duration":7.974699999999984,"failureMessages":[],"meta":{}}],"startTime":1789442774999,"endTime":1789442775301.9746,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/components/account/__tests__/EditAccountModal.grokUpstream.spec.ts"},{"assertionResults":[{"ancestorTitles":["EditAccountModal"],"fullName":"EditAccountModal sets expiry presets from now instead of extending the saved expiry","status":"passed","title":"sets expiry presets from now instead of extending the saved expiry","duration":128.90899999999965,"failureMessages":[],"meta":{}},{"ancestorTitles":["EditAccountModal"],"fullName":"EditAccountModal can clear a selected expiry preset before saving the account","status":"passed","title":"can clear a selected expiry preset before saving the account","duration":35.90039999999999,"failureMessages":[],"meta":{}},{"ancestorTitles":["EditAccountModal"],"fullName":"EditAccountModal allows removing assigned inactive groups and undoing the selection before saving","status":"passed","title":"allows removing assigned inactive groups and undoing the selection before saving","duration":50.22380000000021,"failureMessages":[],"meta":{}},{"ancestorTitles":["EditAccountModal"],"fullName":"EditAccountModal reopening the same account rehydrates the OpenAI whitelist from props","status":"passed","title":"reopening the same account rehydrates the OpenAI whitelist from props","duration":41.307300000000396,"failureMessages":[],"meta":{}},{"ancestorTitles":["EditAccountModal"],"fullName":"EditAccountModal preserves adaptive Kimi Responses endpoint on submit","status":"passed","title":"preserves adaptive Kimi Responses endpoint on submit","duration":13.942199999999957,"failureMessages":[],"meta":{}},{"ancestorTitles":["EditAccountModal"],"fullName":"EditAccountModal preserves adaptive GLM endpoints on submit","status":"passed","title":"preserves adaptive GLM endpoints on submit","duration":14.003300000000309,"failureMessages":[],"meta":{}},{"ancestorTitles":["EditAccountModal"],"fullName":"EditAccountModal preserves a custom CN relay for explicit Chat Completions accounts","status":"passed","title":"preserves a custom CN relay for explicit Chat Completions accounts","duration":14.262899999999718,"failureMessages":[],"meta":{}},{"ancestorTitles":["EditAccountModal"],"fullName":"EditAccountModal preserves a custom CN relay for legacy missing protocol accounts","status":"passed","title":"preserves a custom CN relay for legacy missing protocol accounts","duration":17.32420000000002,"failureMessages":[],"meta":{}},{"ancestorTitles":["EditAccountModal"],"fullName":"EditAccountModal uses the legacy base_url when adaptive endpoints are missing","status":"passed","title":"uses the legacy base_url when adaptive endpoints are missing","duration":15.54989999999998,"failureMessages":[],"meta":{}},{"ancestorTitles":["EditAccountModal"],"fullName":"EditAccountModal carries a fixed Chat relay into Adaptive when the user switches protocols","status":"passed","title":"carries a fixed Chat relay into Adaptive when the user switches protocols","duration":19.206900000000132,"failureMessages":[],"meta":{}},{"ancestorTitles":["EditAccountModal"],"fullName":"EditAccountModal keeps a fixed 'Anthropic' relay in its protocol slot when switching to Adaptive","status":"passed","title":"keeps a fixed 'Anthropic' relay in its protocol slot when switching to Adaptive","duration":14.802999999999884,"failureMessages":[],"meta":{}},{"ancestorTitles":["EditAccountModal"],"fullName":"EditAccountModal keeps a fixed 'Responses' relay in its protocol slot when switching to Adaptive","status":"passed","title":"keeps a fixed 'Responses' relay in its protocol slot when switching to Adaptive","duration":14.182999999999993,"failureMessages":[],"meta":{}},{"ancestorTitles":["EditAccountModal"],"fullName":"EditAccountModal preserves model mappings when editing the whitelist","status":"passed","title":"preserves model mappings when editing the whitelist","duration":21.79029999999966,"failureMessages":[],"meta":{}},{"ancestorTitles":["EditAccountModal"],"fullName":"EditAccountModal submits OpenAI compact mode and compact-only model mapping","status":"passed","title":"submits OpenAI compact mode and compact-only model mapping","duration":20.399399999999787,"failureMessages":[],"meta":{}},{"ancestorTitles":["EditAccountModal"],"fullName":"EditAccountModal loads and submits the per-account OpenAI long-context billing toggle","status":"passed","title":"loads and submits the per-account OpenAI long-context billing toggle","duration":23.125800000000254,"failureMessages":[],"meta":{}},{"ancestorTitles":["EditAccountModal"],"fullName":"EditAccountModal loads and clears the OAuth-only Codex namespace flatten toggle","status":"passed","title":"loads and clears the OAuth-only Codex namespace flatten toggle","duration":17.433199999999943,"failureMessages":[],"meta":{}},{"ancestorTitles":["EditAccountModal"],"fullName":"EditAccountModal submits the Codex namespace flatten toggle when switched on","status":"passed","title":"submits the Codex namespace flatten toggle when switched on","duration":14.689900000000307,"failureMessages":[],"meta":{}},{"ancestorTitles":["EditAccountModal"],"fullName":"EditAccountModal writes the upstream request id header into extra only when it changes","status":"passed","title":"writes the upstream request id header into extra only when it changes","duration":38.066299999999956,"failureMessages":[],"meta":{}},{"ancestorTitles":["EditAccountModal"],"fullName":"EditAccountModal removes the upstream request id header from extra when cleared","status":"passed","title":"removes the upstream request id header from extra when cleared","duration":20.599899999999707,"failureMessages":[],"meta":{}},{"ancestorTitles":["EditAccountModal"],"fullName":"EditAccountModal writes images_url_to_b64_json into extra when toggled on","status":"passed","title":"writes images_url_to_b64_json into extra when toggled on","duration":27.47550000000001,"failureMessages":[],"meta":{}},{"ancestorTitles":["EditAccountModal"],"fullName":"EditAccountModal removes images_url_to_b64_json from extra when toggled off","status":"passed","title":"removes images_url_to_b64_json from extra when toggled off","duration":19.296899999999823,"failureMessages":[],"meta":{}},{"ancestorTitles":["EditAccountModal"],"fullName":"EditAccountModal hides the Codex namespace flatten toggle for non-OAuth OpenAI accounts","status":"passed","title":"hides the Codex namespace flatten toggle for non-OAuth OpenAI accounts","duration":10.271300000000338,"failureMessages":[],"meta":{}},{"ancestorTitles":["EditAccountModal"],"fullName":"EditAccountModal defaults legacy OpenAI accounts to long-context billing disabled","status":"passed","title":"defaults legacy OpenAI accounts to long-context billing disabled","duration":19.551100000000133,"failureMessages":[],"meta":{}},{"ancestorTitles":["EditAccountModal"],"fullName":"EditAccountModal does not render or submit the long-context billing toggle for Spark shadow accounts","status":"passed","title":"does not render or submit the long-context billing toggle for Spark shadow accounts","duration":12.45620000000008,"failureMessages":[],"meta":{}},{"ancestorTitles":["EditAccountModal"],"fullName":"EditAccountModal preserves an explicit OpenAI long-context billing opt-out","status":"passed","title":"preserves an explicit OpenAI long-context billing opt-out","duration":20.823100000000068,"failureMessages":[],"meta":{}},{"ancestorTitles":["EditAccountModal"],"fullName":"EditAccountModal fails closed for malformed OpenAI long-context billing values","status":"passed","title":"fails closed for malformed OpenAI long-context billing values","duration":14.221900000000005,"failureMessages":[],"meta":{}},{"ancestorTitles":["EditAccountModal"],"fullName":"EditAccountModal loads and submits Grok OAuth model mapping edits","status":"passed","title":"loads and submits Grok OAuth model mapping edits","duration":13.894900000000234,"failureMessages":[],"meta":{}},{"ancestorTitles":["EditAccountModal"],"fullName":"EditAccountModal uses the official xAI base URL when a Grok API-key account omits base_url","status":"passed","title":"uses the official xAI base URL when a Grok API-key account omits base_url","duration":11.174999999999727,"failureMessages":[],"meta":{}},{"ancestorTitles":["EditAccountModal"],"fullName":"EditAccountModal only submits model mapping credentials when saving an OpenAI spark shadow account","status":"passed","title":"only submits model mapping credentials when saving an OpenAI spark shadow account","duration":12.490099999999984,"failureMessages":[],"meta":{}},{"ancestorTitles":["EditAccountModal"],"fullName":"EditAccountModal submits OpenAI APIKey Responses support override mode","status":"passed","title":"submits OpenAI APIKey Responses support override mode","duration":22.861599999999726,"failureMessages":[],"meta":{}},{"ancestorTitles":["EditAccountModal"],"fullName":"EditAccountModal submits the account upstream billing auto-probe setting","status":"passed","title":"submits the account upstream billing auto-probe setting","duration":17.842499999999745,"failureMessages":[],"meta":{}},{"ancestorTitles":["EditAccountModal"],"fullName":"EditAccountModal exposes the upstream billing auto-probe toggle for non-OpenAI API-key accounts","status":"passed","title":"exposes the upstream billing auto-probe toggle for non-OpenAI API-key accounts","duration":12.179499999999734,"failureMessages":[],"meta":{}},{"ancestorTitles":["EditAccountModal"],"fullName":"EditAccountModal enabling rate sync also enables probing and stops submitting a manual rate","status":"passed","title":"enabling rate sync also enables probing and stops submitting a manual rate","duration":16.06860000000006,"failureMessages":[],"meta":{}},{"ancestorTitles":["EditAccountModal"],"fullName":"EditAccountModal disabling probing also disables rate sync and restores manual rate editing","status":"passed","title":"disabling probing also disables rate sync and restores manual rate editing","duration":19.31979999999976,"failureMessages":[],"meta":{}},{"ancestorTitles":["EditAccountModal"],"fullName":"EditAccountModal disabling only rate sync keeps automatic probing enabled","status":"passed","title":"disabling only rate sync keeps automatic probing enabled","duration":21.104499999999916,"failureMessages":[],"meta":{}},{"ancestorTitles":["EditAccountModal"],"fullName":"EditAccountModal clears OpenAI APIKey Responses override when set back to auto","status":"passed","title":"clears OpenAI APIKey Responses override when set back to auto","duration":14.918299999999817,"failureMessages":[],"meta":{}},{"ancestorTitles":["EditAccountModal"],"fullName":"EditAccountModal submits OpenAI APIKey endpoint capabilities from credentials","status":"passed","title":"submits OpenAI APIKey endpoint capabilities from credentials","duration":13.639099999999871,"failureMessages":[],"meta":{}},{"ancestorTitles":["EditAccountModal"],"fullName":"EditAccountModal submits OpenAI quota auto-pause thresholds in extra","status":"passed","title":"submits OpenAI quota auto-pause thresholds in extra","duration":16.227499999999964,"failureMessages":[],"meta":{}},{"ancestorTitles":["EditAccountModal"],"fullName":"EditAccountModal submits OpenAI quota auto-pause disable flag in extra","status":"passed","title":"submits OpenAI quota auto-pause disable flag in extra","duration":16.49230000000034,"failureMessages":[],"meta":{}},{"ancestorTitles":["EditAccountModal"],"fullName":"EditAccountModal keeps at least one OpenAI APIKey endpoint capability selected","status":"passed","title":"keeps at least one OpenAI APIKey endpoint capability selected","duration":19.580999999999676,"failureMessages":[],"meta":{}},{"ancestorTitles":["EditAccountModal"],"fullName":"EditAccountModal disables text generation protocol when only embeddings requests are accepted","status":"passed","title":"disables text generation protocol when only embeddings requests are accepted","duration":12.734799999999723,"failureMessages":[],"meta":{}},{"ancestorTitles":["EditAccountModal"],"fullName":"EditAccountModal submits Codex image tool force-inject mode as bridge override","status":"passed","title":"submits Codex image tool force-inject mode as bridge override","duration":15.353900000000067,"failureMessages":[],"meta":{}},{"ancestorTitles":["EditAccountModal"],"fullName":"EditAccountModal submits Codex image tool no-injection mode without strip policy","status":"passed","title":"submits Codex image tool no-injection mode without strip policy","duration":15.706299999999828,"failureMessages":[],"meta":{}},{"ancestorTitles":["EditAccountModal"],"fullName":"EditAccountModal submits Codex image tool block mode as strip policy and clears bridge override","status":"passed","title":"submits Codex image tool block mode as strip policy and clears bridge override","duration":15.217899999999645,"failureMessages":[],"meta":{}},{"ancestorTitles":["EditAccountModal"],"fullName":"EditAccountModal loads strip policy as block mode and clears both keys when reset to inherit","status":"passed","title":"loads strip policy as block mode and clears both keys when reset to inherit","duration":20.939300000000003,"failureMessages":[],"meta":{}},{"ancestorTitles":["EditAccountModal"],"fullName":"EditAccountModal setup-token account can select and submit OAuth WS mode","status":"passed","title":"setup-token account can select and submit OAuth WS mode","duration":11.800400000000081,"failureMessages":[],"meta":{}},{"ancestorTitles":["EditAccountModal"],"fullName":"EditAccountModal allows saving apikey account when backend redacted api_key but credentials_status reports it exists","status":"passed","title":"allows saving apikey account when backend redacted api_key but credentials_status reports it exists","duration":13.44439999999986,"failureMessages":[],"meta":{}},{"ancestorTitles":["EditAccountModal"],"fullName":"EditAccountModal allows saving apikey account against legacy backend without credentials_status","status":"passed","title":"allows saving apikey account against legacy backend without credentials_status","duration":14.186999999999898,"failureMessages":[],"meta":{}},{"ancestorTitles":["EditAccountModal"],"fullName":"EditAccountModal blocks apikey save when neither credentials_status nor legacy api_key indicates existence","status":"passed","title":"blocks apikey save when neither credentials_status nor legacy api_key indicates existence","duration":11.333200000000033,"failureMessages":[],"meta":{}},{"ancestorTitles":["EditAccountModal"],"fullName":"EditAccountModal allows saving Vertex SA account when backend redacted service_account_json but credentials_status reports it exists","status":"passed","title":"allows saving Vertex SA account when backend redacted service_account_json but credentials_status reports it exists","duration":10.596299999999701,"failureMessages":[],"meta":{}},{"ancestorTitles":["EditAccountModal"],"fullName":"EditAccountModal allows saving Vertex SA account against legacy backend without credentials_status","status":"passed","title":"allows saving Vertex SA account against legacy backend without credentials_status","duration":11.784900000000107,"failureMessages":[],"meta":{}},{"ancestorTitles":["EditAccountModal"],"fullName":"EditAccountModal blocks Vertex SA save when neither credentials_status nor legacy json indicates existence","status":"passed","title":"blocks Vertex SA save when neither credentials_status nor legacy json indicates existence","duration":12.597800000000007,"failureMessages":[],"meta":{}},{"ancestorTitles":["EditAccountModal"],"fullName":"EditAccountModal loads and submits Antigravity configured project fallback","status":"passed","title":"loads and submits Antigravity configured project fallback","duration":11.164299999999912,"failureMessages":[],"meta":{}},{"ancestorTitles":["EditAccountModal"],"fullName":"EditAccountModal clears Antigravity configured project fallback when input is empty","status":"passed","title":"clears Antigravity configured project fallback when input is empty","duration":10.025699999999688,"failureMessages":[],"meta":{}},{"ancestorTitles":["EditAccountModal OpenAI 自动使用重置卡"],"fullName":"EditAccountModal OpenAI 自动使用重置卡 仅对 OpenAI OAuth 母账号显示,默认关闭且阈值为 100/100","status":"passed","title":"仅对 OpenAI OAuth 母账号显示,默认关闭且阈值为 100/100","duration":37.58019999999988,"failureMessages":[],"meta":{}},{"ancestorTitles":["EditAccountModal OpenAI 自动使用重置卡"],"fullName":"EditAccountModal OpenAI 自动使用重置卡 独立保存两个阈值,并禁止把运行态回写到管理请求","status":"passed","title":"独立保存两个阈值,并禁止把运行态回写到管理请求","duration":22.126600000000053,"failureMessages":[],"meta":{}},{"ancestorTitles":["EditAccountModal OpenAI 自动使用重置卡"],"fullName":"EditAccountModal OpenAI 自动使用重置卡 开启后拒绝超出 0.1–100 范围的任一阈值","status":"passed","title":"开启后拒绝超出 0.1–100 范围的任一阈值","duration":16.135999999999967,"failureMessages":[],"meta":{}}],"startTime":1789442756075,"endTime":1789442757226.136,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/components/account/__tests__/EditAccountModal.spec.ts"},{"assertionResults":[{"ancestorTitles":["account save review: expected invariants"],"fullName":"account save review: expected invariants fresh same-account props must replace older independently saved traffic settings on reopen","status":"passed","title":"fresh same-account props must replace older independently saved traffic settings on reopen","duration":91.21690000000001,"failureMessages":[],"meta":{}},{"ancestorTitles":["account save review: expected invariants"],"fullName":"account save review: expected invariants ordinary save must not close and discard an unsaved traffic draft","status":"passed","title":"ordinary save must not close and discard an unsaved traffic draft","duration":22.884699999999953,"failureMessages":[],"meta":{}},{"ancestorTitles":["account save review: expected invariants"],"fullName":"account save review: expected invariants submits traffic and concurrency once with the account and blocks duplicate saves","status":"passed","title":"submits traffic and concurrency once with the account and blocks duplicate saves","duration":26.69309999999996,"failureMessages":[],"meta":{}},{"ancestorTitles":["account save review: expected invariants"],"fullName":"account save review: expected invariants switching identity should not reset an unsaved concurrency edit","status":"passed","title":"switching identity should not reset an unsaved concurrency edit","duration":29.48109999999997,"failureMessages":[],"meta":{}},{"ancestorTitles":["account save review: expected invariants"],"fullName":"account save review: expected invariants uses the edited concurrency ceiling when validating the same traffic submission","status":"passed","title":"uses the edited concurrency ceiling when validating the same traffic submission","duration":22.894700000000057,"failureMessages":[],"meta":{}},{"ancestorTitles":["account save review: expected invariants"],"fullName":"account save review: expected invariants keeps drafts on tab changes and asks before closing an unsaved editor","status":"passed","title":"keeps drafts on tab changes and asks before closing an unsaved editor","duration":18.419200000000046,"failureMessages":[],"meta":{}}],"startTime":1789442780074,"endTime":1789442780285.4192,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/components/account/__tests__/EditAccountModal.unifiedTraffic.spec.ts"},{"assertionResults":[{"ancestorTitles":["GrokQuotaProbeCell"],"fullName":"GrokQuotaProbeCell keeps billing data while exposing a failed Free quota fallback","status":"passed","title":"keeps billing data while exposing a failed Free quota fallback","duration":16.88530000000003,"failureMessages":[],"meta":{}}],"startTime":1789442815082,"endTime":1789442815098.8853,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/components/account/__tests__/GrokQuotaProbeCell.spec.ts"},{"assertionResults":[{"ancestorTitles":["allSelectedGroupsEnableLongContextPricing"],"fullName":"allSelectedGroupsEnableLongContextPricing hides the account override when every selected group enables tier pricing","status":"passed","title":"hides the account override when every selected group enables tier pricing","duration":0.6299999999999955,"failureMessages":[],"meta":{}},{"ancestorTitles":["allSelectedGroupsEnableLongContextPricing"],"fullName":"allSelectedGroupsEnableLongContextPricing keeps the account override when any selected group disables tier pricing","status":"passed","title":"keeps the account override when any selected group disables tier pricing","duration":0.10749999999995907,"failureMessages":[],"meta":{}},{"ancestorTitles":["allSelectedGroupsEnableLongContextPricing"],"fullName":"allSelectedGroupsEnableLongContextPricing keeps the account override when selection is empty or group data is incomplete","status":"passed","title":"keeps the account override when selection is empty or group data is incomplete","duration":0.10099999999999909,"failureMessages":[],"meta":{}}],"startTime":1789442821310,"endTime":1789442821310.63,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/components/account/__tests__/longContextBilling.spec.ts"},{"assertionResults":[{"ancestorTitles":["ModelWhitelistSelector"],"fullName":"ModelWhitelistSelector copies a model ID without selecting the model","status":"passed","title":"copies a model ID without selecting the model","duration":32.81899999999996,"failureMessages":[],"meta":{}},{"ancestorTitles":["ModelWhitelistSelector"],"fullName":"ModelWhitelistSelector keeps the existing model selection behavior","status":"passed","title":"keeps the existing model selection behavior","duration":12.003500000000031,"failureMessages":[],"meta":{}},{"ancestorTitles":["ModelWhitelistSelector"],"fullName":"ModelWhitelistSelector warns when model IDs sync but capability metadata is incomplete","status":"passed","title":"warns when model IDs sync but capability metadata is incomplete","duration":3.334799999999973,"failureMessages":[],"meta":{}},{"ancestorTitles":["ModelWhitelistSelector"],"fullName":"ModelWhitelistSelector shows success and a partial warning when some capabilities were saved","status":"passed","title":"shows success and a partial warning when some capabilities were saved","duration":2.043199999999956,"failureMessages":[],"meta":{}},{"ancestorTitles":["ModelWhitelistSelector"],"fullName":"ModelWhitelistSelector reports a successful preview so account creation can persist metadata","status":"passed","title":"reports a successful preview so account creation can persist metadata","duration":2.0608000000000857,"failureMessages":[],"meta":{}}],"startTime":1789442786237,"endTime":1789442786289.0608,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/components/account/__tests__/ModelWhitelistSelector.spec.ts"},{"assertionResults":[{"ancestorTitles":["OllamaCloudUsageCell"],"fullName":"OllamaCloudUsageCell renders native 5h and 7d windows with the configured-account query action","status":"passed","title":"renders native 5h and 7d windows with the configured-account query action","duration":19.068399999999997,"failureMessages":[],"meta":{}},{"ancestorTitles":["OllamaCloudUsageCell"],"fullName":"OllamaCloudUsageCell reacts to an account snapshot update","status":"passed","title":"reacts to an account snapshot update","duration":3.895599999999945,"failureMessages":[],"meta":{}},{"ancestorTitles":["OllamaCloudUsageCell"],"fullName":"OllamaCloudUsageCell queries through the edit-page refresh endpoint and emits the updated state","status":"passed","title":"queries through the edit-page refresh endpoint and emits the updated state","duration":5.243399999999951,"failureMessages":[],"meta":{}},{"ancestorTitles":["OllamaCloudUsageCell"],"fullName":"OllamaCloudUsageCell hides the query action until a browser session is configured","status":"passed","title":"hides the query action until a browser session is configured","duration":1.4781999999999016,"failureMessages":[],"meta":{}}],"startTime":1789442790016,"endTime":1789442790045.4783,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/components/account/__tests__/OllamaCloudUsageCell.spec.ts"},{"assertionResults":[{"ancestorTitles":["OllamaCloudUsageSettings"],"fullName":"OllamaCloudUsageSettings uses the existing account state without an immediate duplicate GET","status":"passed","title":"uses the existing account state without an immediate duplicate GET","duration":27.00249999999994,"failureMessages":[],"meta":{}},{"ancestorTitles":["OllamaCloudUsageSettings"],"fullName":"OllamaCloudUsageSettings fails closed when the persistent encryption key is unavailable","status":"passed","title":"fails closed when the persistent encryption key is unavailable","duration":3.6952999999999747,"failureMessages":[],"meta":{}},{"ancestorTitles":["OllamaCloudUsageSettings"],"fullName":"OllamaCloudUsageSettings updates the account-level automatic refresh switch through its dedicated endpoint","status":"passed","title":"updates the account-level automatic refresh switch through its dedicated endpoint","duration":4.633799999999951,"failureMessages":[],"meta":{}},{"ancestorTitles":["OllamaCloudUsageSettings"],"fullName":"OllamaCloudUsageSettings keeps plan, balance, model, status, and manual refresh details in the edit settings","status":"passed","title":"keeps plan, balance, model, status, and manual refresh details in the edit settings","duration":16.069200000000023,"failureMessages":[],"meta":{}},{"ancestorTitles":["OllamaCloudUsageSettings"],"fullName":"OllamaCloudUsageSettings shows the structured manual refresh limit from the edit settings","status":"passed","title":"shows the structured manual refresh limit from the edit settings","duration":3.779899999999998,"failureMessages":[],"meta":{}}],"startTime":1789442784267,"endTime":1789442784322.7798,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/components/account/__tests__/OllamaCloudUsageSettings.spec.ts"},{"assertionResults":[{"ancestorTitles":["OpenAIQuotaResetCell — 外审 F6:影子禁用重置"],"fullName":"OpenAIQuotaResetCell — 外审 F6:影子禁用重置 影子账号(parent_account_id 非空)的 reset 按钮被禁用且提示在母账号重置","status":"passed","title":"影子账号(parent_account_id 非空)的 reset 按钮被禁用且提示在母账号重置","duration":30.38370000000009,"failureMessages":[],"meta":{}},{"ancestorTitles":["OpenAIQuotaResetCell — 外审 F6:影子禁用重置"],"fullName":"OpenAIQuotaResetCell — 外审 F6:影子禁用重置 普通账号(无 parent_account_id)未查询时禁用原因是「需先查询」而非影子提示","status":"passed","title":"普通账号(无 parent_account_id)未查询时禁用原因是「需先查询」而非影子提示","duration":3.9204999999999472,"failureMessages":[],"meta":{}},{"ancestorTitles":["OpenAIQuotaResetCell — 外审 F6:影子禁用重置"],"fullName":"OpenAIQuotaResetCell — 外审 F6:影子禁用重置 从账号 extra 缓存恢复重置卡次数和到期时间","status":"passed","title":"从账号 extra 缓存恢复重置卡次数和到期时间","duration":21.46659999999997,"failureMessages":[],"meta":{}},{"ancestorTitles":["OpenAIQuotaResetCell — 外审 F6:影子禁用重置"],"fullName":"OpenAIQuotaResetCell — 外审 F6:影子禁用重置 缓存中的重置卡全部过期时视为未知,不点亮重置入口","status":"passed","title":"缓存中的重置卡全部过期时视为未知,不点亮重置入口","duration":3.3772999999998774,"failureMessages":[],"meta":{}},{"ancestorTitles":["OpenAIQuotaResetCell — 外审 F6:影子禁用重置"],"fullName":"OpenAIQuotaResetCell — 外审 F6:影子禁用重置 缓存次数向未过期的明细数量收敛","status":"passed","title":"缓存次数向未过期的明细数量收敛","duration":5.9565000000000055,"failureMessages":[],"meta":{}},{"ancestorTitles":["OpenAIQuotaResetCell — 外审 F6:影子禁用重置"],"fullName":"OpenAIQuotaResetCell — 外审 F6:影子禁用重置 查询后默认折叠为最早到期时间,点击 +N 展开完整列表","status":"passed","title":"查询后默认折叠为最早到期时间,点击 +N 展开完整列表","duration":16.270300000000134,"failureMessages":[],"meta":{}},{"ancestorTitles":["OpenAIQuotaResetCell — 外审 F6:影子禁用重置"],"fullName":"OpenAIQuotaResetCell — 外审 F6:影子禁用重置 只有一张重置卡时不显示展开按钮","status":"passed","title":"只有一张重置卡时不显示展开按钮","duration":6.3788999999999305,"failureMessages":[],"meta":{}},{"ancestorTitles":["OpenAIQuotaResetCell — 外审 F6:影子禁用重置"],"fullName":"OpenAIQuotaResetCell — 外审 F6:影子禁用重置 快照持久化失败时仍显示实时次数并给出警告","status":"passed","title":"快照持久化失败时仍显示实时次数并给出警告","duration":5.828599999999824,"failureMessages":[],"meta":{}},{"ancestorTitles":["OpenAIQuotaResetCell — 外审 F6:影子禁用重置"],"fullName":"OpenAIQuotaResetCell — 外审 F6:影子禁用重置 重置成功后直接使用响应中的最新缓存并回传恢复后的账号","status":"passed","title":"重置成功后直接使用响应中的最新缓存并回传恢复后的账号","duration":17.05560000000014,"failureMessages":[],"meta":{}},{"ancestorTitles":["OpenAIQuotaResetCell — 外审 F6:影子禁用重置"],"fullName":"OpenAIQuotaResetCell — 外审 F6:影子禁用重置 缓存刷新失败时仍回传恢复后的账号并把次数标为未知","status":"passed","title":"缓存刷新失败时仍回传恢复后的账号并把次数标为未知","duration":9.557600000000093,"failureMessages":[],"meta":{}},{"ancestorTitles":["OpenAIQuotaResetCell — 外审 F6:影子禁用重置"],"fullName":"OpenAIQuotaResetCell — 外审 F6:影子禁用重置 账号状态恢复失败时停止后续步骤并提示手动恢复","status":"passed","title":"账号状态恢复失败时停止后续步骤并提示手动恢复","duration":12.502300000000105,"failureMessages":[],"meta":{}},{"ancestorTitles":["OpenAIQuotaResetCell 自动用卡运行态"],"fullName":"OpenAIQuotaResetCell 自动用卡运行态 展示 checking 状态且不需要暴露卡标识","status":"passed","title":"展示 checking 状态且不需要暴露卡标识","duration":5.13110000000006,"failureMessages":[],"meta":{}},{"ancestorTitles":["OpenAIQuotaResetCell 自动用卡运行态"],"fullName":"OpenAIQuotaResetCell 自动用卡运行态 展示 available 状态且不需要暴露卡标识","status":"passed","title":"展示 available 状态且不需要暴露卡标识","duration":2.3168000000000575,"failureMessages":[],"meta":{}},{"ancestorTitles":["OpenAIQuotaResetCell 自动用卡运行态"],"fullName":"OpenAIQuotaResetCell 自动用卡运行态 展示 resetting 状态且不需要暴露卡标识","status":"passed","title":"展示 resetting 状态且不需要暴露卡标识","duration":2.4682000000000244,"failureMessages":[],"meta":{}},{"ancestorTitles":["OpenAIQuotaResetCell 自动用卡运行态"],"fullName":"OpenAIQuotaResetCell 自动用卡运行态 展示 success 状态且不需要暴露卡标识","status":"passed","title":"展示 success 状态且不需要暴露卡标识","duration":2.305900000000065,"failureMessages":[],"meta":{}},{"ancestorTitles":["OpenAIQuotaResetCell 自动用卡运行态"],"fullName":"OpenAIQuotaResetCell 自动用卡运行态 展示 no_credit 状态且不需要暴露卡标识","status":"passed","title":"展示 no_credit 状态且不需要暴露卡标识","duration":3.668899999999894,"failureMessages":[],"meta":{}},{"ancestorTitles":["OpenAIQuotaResetCell 自动用卡运行态"],"fullName":"OpenAIQuotaResetCell 自动用卡运行态 展示 failed 状态且不需要暴露卡标识","status":"passed","title":"展示 failed 状态且不需要暴露卡标识","duration":2.4437000000000353,"failureMessages":[],"meta":{}},{"ancestorTitles":["OpenAIQuotaResetCell 自动用卡运行态"],"fullName":"OpenAIQuotaResetCell 自动用卡运行态 开关关闭时不显示历史运行态","status":"passed","title":"开关关闭时不显示历史运行态","duration":1.9411999999999807,"failureMessages":[],"meta":{}}],"startTime":1789442769997,"endTime":1789442770150.9412,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/components/account/__tests__/OpenAIQuotaResetCell.spark_shadow.spec.ts"},{"assertionResults":[{"ancestorTitles":["ProtectionToggle"],"fullName":"ProtectionToggle requires confirmation before sending ON to OFF and preserves state on cancel","status":"passed","title":"requires confirmation before sending ON to OFF and preserves state on cancel","duration":20.50630000000001,"failureMessages":[],"meta":{}},{"ancestorTitles":["ProtectionToggle"],"fullName":"ProtectionToggle discloses the generic capability boundary and does not mislabel it as Codex","status":"passed","title":"discloses the generic capability boundary and does not mislabel it as Codex","duration":1.9250000000000682,"failureMessages":[],"meta":{}},{"ancestorTitles":["ProtectionToggle"],"fullName":"ProtectionToggle blocks ordinary users and prevents double submission","status":"passed","title":"blocks ordinary users and prevents double submission","duration":3.803600000000074,"failureMessages":[],"meta":{}}],"startTime":1789442803540,"endTime":1789442803565.8037,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/components/account/__tests__/ProtectionToggle.spec.ts"},{"assertionResults":[{"ancestorTitles":["UpstreamBillingRateCell"],"fullName":"UpstreamBillingRateCell recomputes the current effective rate and keeps the icon-only probe action","status":"passed","title":"recomputes the current effective rate and keeps the icon-only probe action","duration":39.770200000000045,"failureMessages":[],"meta":{}},{"ancestorTitles":["UpstreamBillingRateCell"],"fullName":"UpstreamBillingRateCell uses retained failed data only while it is still fresh","status":"passed","title":"uses retained failed data only while it is still fresh","duration":9.588399999999979,"failureMessages":[],"meta":{}},{"ancestorTitles":["UpstreamBillingRateCell"],"fullName":"UpstreamBillingRateCell shows stale snapshot details, local next probe time, and the account probe state","status":"passed","title":"shows stale snapshot details, local next probe time, and the account probe state","duration":10.804700000000025,"failureMessages":[],"meta":{}},{"ancestorTitles":["UpstreamBillingRateCell"],"fullName":"UpstreamBillingRateCell stacks the global-off state below the account state and hides it when globally enabled","status":"passed","title":"stacks the global-off state below the account state and hides it when globally enabled","duration":4.703999999999951,"failureMessages":[],"meta":{}},{"ancestorTitles":["UpstreamBillingRateCell"],"fullName":"UpstreamBillingRateCell emits manual probe commands only for eligible accounts","status":"passed","title":"emits manual probe commands only for eligible accounts","duration":6.143100000000004,"failureMessages":[],"meta":{}},{"ancestorTitles":["UpstreamBillingRateCell"],"fullName":"UpstreamBillingRateCell fails neutral for malformed data and timestamps","status":"passed","title":"fails neutral for malformed data and timestamps","duration":6.82650000000001,"failureMessages":[],"meta":{}},{"ancestorTitles":["UpstreamBillingRateCell"],"fullName":"UpstreamBillingRateCell uses unsupported as the primary tooltip trigger without a dash","status":"passed","title":"uses unsupported as the primary tooltip trigger without a dash","duration":3.311399999999935,"failureMessages":[],"meta":{}}],"startTime":1789442770748,"endTime":1789442770830.3113,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/components/account/__tests__/UpstreamBillingRateCell.spec.ts"},{"assertionResults":[{"ancestorTitles":["UpstreamRequestIdHeaderField"],"fullName":"UpstreamRequestIdHeaderField lists relay and official header examples for API key accounts","status":"passed","title":"lists relay and official header examples for API key accounts","duration":17.142600000000016,"failureMessages":[],"meta":{}},{"ancestorTitles":["UpstreamRequestIdHeaderField"],"fullName":"UpstreamRequestIdHeaderField lists only the official header for accounts that connect to the platform directly","status":"passed","title":"lists only the official header for accounts that connect to the platform directly","duration":2.520599999999945,"failureMessages":[],"meta":{}},{"ancestorTitles":["UpstreamRequestIdHeaderField"],"fullName":"UpstreamRequestIdHeaderField omits the examples section when no header is known for the platform","status":"passed","title":"omits the examples section when no header is known for the platform","duration":4.871999999999957,"failureMessages":[],"meta":{}},{"ancestorTitles":["UpstreamRequestIdHeaderField"],"fullName":"UpstreamRequestIdHeaderField binds the header name through v-model","status":"passed","title":"binds the header name through v-model","duration":4.931600000000003,"failureMessages":[],"meta":{}}],"startTime":1789442802847,"endTime":1789442802876.9316,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/components/account/__tests__/UpstreamRequestIdHeaderField.spec.ts"},{"assertionResults":[{"ancestorTitles":["UsageProgressBar"],"fullName":"UsageProgressBar showNowWhenIdle=true 且利用率为 0 时显示“现在”","status":"passed","title":"showNowWhenIdle=true 且利用率为 0 时显示“现在”","duration":11.451900000000023,"failureMessages":[],"meta":{}},{"ancestorTitles":["UsageProgressBar"],"fullName":"UsageProgressBar showNowWhenIdle=true 但利用率大于 0 时显示倒计时","status":"passed","title":"showNowWhenIdle=true 但利用率大于 0 时显示倒计时","duration":1.6271000000000413,"failureMessages":[],"meta":{}},{"ancestorTitles":["UsageProgressBar"],"fullName":"UsageProgressBar showNowWhenIdle=false 时保持原有倒计时行为","status":"passed","title":"showNowWhenIdle=false 时保持原有倒计时行为","duration":1.3039999999999736,"failureMessages":[],"meta":{}},{"ancestorTitles":["UsageProgressBar"],"fullName":"UsageProgressBar resetsAt 已过期且利用率大于 0 时显示「待刷新」","status":"passed","title":"resetsAt 已过期且利用率大于 0 时显示「待刷新」","duration":1.2590999999999894,"failureMessages":[],"meta":{}},{"ancestorTitles":["UsageProgressBar"],"fullName":"UsageProgressBar resetsAt 已过期且利用率为 0 时仍显示「现在」","status":"passed","title":"resetsAt 已过期且利用率为 0 时仍显示「现在」","duration":1.163499999999999,"failureMessages":[],"meta":{}},{"ancestorTitles":["UsageProgressBar"],"fullName":"UsageProgressBar 剩余容量模式在 100% 时显示满格绿色","status":"passed","title":"剩余容量模式在 100% 时显示满格绿色","duration":5.528400000000033,"failureMessages":[],"meta":{}},{"ancestorTitles":["UsageProgressBar"],"fullName":"UsageProgressBar 剩余容量模式在低量和耗尽时缩短并变红","status":"passed","title":"剩余容量模式在低量和耗尽时缩短并变红","duration":3.043700000000058,"failureMessages":[],"meta":{}},{"ancestorTitles":["UsageProgressBar"],"fullName":"UsageProgressBar 默认利用率模式仍把超限显示为满格红色","status":"passed","title":"默认利用率模式仍把超限显示为满格红色","duration":1.1983999999999924,"failureMessages":[],"meta":{}},{"ancestorTitles":["UsageProgressBar"],"fullName":"UsageProgressBar 默认利用率模式按 75/90 阈值提前预警分级","status":"passed","title":"默认利用率模式按 75/90 阈值提前预警分级","duration":6.673599999999965,"failureMessages":[],"meta":{}},{"ancestorTitles":["UsageProgressBar"],"fullName":"UsageProgressBar labelWidth 默认 fixed:标签保持定宽居中,百分比列不变","status":"passed","title":"labelWidth 默认 fixed:标签保持定宽居中,百分比列不变","duration":1.3450000000000273,"failureMessages":[],"meta":{}},{"ancestorTitles":["UsageProgressBar"],"fullName":"UsageProgressBar labelWidth=auto 时标签限宽截断左对齐,百分比列保持不变","status":"passed","title":"labelWidth=auto 时标签限宽截断左对齐,百分比列保持不变","duration":1.197300000000041,"failureMessages":[],"meta":{}}],"startTime":1789442784483,"endTime":1789442784519.1973,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/components/account/__tests__/UsageProgressBar.spec.ts"},{"assertionResults":[{"ancestorTitles":["MonitorActionsCell duplicate action"],"fullName":"MonitorActionsCell duplicate action emits the selected monitor when duplicate is clicked","status":"passed","title":"emits the selected monitor when duplicate is clicked","duration":16.322200000000066,"failureMessages":[],"meta":{}},{"ancestorTitles":["MonitorActionsCell duplicate action"],"fullName":"MonitorActionsCell duplicate action disables the action while the same monitor is being duplicated","status":"passed","title":"disables the action while the same monitor is being duplicated","duration":2.824799999999982,"failureMessages":[],"meta":{}},{"ancestorTitles":["MonitorActionsCell duplicate action"],"fullName":"MonitorActionsCell duplicate action disables the action when the stored API key cannot be decrypted","status":"passed","title":"disables the action when the stored API key cannot be decrypted","duration":1.856899999999996,"failureMessages":[],"meta":{}}],"startTime":1789442804594,"endTime":1789442804615.857,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/components/admin/monitor/MonitorActionsCell.spec.ts"},{"assertionResults":[{"ancestorTitles":["AppSidebar custom SVG styles"],"fullName":"AppSidebar custom SVG styles does not override uploaded SVG fill or stroke colors","status":"passed","title":"does not override uploaded SVG fill or stroke colors","duration":1.019800000000032,"failureMessages":[],"meta":{}},{"ancestorTitles":["AppSidebar scroll position persistence"],"fullName":"AppSidebar scroll position persistence binds a template ref to the sidebar nav element","status":"passed","title":"binds a template ref to the sidebar nav element","duration":0.14570000000003347,"failureMessages":[],"meta":{}},{"ancestorTitles":["AppSidebar scroll position persistence"],"fullName":"AppSidebar scroll position persistence declares sidebarNavRef in script setup","status":"passed","title":"declares sidebarNavRef in script setup","duration":0.06780000000003383,"failureMessages":[],"meta":{}},{"ancestorTitles":["AppSidebar scroll position persistence"],"fullName":"AppSidebar scroll position persistence saves scroll position on beforeUnmount","status":"passed","title":"saves scroll position on beforeUnmount","duration":0.11630000000002383,"failureMessages":[],"meta":{}},{"ancestorTitles":["AppSidebar scroll position persistence"],"fullName":"AppSidebar scroll position persistence restores scroll position on mount","status":"passed","title":"restores scroll position on mount","duration":0.09800000000007003,"failureMessages":[],"meta":{}},{"ancestorTitles":["AppSidebar collapsible groups"],"fullName":"AppSidebar collapsible groups lets the user collapse a group even while a child route is active","status":"passed","title":"lets the user collapse a group even while a child route is active","duration":0.09720000000004347,"failureMessages":[],"meta":{}},{"ancestorTitles":["AppSidebar header styles"],"fullName":"AppSidebar header styles does not clip the version badge dropdown","status":"passed","title":"does not clip the version badge dropdown","duration":0.21199999999998909,"failureMessages":[],"meta":{}}],"startTime":1789442802155,"endTime":1789442802157.212,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/components/layout/__tests__/AppSidebar.spec.ts"},{"assertionResults":[{"ancestorTitles":["doc_url sanitization"],"fullName":"doc_url sanitization AppHeader imports sanitizeUrl","status":"passed","title":"AppHeader imports sanitizeUrl","duration":0.611699999999928,"failureMessages":[],"meta":{}},{"ancestorTitles":["doc_url sanitization"],"fullName":"doc_url sanitization AppHeader applies sanitizeUrl to docUrl","status":"passed","title":"AppHeader applies sanitizeUrl to docUrl","duration":0.10159999999996217,"failureMessages":[],"meta":{}},{"ancestorTitles":["doc_url sanitization"],"fullName":"doc_url sanitization home branding rejects executable doc URL javascript:alert(1)","status":"passed","title":"home branding rejects executable doc URL javascript:alert(1)","duration":0.42849999999998545,"failureMessages":[],"meta":{}},{"ancestorTitles":["doc_url sanitization"],"fullName":"doc_url sanitization home branding rejects executable doc URL data:text/html,<script>alert(1)</script>","status":"passed","title":"home branding rejects executable doc URL data:text/html,<script>alert(1)</script>","duration":0.08980000000008204,"failureMessages":[],"meta":{}},{"ancestorTitles":["doc_url sanitization"],"fullName":"doc_url sanitization home branding rejects executable doc URL vbscript:msgbox(1)","status":"passed","title":"home branding rejects executable doc URL vbscript:msgbox(1)","duration":0.08150000000000546,"failureMessages":[],"meta":{}},{"ancestorTitles":["doc_url sanitization"],"fullName":"doc_url sanitization home branding retains a valid documentation address","status":"passed","title":"home branding retains a valid documentation address","duration":0.3602000000000771,"failureMessages":[],"meta":{}},{"ancestorTitles":["doc_url sanitization"],"fullName":"doc_url sanitization KeyUsageView imports sanitizeUrl","status":"passed","title":"KeyUsageView imports sanitizeUrl","duration":0.07140000000003965,"failureMessages":[],"meta":{}},{"ancestorTitles":["doc_url sanitization"],"fullName":"doc_url sanitization KeyUsageView applies sanitizeUrl to docUrl","status":"passed","title":"KeyUsageView applies sanitizeUrl to docUrl","duration":0.06839999999999691,"failureMessages":[],"meta":{}}],"startTime":1789442813118,"endTime":1789442813120.36,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/components/layout/__tests__/docUrlSanitization.spec.ts"},{"assertionResults":[{"ancestorTitles":["site_logo sanitization"],"fullName":"site_logo sanitization AppSidebar imports sanitizeUrl and applies it to siteLogo","status":"passed","title":"AppSidebar imports sanitizeUrl and applies it to siteLogo","duration":0.8211999999999762,"failureMessages":[],"meta":{}},{"ancestorTitles":["site_logo sanitization"],"fullName":"site_logo sanitization home branding rejects executable logo URLs","status":"passed","title":"home branding rejects executable logo URLs","duration":0.4923999999999751,"failureMessages":[],"meta":{}},{"ancestorTitles":["site_logo sanitization"],"fullName":"site_logo sanitization KeyUsageView applies sanitizeUrl to siteLogo","status":"passed","title":"KeyUsageView applies sanitizeUrl to siteLogo","duration":0.10119999999994889,"failureMessages":[],"meta":{}},{"ancestorTitles":["site_logo sanitization"],"fullName":"site_logo sanitization layout consumers allow relative and image data URLs","status":"passed","title":"layout consumers allow relative and image data URLs","duration":0.2298000000000684,"failureMessages":[],"meta":{}}],"startTime":1789442813582,"endTime":1789442813584.2297,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/components/layout/__tests__/siteLogoSanitization.spec.ts"},{"assertionResults":[{"ancestorTitles":["TablePageLayout responsive table scrolling"],"fullName":"TablePageLayout responsive table scrolling does not disable the table horizontal scroll container in mobile mode","status":"passed","title":"does not disable the table horizontal scroll container in mobile mode","duration":1.088799999999992,"failureMessages":[],"meta":{}}],"startTime":1789442820771,"endTime":1789442820772.0889,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/components/layout/__tests__/TablePageLayout.spec.ts"},{"assertionResults":[{"ancestorTitles":["EndpointPopover"],"fullName":"EndpointPopover 将说明提示渲染到 URL 上方而不是旧的 title 图标上","status":"passed","title":"将说明提示渲染到 URL 上方而不是旧的 title 图标上","duration":17.214200000000005,"failureMessages":[],"meta":{}},{"ancestorTitles":["EndpointPopover"],"fullName":"EndpointPopover 点击 URL 后会复制并切换为已复制提示","status":"passed","title":"点击 URL 后会复制并切换为已复制提示","duration":6.138899999999921,"failureMessages":[],"meta":{}}],"startTime":1789442809916,"endTime":1789442809939.139,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/components/keys/__tests__/EndpointPopover.spec.ts"},{"assertionResults":[{"ancestorTitles":["UseKeyModal"],"fullName":"UseKeyModal omits the attribution override from every standard Claude Code setup form","status":"passed","title":"omits the attribution override from every standard Claude Code setup form","duration":26.28679999999997,"failureMessages":[],"meta":{}},{"ancestorTitles":["UseKeyModal"],"fullName":"UseKeyModal renders Grok Build and OpenCode setup for Grok groups","status":"passed","title":"renders Grok Build and OpenCode setup for Grok groups","duration":7.602200000000039,"failureMessages":[],"meta":{}},{"ancestorTitles":["UseKeyModal"],"fullName":"UseKeyModal renders copyable Claude Code setup through the Grok Messages gateway","status":"passed","title":"renders copyable Claude Code setup through the Grok Messages gateway","duration":14.686599999999999,"failureMessages":[],"meta":{}},{"ancestorTitles":["UseKeyModal"],"fullName":"UseKeyModal renders Codex custom provider setup through the Grok Responses gateway","status":"passed","title":"renders Codex custom provider setup through the Grok Responses gateway","duration":13.13110000000006,"failureMessages":[],"meta":{}},{"ancestorTitles":["UseKeyModal"],"fullName":"UseKeyModal keeps legacy OpenAI Codex config as the default","status":"passed","title":"keeps legacy OpenAI Codex config as the default","duration":5.026300000000106,"failureMessages":[],"meta":{}},{"ancestorTitles":["UseKeyModal"],"fullName":"UseKeyModal renders API Key Mode authorization in OpenAI Codex config","status":"passed","title":"renders API Key Mode authorization in OpenAI Codex config","duration":6.747499999999945,"failureMessages":[],"meta":{}},{"ancestorTitles":["UseKeyModal"],"fullName":"UseKeyModal keeps legacy OpenAI Codex WebSocket config as the default","status":"passed","title":"keeps legacy OpenAI Codex WebSocket config as the default","duration":4.067100000000096,"failureMessages":[],"meta":{}},{"ancestorTitles":["UseKeyModal"],"fullName":"UseKeyModal preserves API Key Mode when switching to OpenAI Codex WebSocket config","status":"passed","title":"preserves API Key Mode when switching to OpenAI Codex WebSocket config","duration":5.6159999999999854,"failureMessages":[],"meta":{}},{"ancestorTitles":["UseKeyModal"],"fullName":"UseKeyModal resets Codex authentication mode when the modal reopens or platform changes","status":"passed","title":"resets Codex authentication mode when the modal reopens or platform changes","duration":12.679099999999949,"failureMessages":[],"meta":{}},{"ancestorTitles":["UseKeyModal"],"fullName":"UseKeyModal renders GPT-5.4 mini entry in OpenCode config","status":"passed","title":"renders GPT-5.4 mini entry in OpenCode config","duration":4.46309999999994,"failureMessages":[],"meta":{}},{"ancestorTitles":["UseKeyModal"],"fullName":"UseKeyModal renders GPT-5.6 and GPT-6 Astra capabilities in OpenCode config","status":"passed","title":"renders GPT-5.6 and GPT-6 Astra capabilities in OpenCode config","duration":8.13620000000003,"failureMessages":[],"meta":{}},{"ancestorTitles":["UseKeyModal"],"fullName":"UseKeyModal renders Claude Fable 5 OpenCode config with adaptive thinking","status":"passed","title":"renders Claude Fable 5 OpenCode config with adaptive thinking","duration":3.1744999999999663,"failureMessages":[],"meta":{}},{"ancestorTitles":["UseKeyModal"],"fullName":"UseKeyModal offers a downloadable Codex catalog for Composite API keys","status":"passed","title":"offers a downloadable Codex catalog for Composite API keys","duration":14.004999999999995,"failureMessages":[],"meta":{}},{"ancestorTitles":["UseKeyModal"],"fullName":"UseKeyModal offers Codex catalog configuration for the anthropic routed group","status":"passed","title":"offers Codex catalog configuration for the anthropic routed group","duration":3.107499999999959,"failureMessages":[],"meta":{}},{"ancestorTitles":["UseKeyModal"],"fullName":"UseKeyModal offers Codex catalog configuration for the gemini routed group","status":"passed","title":"offers Codex catalog configuration for the gemini routed group","duration":5.990199999999959,"failureMessages":[],"meta":{}},{"ancestorTitles":["UseKeyModal"],"fullName":"UseKeyModal offers Codex catalog configuration for the antigravity routed group","status":"passed","title":"offers Codex catalog configuration for the antigravity routed group","duration":4.005999999999972,"failureMessages":[],"meta":{}},{"ancestorTitles":["UseKeyModal"],"fullName":"UseKeyModal offers Codex catalog configuration for the kimi routed group","status":"passed","title":"offers Codex catalog configuration for the kimi routed group","duration":3.07529999999997,"failureMessages":[],"meta":{}},{"ancestorTitles":["UseKeyModal"],"fullName":"UseKeyModal offers Codex catalog configuration for the zhipu routed group","status":"passed","title":"offers Codex catalog configuration for the zhipu routed group","duration":2.6263000000000147,"failureMessages":[],"meta":{}},{"ancestorTitles":["UseKeyModal"],"fullName":"UseKeyModal offers Codex catalog configuration for the minimax routed group","status":"passed","title":"offers Codex catalog configuration for the minimax routed group","duration":2.5208000000000084,"failureMessages":[],"meta":{}},{"ancestorTitles":["UseKeyModal"],"fullName":"UseKeyModal keeps the preferred Composite default when it exists in the catalog","status":"passed","title":"keeps the preferred Composite default when it exists in the catalog","duration":8.579200000000014,"failureMessages":[],"meta":{}},{"ancestorTitles":["UseKeyModal"],"fullName":"UseKeyModal derives OpenAI Codex reasoning effort from the selected catalog descriptor","status":"passed","title":"derives OpenAI Codex reasoning effort from the selected catalog descriptor","duration":3.6286999999999807,"failureMessages":[],"meta":{}}],"startTime":1789442757373,"endTime":1789442757531.6287,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/components/keys/__tests__/UseKeyModal.spec.ts"},{"assertionResults":[{"ancestorTitles":["AnnouncementPopup"],"fullName":"AnnouncementPopup renders mixed Markdown and HTML inside the shared styled container","status":"passed","title":"renders mixed Markdown and HTML inside the shared styled container","duration":44.1703,"failureMessages":[],"meta":{}},{"ancestorTitles":["AnnouncementPopup"],"fullName":"AnnouncementPopup loads a shared style rule for mixed-content <h2> elements","status":"passed","title":"loads a shared style rule for mixed-content <h2> elements","duration":0.3084999999999809,"failureMessages":[],"meta":{}},{"ancestorTitles":["AnnouncementPopup"],"fullName":"AnnouncementPopup loads a shared style rule for mixed-content <h3> elements","status":"passed","title":"loads a shared style rule for mixed-content <h3> elements","duration":0.1775000000000091,"failureMessages":[],"meta":{}},{"ancestorTitles":["AnnouncementPopup"],"fullName":"AnnouncementPopup loads a shared style rule for mixed-content <ul> elements","status":"passed","title":"loads a shared style rule for mixed-content <ul> elements","duration":0.15579999999999927,"failureMessages":[],"meta":{}},{"ancestorTitles":["AnnouncementPopup"],"fullName":"AnnouncementPopup loads a shared style rule for mixed-content <li> elements","status":"passed","title":"loads a shared style rule for mixed-content <li> elements","duration":0.13820000000009713,"failureMessages":[],"meta":{}},{"ancestorTitles":["AnnouncementPopup"],"fullName":"AnnouncementPopup loads a shared style rule for mixed-content <blockquote> elements","status":"passed","title":"loads a shared style rule for mixed-content <blockquote> elements","duration":0.1528000000000702,"failureMessages":[],"meta":{}},{"ancestorTitles":["AnnouncementPopup"],"fullName":"AnnouncementPopup loads a shared style rule for mixed-content <table> elements","status":"passed","title":"loads a shared style rule for mixed-content <table> elements","duration":0.20400000000006457,"failureMessages":[],"meta":{}},{"ancestorTitles":["AnnouncementPopup"],"fullName":"AnnouncementPopup loads a shared style rule for mixed-content <th> elements","status":"passed","title":"loads a shared style rule for mixed-content <th> elements","duration":0.15039999999999054,"failureMessages":[],"meta":{}},{"ancestorTitles":["AnnouncementPopup"],"fullName":"AnnouncementPopup loads a shared style rule for mixed-content <td> elements","status":"passed","title":"loads a shared style rule for mixed-content <td> elements","duration":0.15670000000000073,"failureMessages":[],"meta":{}},{"ancestorTitles":["AnnouncementPopup"],"fullName":"AnnouncementPopup loads a shared style rule for mixed-content <code> elements","status":"passed","title":"loads a shared style rule for mixed-content <code> elements","duration":0.14589999999998327,"failureMessages":[],"meta":{}},{"ancestorTitles":["AnnouncementPopup"],"fullName":"AnnouncementPopup previews an admin announcement without marking it as read","status":"passed","title":"previews an admin announcement without marking it as read","duration":9.110199999999963,"failureMessages":[],"meta":{}},{"ancestorTitles":["AnnouncementPopup"],"fullName":"AnnouncementPopup keeps the existing user popup dismissal behavior","status":"passed","title":"keeps the existing user popup dismissal behavior","duration":4.491100000000074,"failureMessages":[],"meta":{}}],"startTime":1789442792918,"endTime":1789442792977.4912,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/components/common/__tests__/AnnouncementPopup.spec.ts"},{"assertionResults":[{"ancestorTitles":["BaseDialog"],"fullName":"BaseDialog resets body scroll position when reopened","status":"passed","title":"resets body scroll position when reopened","duration":29.533800000000042,"failureMessages":[],"meta":{}}],"startTime":1789442819999,"endTime":1789442820028.5337,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/components/common/__tests__/BaseDialog.spec.ts"},{"assertionResults":[{"ancestorTitles":["DataTable"],"fullName":"DataTable renders paired sort arrows and highlights the active direction","status":"passed","title":"renders paired sort arrows and highlights the active direction","duration":42.1345,"failureMessages":[],"meta":{}},{"ancestorTitles":["DataTable"],"fullName":"DataTable renders every row with no virtual padding spacer for small datasets (virtualization off)","status":"passed","title":"renders every row with no virtual padding spacer for small datasets (virtualization off)","duration":5.031400000000076,"failureMessages":[],"meta":{}},{"ancestorTitles":["DataTable"],"fullName":"DataTable switches to windowed rendering once row count exceeds virtualizeThreshold","status":"passed","title":"switches to windowed rendering once row count exceeds virtualizeThreshold","duration":5.578899999999976,"failureMessages":[],"meta":{}},{"ancestorTitles":["DataTable"],"fullName":"DataTable keys the virtualizer size cache by row identity, not index (avoids stale heights on sort/filter)","status":"passed","title":"keys the virtualizer size cache by row identity, not index (avoids stale heights on sort/filter)","duration":4.583400000000097,"failureMessages":[],"meta":{}},{"ancestorTitles":["DataTable"],"fullName":"DataTable clears stale row and element caches when pagination replaces the row ID set","status":"passed","title":"clears stale row and element caches when pagination replaces the row ID set","duration":75.84199999999998,"failureMessages":[],"meta":{}},{"ancestorTitles":["DataTable"],"fullName":"DataTable clears stale caches when equal-length pages replace rows without stable keys","status":"passed","title":"clears stale caches when equal-length pages replace rows without stable keys","duration":3.890100000000075,"failureMessages":[],"meta":{}},{"ancestorTitles":["DataTable"],"fullName":"DataTable conservatively clears caches when duplicate row-key multiplicity changes","status":"passed","title":"conservatively clears caches when duplicate row-key multiplicity changes","duration":2.713100000000054,"failureMessages":[],"meta":{}},{"ancestorTitles":["DataTable"],"fullName":"DataTable preserves cache when rows without stable keys only reorder the same objects","status":"passed","title":"preserves cache when rows without stable keys only reorder the same objects","duration":3.4114999999999327,"failureMessages":[],"meta":{}},{"ancestorTitles":["DataTable"],"fullName":"DataTable preserves stable row height cache when the same row IDs are only reordered","status":"passed","title":"preserves stable row height cache when the same row IDs are only reordered","duration":43.098299999999995,"failureMessages":[],"meta":{}},{"ancestorTitles":["DataTable"],"fullName":"DataTable emits controlled current-page selection while preserving off-page keys","status":"passed","title":"emits controlled current-page selection while preserving off-page keys","duration":6.264299999999935,"failureMessages":[],"meta":{}},{"ancestorTitles":["DataTable"],"fullName":"DataTable keeps the single usage field shrinkable in a 320px mobile card","status":"passed","title":"keeps the single usage field shrinkable in a 320px mobile card","duration":5.966099999999983,"failureMessages":[],"meta":{}},{"ancestorTitles":["DataTable"],"fullName":"DataTable offers current-page select all in the mobile card layout","status":"passed","title":"offers current-page select all in the mobile card layout","duration":3.3182999999999083,"failureMessages":[],"meta":{}}],"startTime":1789442773039,"endTime":1789442773241.3184,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/components/common/__tests__/DataTable.spec.ts"},{"assertionResults":[{"ancestorTitles":["DateRangePicker"],"fullName":"DateRangePicker uses last 24 hours as the default recognized preset","status":"passed","title":"uses last 24 hours as the default recognized preset","duration":11.808299999999917,"failureMessages":[],"meta":{}},{"ancestorTitles":["DateRangePicker"],"fullName":"DateRangePicker emits range updates with last24Hours preset when applied","status":"passed","title":"emits range updates with last24Hours preset when applied","duration":13.809600000000046,"failureMessages":[],"meta":{}}],"startTime":1789442802623,"endTime":1789442802648.8096,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/components/common/__tests__/DateRangePicker.spec.ts"},{"assertionResults":[{"ancestorTitles":["GroupOptionItem description layout"],"fullName":"GroupOptionItem description layout applies multiline and overflow-safe text styles","status":"passed","title":"applies multiline and overflow-safe text styles","duration":14.339699999999993,"failureMessages":[],"meta":{}}],"startTime":1789442817235,"endTime":1789442817249.3396,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/components/common/__tests__/GroupOptionItem.spec.ts"},{"assertionResults":[{"ancestorTitles":["GroupSelector simple-mode binding policy"],"fullName":"GroupSelector simple-mode binding policy hides composite groups in simple mode and preserves basic groups","status":"passed","title":"hides composite groups in simple mode and preserves basic groups","duration":16.035699999999906,"failureMessages":[],"meta":{}},{"ancestorTitles":["GroupSelector simple-mode binding policy"],"fullName":"GroupSelector simple-mode binding policy keeps composite groups available in advanced mode","status":"passed","title":"keeps composite groups available in advanced mode","duration":2.3021999999999707,"failureMessages":[],"meta":{}},{"ancestorTitles":["GroupSelector simple-mode binding policy"],"fullName":"GroupSelector simple-mode binding policy cleans hidden historical composite IDs while preserving visible selections","status":"passed","title":"cleans hidden historical composite IDs while preserving visible selections","duration":2.1199000000000296,"failureMessages":[],"meta":{}}],"startTime":1789442814451,"endTime":1789442814471.1199,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/components/common/__tests__/GroupSelector.spec.ts"},{"assertionResults":[{"ancestorTitles":["HelpTooltip"],"fullName":"HelpTooltip keeps the existing hover interaction by default","status":"passed","title":"keeps the existing hover interaction by default","duration":25.676799999999957,"failureMessages":[],"meta":{}},{"ancestorTitles":["HelpTooltip"],"fullName":"HelpTooltip keeps a hover tooltip open while the pointer moves between the trigger and the tooltip","status":"passed","title":"keeps a hover tooltip open while the pointer moves between the trigger and the tooltip","duration":3.54079999999999,"failureMessages":[],"meta":{}},{"ancestorTitles":["HelpTooltip"],"fullName":"HelpTooltip supports click-to-toggle details and closes on outside click","status":"passed","title":"supports click-to-toggle details and closes on outside click","duration":5.220900000000029,"failureMessages":[],"meta":{}}],"startTime":1789442798469,"endTime":1789442798503.221,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/components/common/__tests__/HelpTooltip.spec.ts"},{"assertionResults":[{"ancestorTitles":["IpGeoCell"],"fullName":"IpGeoCell renders a clickable fetch link in idle state and triggers fetchOne on click","status":"passed","title":"renders a clickable fetch link in idle state and triggers fetchOne on click","duration":12.855800000000045,"failureMessages":[],"meta":{}},{"ancestorTitles":["IpGeoCell"],"fullName":"IpGeoCell renders loading state","status":"passed","title":"renders loading state","duration":1.8772000000000162,"failureMessages":[],"meta":{}},{"ancestorTitles":["IpGeoCell"],"fullName":"IpGeoCell renders success state with label, tooltip detail, and a refresh button","status":"passed","title":"renders success state with label, tooltip detail, and a refresh button","duration":2.3941999999999553,"failureMessages":[],"meta":{}},{"ancestorTitles":["IpGeoCell"],"fullName":"IpGeoCell opens the external lookup page when the label is clicked","status":"passed","title":"opens the external lookup page when the label is clicked","duration":1.6784000000000106,"failureMessages":[],"meta":{}},{"ancestorTitles":["IpGeoCell"],"fullName":"IpGeoCell renders failed state as a clickable retry","status":"passed","title":"renders failed state as a clickable retry","duration":0.9759999999999991,"failureMessages":[],"meta":{}},{"ancestorTitles":["IpGeoCell"],"fullName":"IpGeoCell renders private state as non-clickable text","status":"passed","title":"renders private state as non-clickable text","duration":0.7281000000000404,"failureMessages":[],"meta":{}}],"startTime":1789442795215,"endTime":1789442795235.728,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/components/common/__tests__/IpGeoCell.spec.ts"},{"assertionResults":[{"ancestorTitles":["MonitorQuotaView"],"fullName":"MonitorQuotaView renders nothing without a snapshot","status":"passed","title":"renders nothing without a snapshot","duration":6.710000000000036,"failureMessages":[],"meta":{}},{"ancestorTitles":["MonitorQuotaView"],"fullName":"MonitorQuotaView maps tier window/label tokens through i18n and colors utilization","status":"passed","title":"maps tier window/label tokens through i18n and colors utilization","duration":14.275400000000104,"failureMessages":[],"meta":{}},{"ancestorTitles":["MonitorQuotaView"],"fullName":"MonitorQuotaView clamps the tier bar width into 0-100","status":"passed","title":"clamps the tier bar width into 0-100","duration":2.036100000000033,"failureMessages":[],"meta":{}},{"ancestorTitles":["MonitorQuotaView"],"fullName":"MonitorQuotaView shows the plan level badge and multi-currency balances","status":"passed","title":"shows the plan level badge and multi-currency balances","duration":1.366200000000049,"failureMessages":[],"meta":{}},{"ancestorTitles":["MonitorQuotaView"],"fullName":"MonitorQuotaView falls back to the single balance + currency pair","status":"passed","title":"falls back to the single balance + currency pair","duration":0.8387000000000171,"failureMessages":[],"meta":{}},{"ancestorTitles":["MonitorQuotaView"],"fullName":"MonitorQuotaView renders a truncated error state when the fetch failed","status":"passed","title":"renders a truncated error state when the fetch failed","duration":1.354600000000005,"failureMessages":[],"meta":{}},{"ancestorTitles":["MonitorQuotaView"],"fullName":"MonitorQuotaView keeps failed snapshots from rendering tier rows","status":"passed","title":"keeps failed snapshots from rendering tier rows","duration":0.7744000000000142,"failureMessages":[],"meta":{}}],"startTime":1789442792063,"endTime":1789442792090.7744,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/components/common/__tests__/MonitorQuotaView.spec.ts"},{"assertionResults":[{"ancestorTitles":["NavigationProgress"],"fullName":"NavigationProgress isLoading=false 时进度条应该隐藏","status":"passed","title":"isLoading=false 时进度条应该隐藏","duration":30.609699999999975,"failureMessages":[],"meta":{}},{"ancestorTitles":["NavigationProgress"],"fullName":"NavigationProgress isLoading=true 时进度条应该可见","status":"passed","title":"isLoading=true 时进度条应该可见","duration":3.40319999999997,"failureMessages":[],"meta":{}},{"ancestorTitles":["NavigationProgress"],"fullName":"NavigationProgress 应该有正确的 ARIA 属性","status":"passed","title":"应该有正确的 ARIA 属性","duration":2.7900999999999385,"failureMessages":[],"meta":{}},{"ancestorTitles":["NavigationProgress"],"fullName":"NavigationProgress 进度条应该有动画 class","status":"passed","title":"进度条应该有动画 class","duration":1.8590000000000373,"failureMessages":[],"meta":{}},{"ancestorTitles":["NavigationProgress"],"fullName":"NavigationProgress 应该正确响应 isLoading 状态变化","status":"passed","title":"应该正确响应 isLoading 状态变化","duration":4.121399999999994,"failureMessages":[],"meta":{}}],"startTime":1789442804840,"endTime":1789442804883.1213,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/components/common/__tests__/NavigationProgress.spec.ts"},{"assertionResults":[{"ancestorTitles":["PlatformTypeBadge Grok plans"],"fullName":"PlatformTypeBadge Grok plans renders FREE and BASIC as Grok Free with a lightweight plan icon","status":"passed","title":"renders FREE and BASIC as Grok Free with a lightweight plan icon","duration":16.56090000000006,"failureMessages":[],"meta":{}},{"ancestorTitles":["PlatformTypeBadge Grok plans"],"fullName":"PlatformTypeBadge Grok plans keeps SuperGrok labels compatible and marks paid Grok plans","status":"passed","title":"keeps SuperGrok labels compatible and marks paid Grok plans","duration":7.170600000000036,"failureMessages":[],"meta":{}},{"ancestorTitles":["PlatformTypeBadge Grok plans"],"fullName":"PlatformTypeBadge Grok plans colors free gray, SuperGrok cyan, and Heavy purple","status":"passed","title":"colors free gray, SuperGrok cyan, and Heavy purple","duration":6.924599999999941,"failureMessages":[],"meta":{}},{"ancestorTitles":["PlatformTypeBadge Grok plans"],"fullName":"PlatformTypeBadge Grok plans uses a dedicated 12px currentColor Grok mark with a Free sparkle","status":"passed","title":"uses a dedicated 12px currentColor Grok mark with a Free sparkle","duration":2.2391999999999825,"failureMessages":[],"meta":{}},{"ancestorTitles":["PlatformTypeBadge OpenAI authentication modes"],"fullName":"PlatformTypeBadge OpenAI authentication modes distinguishes Agent Identity, PAT, and OAuth accounts","status":"passed","title":"distinguishes Agent Identity, PAT, and OAuth accounts","duration":1.526200000000017,"failureMessages":[],"meta":{}},{"ancestorTitles":["PlatformTypeBadge MiniMax"],"fullName":"PlatformTypeBadge MiniMax labels MiniMax API keys as MiniMax, not Gemini","status":"passed","title":"labels MiniMax API keys as MiniMax, not Gemini","duration":1.4058999999999742,"failureMessages":[],"meta":{}}],"startTime":1789442790703,"endTime":1789442790738.406,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/components/common/__tests__/PlatformTypeBadge.grok.spec.ts"},{"assertionResults":[{"ancestorTitles":["Select dropdown viewport constraints"],"fullName":"Select dropdown viewport constraints preserves the existing 200px minimum width when space is available","status":"passed","title":"preserves the existing 200px minimum width when space is available","duration":25.779499999999985,"failureMessages":[],"meta":{}},{"ancestorTitles":["Select dropdown viewport constraints"],"fullName":"Select dropdown viewport constraints shrinks the minimum width to fit near the right viewport edge","status":"passed","title":"shrinks the minimum width to fit near the right viewport edge","duration":5.023800000000051,"failureMessages":[],"meta":{}},{"ancestorTitles":["Select dropdown viewport constraints"],"fullName":"Select dropdown viewport constraints clamps a trigger left of the viewport to the safe padding","status":"passed","title":"clamps a trigger left of the viewport to the safe padding","duration":3.9383000000000266,"failureMessages":[],"meta":{}},{"ancestorTitles":["Select dropdown viewport constraints"],"fullName":"Select dropdown viewport constraints clamps an offscreen-right trigger position to the viewport boundary","status":"passed","title":"clamps an offscreen-right trigger position to the viewport boundary","duration":3.4717000000000553,"failureMessages":[],"meta":{}},{"ancestorTitles":["Select remote search"],"fullName":"Select remote search emits debounced search events and skips local filtering in remote mode","status":"passed","title":"emits debounced search events and skips local filtering in remote mode","duration":10.498100000000022,"failureMessages":[],"meta":{}},{"ancestorTitles":["Select remote search"],"fullName":"Select remote search does not emit search when the dropdown closes and the query resets","status":"passed","title":"does not emit search when the dropdown closes and the query resets","duration":4.627200000000016,"failureMessages":[],"meta":{}},{"ancestorTitles":["Select remote search"],"fullName":"Select remote search shows the loading text instead of empty text while loading with no options","status":"passed","title":"shows the loading text instead of empty text while loading with no options","duration":3.07650000000001,"failureMessages":[],"meta":{}},{"ancestorTitles":["Select remote search"],"fullName":"Select remote search keeps local filtering and emits nothing when remote is not set","status":"passed","title":"keeps local filtering and emits nothing when remote is not set","duration":3.9162000000000035,"failureMessages":[],"meta":{}}],"startTime":1789442784988,"endTime":1789442785047.9163,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/components/common/__tests__/Select.spec.ts"},{"assertionResults":[{"ancestorTitles":["PlazaGroupSection 长上下文说明"],"fullName":"PlazaGroupSection 长上下文说明 分组关闭阶梯且组内有官方阶梯模型时显示说明","status":"passed","title":"分组关闭阶梯且组内有官方阶梯模型时显示说明","duration":10.563999999999965,"failureMessages":[],"meta":{}},{"ancestorTitles":["PlazaGroupSection 长上下文说明"],"fullName":"PlazaGroupSection 长上下文说明 分组开启阶梯时不显示","status":"passed","title":"分组开启阶梯时不显示","duration":1.5486999999999398,"failureMessages":[],"meta":{}},{"ancestorTitles":["PlazaGroupSection 长上下文说明"],"fullName":"PlazaGroupSection 长上下文说明 分组关闭但没有官方阶梯模型时不显示","status":"passed","title":"分组关闭但没有官方阶梯模型时不显示","duration":1.3852000000000544,"failureMessages":[],"meta":{}},{"ancestorTitles":["PlazaGroupSection 长上下文说明"],"fullName":"PlazaGroupSection 长上下文说明 旧后端缺少开关字段时不显示","status":"passed","title":"旧后端缺少开关字段时不显示","duration":1.1362000000000307,"failureMessages":[],"meta":{}},{"ancestorTitles":["PlazaGroupSection 高峰配置传递"],"fullName":"PlazaGroupSection 高峰配置传递 分组启用高峰时把窗口描述与倍率传给价格表","status":"passed","title":"分组启用高峰时把窗口描述与倍率传给价格表","duration":1.9184999999999945,"failureMessages":[],"meta":{}},{"ancestorTitles":["PlazaGroupSection 高峰配置传递"],"fullName":"PlazaGroupSection 高峰配置传递 分组未启用高峰时窗口描述为空串","status":"passed","title":"分组未启用高峰时窗口描述为空串","duration":1.149499999999989,"failureMessages":[],"meta":{}}],"startTime":1789442794175,"endTime":1789442794193.1494,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/components/modelPlaza/__tests__/PlazaGroupSection.spec.ts"},{"assertionResults":[{"ancestorTitles":["PlazaModelPricingTable"],"fullName":"PlazaModelPricingTable 倍率为 1 时展示渠道单价原值($/1M),价格保底 2 位小数","status":"passed","title":"倍率为 1 时展示渠道单价原值($/1M),价格保底 2 位小数","duration":14.17060000000015,"failureMessages":[],"meta":{}},{"ancestorTitles":["PlazaModelPricingTable"],"fullName":"PlazaModelPricingTable shows the Max reasoning billing multiplier","status":"passed","title":"shows the Max reasoning billing multiplier","duration":7.0715000000000146,"failureMessages":[],"meta":{}},{"ancestorTitles":["PlazaModelPricingTable"],"fullName":"PlazaModelPricingTable 倍率 ≠ 1 时价格列为折后实付价,官方价列保持原价","status":"passed","title":"倍率 ≠ 1 时价格列为折后实付价,官方价列保持原价","duration":2.622100000000046,"failureMessages":[],"meta":{}},{"ancestorTitles":["PlazaModelPricingTable"],"fullName":"PlazaModelPricingTable 用户专属倍率覆盖分组倍率,并划线展示原倍率","status":"passed","title":"用户专属倍率覆盖分组倍率,并划线展示原倍率","duration":3.601599999999962,"failureMessages":[],"meta":{}},{"ancestorTitles":["PlazaModelPricingTable"],"fullName":"PlazaModelPricingTable 模型按官方输出价从高到低排序,无官方价的排最后","status":"passed","title":"模型按官方输出价从高到低排序,无官方价的排最后","duration":5.157900000000154,"failureMessages":[],"meta":{}},{"ancestorTitles":["PlazaModelPricingTable"],"fullName":"PlazaModelPricingTable 官方输出价相同时按模型名降序(新版本号在前)","status":"passed","title":"官方输出价相同时按模型名降序(新版本号在前)","duration":10.678499999999985,"failureMessages":[],"meta":{}},{"ancestorTitles":["PlazaModelPricingTable"],"fullName":"PlazaModelPricingTable 按图片/按次计费的模型沉到末尾,不与 token 模型按官方价混排","status":"passed","title":"按图片/按次计费的模型沉到末尾,不与 token 模型按官方价混排","duration":4.37720000000013,"failureMessages":[],"meta":{}},{"ancestorTitles":["PlazaModelPricingTable"],"fullName":"PlazaModelPricingTable 两级表头:实付区与官方区各拆输入/输出/缓存列","status":"passed","title":"两级表头:实付区与官方区各拆输入/输出/缓存列","duration":4.840200000000095,"failureMessages":[],"meta":{}},{"ancestorTitles":["PlazaModelPricingTable"],"fullName":"PlazaModelPricingTable 官方价包含 1h 缓存写入价;official_pricing 为 null 时官方三列显示 -","status":"passed","title":"官方价包含 1h 缓存写入价;official_pricing 为 null 时官方三列显示 -","duration":3.859399999999823,"failureMessages":[],"meta":{}},{"ancestorTitles":["PlazaModelPricingTable"],"fullName":"PlazaModelPricingTable 实付价分别展示自定义 5m 与 1h 缓存写入价","status":"passed","title":"实付价分别展示自定义 5m 与 1h 缓存写入价","duration":1.8675000000000637,"failureMessages":[],"meta":{}},{"ancestorTitles":["PlazaModelPricingTable"],"fullName":"PlazaModelPricingTable per_request 模型按单次价 × 倍率展示,官方价列显示 -","status":"passed","title":"per_request 模型按单次价 × 倍率展示,官方价列显示 -","duration":1.3494000000000597,"failureMessages":[],"meta":{}},{"ancestorTitles":["PlazaModelPricingTable"],"fullName":"PlazaModelPricingTable token 模型阶梯定价内联进输入/输出列,按倍率折算","status":"passed","title":"token 模型阶梯定价内联进输入/输出列,按倍率折算","duration":2.0186999999998534,"failureMessages":[],"meta":{}},{"ancestorTitles":["PlazaModelPricingTable"],"fullName":"PlazaModelPricingTable 仅配置区间倍率时按基础价格展示 input/output/cache 各档价格","status":"passed","title":"仅配置区间倍率时按基础价格展示 input/output/cache 各档价格","duration":3.7702999999999065,"failureMessages":[],"meta":{}},{"ancestorTitles":["PlazaModelPricingTable"],"fullName":"PlazaModelPricingTable 生图独立倍率开启时,按图价格 × 独立倍率,不乘分组倍率;倍率列展示独立倍率","status":"passed","title":"生图独立倍率开启时,按图价格 × 独立倍率,不乘分组倍率;倍率列展示独立倍率","duration":2.1019000000001142,"failureMessages":[],"meta":{}},{"ancestorTitles":["PlazaModelPricingTable"],"fullName":"PlazaModelPricingTable 生图独立倍率关闭时,按图价格仍乘分组/专属生效倍率","status":"passed","title":"生图独立倍率关闭时,按图价格仍乘分组/专属生效倍率","duration":1.6421000000000276,"failureMessages":[],"meta":{}},{"ancestorTitles":["PlazaModelPricingTable"],"fullName":"PlazaModelPricingTable 按图模型主行展示阶梯芯片,不把 image_output_price(每 token)当按次价","status":"passed","title":"按图模型主行展示阶梯芯片,不把 image_output_price(每 token)当按次价","duration":1.559500000000071,"failureMessages":[],"meta":{}},{"ancestorTitles":["PlazaModelPricingTable"],"fullName":"PlazaModelPricingTable Composite 分组中相同模型名按具体平台分别展示徽章","status":"passed","title":"Composite 分组中相同模型名按具体平台分别展示徽章","duration":7.845700000000079,"failureMessages":[],"meta":{}},{"ancestorTitles":["PlazaModelPricingTable 长上下文阶梯"],"fullName":"PlazaModelPricingTable 长上下文阶梯 实付缓存列按档分行并乘倍率,每档一行与输入/输出列对齐;档位标签只在输入列","status":"passed","title":"实付缓存列按档分行并乘倍率,每档一行与输入/输出列对齐;档位标签只在输入列","duration":2.542599999999993,"failureMessages":[],"meta":{}},{"ancestorTitles":["PlazaModelPricingTable 长上下文阶梯"],"fullName":"PlazaModelPricingTable 长上下文阶梯 官方三列按 official_pricing.intervals 分档且不乘倍率,不内联 1h","status":"passed","title":"官方三列按 official_pricing.intervals 分档且不乘倍率,不内联 1h","duration":1.8850999999999658,"failureMessages":[],"meta":{}},{"ancestorTitles":["PlazaModelPricingTable 长上下文阶梯"],"fullName":"PlazaModelPricingTable 长上下文阶梯 整单计价的档位标签带 tooltip;边际计价在模型名旁加徽章并换用边际说明","status":"passed","title":"整单计价的档位标签带 tooltip;边际计价在模型名旁加徽章并换用边际说明","duration":4.187900000000127,"failureMessages":[],"meta":{}},{"ancestorTitles":["PlazaModelPricingTable 长上下文阶梯"],"fullName":"PlazaModelPricingTable 长上下文阶梯 无标签的多档按区间生成统一形态(≤上限 / >下限),并按下限升序展示","status":"passed","title":"无标签的多档按区间生成统一形态(≤上限 / >下限),并按下限升序展示","duration":2.310699999999997,"failureMessages":[],"meta":{}},{"ancestorTitles":["PlazaModelPricingTable 长上下文阶梯"],"fullName":"PlazaModelPricingTable 长上下文阶梯 官方无 intervals 字段(旧响应)时官方列保持平价,实付无阶梯时缓存列保持两行","status":"passed","title":"官方无 intervals 字段(旧响应)时官方列保持平价,实付无阶梯时缓存列保持两行","duration":1.3776000000000295,"failureMessages":[],"meta":{}},{"ancestorTitles":["PlazaModelPricingTable 分时计价"],"fullName":"PlazaModelPricingTable 分时计价 有分时倍率的模型展开为标准行 + 每时段一行,时段行价格按倍率折算且倍率列显示生效倍率","status":"passed","title":"有分时倍率的模型展开为标准行 + 每时段一行,时段行价格按倍率折算且倍率列显示生效倍率","duration":2.824000000000069,"failureMessages":[],"meta":{}},{"ancestorTitles":["PlazaModelPricingTable 分时计价"],"fullName":"PlazaModelPricingTable 分时计价 仅工作日生效时时段行带工作日前缀,tooltip 换用周末回落文案","status":"passed","title":"仅工作日生效时时段行带工作日前缀,tooltip 换用周末回落文案","duration":2.340599999999995,"failureMessages":[],"meta":{}},{"ancestorTitles":["PlazaModelPricingTable 分时计价"],"fullName":"PlazaModelPricingTable 分时计价 每日生效(无 weekdays_only)不渲染工作日前缀","status":"passed","title":"每日生效(无 weekdays_only)不渲染工作日前缀","duration":2.681100000000015,"failureMessages":[],"meta":{}},{"ancestorTitles":["PlazaModelPricingTable 分时计价"],"fullName":"PlazaModelPricingTable 分时计价 分组启用高峰倍率时时段行 tooltip 追加高峰披露,价格与倍率列保持不含高峰的口径","status":"passed","title":"分组启用高峰倍率时时段行 tooltip 追加高峰披露,价格与倍率列保持不含高峰的口径","duration":4.078900000000203,"failureMessages":[],"meta":{}},{"ancestorTitles":["PlazaModelPricingTable 分时计价"],"fullName":"PlazaModelPricingTable 分时计价 分组未启用高峰(peakWindow 缺省)时 tooltip 不含高峰披露","status":"passed","title":"分组未启用高峰(peakWindow 缺省)时 tooltip 不含高峰披露","duration":9.589099999999917,"failureMessages":[],"meta":{}},{"ancestorTitles":["PlazaModelPricingTable 分时计价"],"fullName":"PlazaModelPricingTable 分时计价 无分时倍率时只有一行,不渲染时段标注","status":"passed","title":"无分时倍率时只有一行,不渲染时段标注","duration":1.4701000000000022,"failureMessages":[],"meta":{}}],"startTime":1789442759949,"endTime":1789442760063.4702,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/components/modelPlaza/__tests__/PlazaModelPricingTable.spec.ts"},{"assertionResults":[{"ancestorTitles":["GroupDistributionChart"],"fullName":"GroupDistributionChart uses total_tokens and token ordering by default","status":"passed","title":"uses total_tokens and token ordering by default","duration":30.06549999999993,"failureMessages":[],"meta":{}},{"ancestorTitles":["GroupDistributionChart"],"fullName":"GroupDistributionChart uses actual_cost and reorders rows in actual cost mode","status":"passed","title":"uses actual_cost and reorders rows in actual cost mode","duration":3.09719999999993,"failureMessages":[],"meta":{}},{"ancestorTitles":["GroupDistributionChart"],"fullName":"GroupDistributionChart can hide account cost for user usage stats without account_cost","status":"passed","title":"can hide account cost for user usage stats without account_cost","duration":3.643100000000004,"failureMessages":[],"meta":{}}],"startTime":1789442795928,"endTime":1789442795964.643,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/components/charts/__tests__/GroupDistributionChart.spec.ts"},{"assertionResults":[{"ancestorTitles":["ModelDistributionChart"],"fullName":"ModelDistributionChart uses total_tokens and token ordering by default","status":"passed","title":"uses total_tokens and token ordering by default","duration":30.091699999999946,"failureMessages":[],"meta":{}},{"ancestorTitles":["ModelDistributionChart"],"fullName":"ModelDistributionChart uses actual_cost and reorders rows in actual cost mode","status":"passed","title":"uses actual_cost and reorders rows in actual cost mode","duration":3.2368999999999915,"failureMessages":[],"meta":{}},{"ancestorTitles":["ModelDistributionChart"],"fullName":"ModelDistributionChart can hide account cost for user usage stats without account_cost","status":"passed","title":"can hide account cost for user usage stats without account_cost","duration":3.473600000000033,"failureMessages":[],"meta":{}},{"ancestorTitles":["ModelDistributionChart"],"fullName":"ModelDistributionChart uses the dashboard user label policy and renders Others with a dedicated chart color","status":"passed","title":"uses the dashboard user label policy and renders Others with a dedicated chart color","duration":5.681100000000015,"failureMessages":[],"meta":{}}],"startTime":1789442785556,"endTime":1789442785598.6812,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/components/charts/__tests__/ModelDistributionChart.spec.ts"},{"assertionResults":[{"ancestorTitles":["TokenUsageTrend"],"fullName":"TokenUsageTrend calculates cache hit rate against all prompt tokens","status":"passed","title":"calculates cache hit rate against all prompt tokens","duration":16.273500000000013,"failureMessages":[],"meta":{}},{"ancestorTitles":["TokenUsageTrend"],"fullName":"TokenUsageTrend returns 0 hit rate when all prompt tokens are zero","status":"passed","title":"returns 0 hit rate when all prompt tokens are zero","duration":1.9461000000000013,"failureMessages":[],"meta":{}},{"ancestorTitles":["TokenUsageTrend"],"fullName":"TokenUsageTrend includes cache_creation_tokens in denominator for Anthropic models","status":"passed","title":"includes cache_creation_tokens in denominator for Anthropic models","duration":1.6664999999999281,"failureMessages":[],"meta":{}}],"startTime":1789442798536,"endTime":1789442798556.6665,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/components/charts/__tests__/TokenUsageTrend.spec.ts"},{"assertionResults":[{"ancestorTitles":["MonitorCard quota snapshot visibility"],"fullName":"MonitorCard quota snapshot visibility hides the quota block when the system switch is off even if data exists","status":"passed","title":"hides the quota block when the system switch is off even if data exists","duration":15.768400000000042,"failureMessages":[],"meta":{}},{"ancestorTitles":["MonitorCard quota snapshot visibility"],"fullName":"MonitorCard quota snapshot visibility renders the quota block when the switch is on and a snapshot exists","status":"passed","title":"renders the quota block when the switch is on and a snapshot exists","duration":5.691500000000019,"failureMessages":[],"meta":{}},{"ancestorTitles":["MonitorCard quota snapshot visibility"],"fullName":"MonitorCard quota snapshot visibility never renders the quota block without a snapshot","status":"passed","title":"never renders the quota block without a snapshot","duration":1.8020999999999958,"failureMessages":[],"meta":{}},{"ancestorTitles":["MonitorCard quota snapshot visibility"],"fullName":"MonitorCard quota snapshot visibility shows the localized quota label instead of the raw placeholder model","status":"passed","title":"shows the localized quota label instead of the raw placeholder model","duration":1.649599999999964,"failureMessages":[],"meta":{}},{"ancestorTitles":["MonitorCard quota snapshot visibility"],"fullName":"MonitorCard quota snapshot visibility keeps the real model name for probe monitors","status":"passed","title":"keeps the real model name for probe monitors","duration":1.6173000000000002,"failureMessages":[],"meta":{}}],"startTime":1789442798581,"endTime":1789442798607.6172,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/components/user/__tests__/MonitorCard.quota.spec.ts"},{"assertionResults":[{"ancestorTitles":["UserPlatformQuotaCell"],"fullName":"UserPlatformQuotaCell quotas 为 undefined 时渲染加载占位 …","status":"passed","title":"quotas 为 undefined 时渲染加载占位 …","duration":12.285100000000057,"failureMessages":[],"meta":{}},{"ancestorTitles":["UserPlatformQuotaCell"],"fullName":"UserPlatformQuotaCell 空数组渲染「未配置」","status":"passed","title":"空数组渲染「未配置」","duration":1.8935000000000173,"failureMessages":[],"meta":{}},{"ancestorTitles":["UserPlatformQuotaCell"],"fullName":"UserPlatformQuotaCell 平台有记录但全部 limit 为 null 时视为未配置","status":"passed","title":"平台有记录但全部 limit 为 null 时视为未配置","duration":1.376700000000028,"failureMessages":[],"meta":{}},{"ancestorTitles":["UserPlatformQuotaCell"],"fullName":"UserPlatformQuotaCell 已配置平台渲染 已用/限额,null 档显示 —,金额去尾零","status":"passed","title":"已配置平台渲染 已用/限额,null 档显示 —,金额去尾零","duration":2.570899999999938,"failureMessages":[],"meta":{}},{"ancestorTitles":["UserPlatformQuotaCell"],"fullName":"UserPlatformQuotaCell 多平台按 anthropic→openai→gemini→antigravity 顺序,仅展示有限额的","status":"passed","title":"多平台按 anthropic→openai→gemini→antigravity 顺序,仅展示有限额的","duration":1.415899999999965,"failureMessages":[],"meta":{}}],"startTime":1789442803288,"endTime":1789442803307.416,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/components/user/__tests__/UserPlatformQuotaCell.spec.ts"},{"assertionResults":[{"ancestorTitles":["Alipay deep link"],"fullName":"Alipay deep link URL-encodes the dynamic qr_code exactly once","status":"passed","title":"URL-encodes the dynamic qr_code exactly once","duration":1.313199999999938,"failureMessages":[],"meta":{}},{"ancestorTitles":["Alipay deep link"],"fullName":"Alipay deep link shows fallback after the visible-page timeout","status":"passed","title":"shows fallback after the visible-page timeout","duration":2.0236000000001013,"failureMessages":[],"meta":{}},{"ancestorTitles":["Alipay deep link"],"fullName":"Alipay deep link keeps fallback hidden when visibilitychange reports the page in background","status":"passed","title":"keeps fallback hidden when visibilitychange reports the page in background","duration":0.5778999999999996,"failureMessages":[],"meta":{}},{"ancestorTitles":["Alipay deep link"],"fullName":"Alipay deep link uses the fast fallback window in restricted browser Mozilla/5.0 MicroMessenger/8.0","status":"passed","title":"uses the fast fallback window in restricted browser Mozilla/5.0 MicroMessenger/8.0","duration":0.3048000000000002,"failureMessages":[],"meta":{}},{"ancestorTitles":["Alipay deep link"],"fullName":"Alipay deep link uses the fast fallback window in restricted browser Mozilla/5.0 MQQBrowser/13.7 Mobile","status":"passed","title":"uses the fast fallback window in restricted browser Mozilla/5.0 MQQBrowser/13.7 Mobile","duration":0.23479999999995016,"failureMessages":[],"meta":{}},{"ancestorTitles":["Alipay deep link"],"fullName":"Alipay deep link uses the fast fallback window in restricted browser Mozilla/5.0 Mobile QQ/9.0","status":"passed","title":"uses the fast fallback window in restricted browser Mozilla/5.0 Mobile QQ/9.0","duration":0.2504999999999882,"failureMessages":[],"meta":{}},{"ancestorTitles":["Alipay deep link"],"fullName":"Alipay deep link treats pagehide as a successful handoff","status":"passed","title":"treats pagehide as a successful handoff","duration":0.3308000000000675,"failureMessages":[],"meta":{}}],"startTime":1789442791262,"endTime":1789442791267.3308,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/components/payment/__tests__/alipayDeepLink.spec.ts"},{"assertionResults":[{"ancestorTitles":["formatPaymentAmount"],"fullName":"formatPaymentAmount uses the currency default fraction digits","status":"passed","title":"uses the currency default fraction digits","duration":10.414600000000064,"failureMessages":[],"meta":{}},{"ancestorTitles":["currencySymbol"],"fullName":"currencySymbol maps common payment currencies and falls back safely","status":"passed","title":"maps common payment currencies and falls back safely","duration":0.2296000000000049,"failureMessages":[],"meta":{}}],"startTime":1789442823868,"endTime":1789442823878.4146,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/components/payment/__tests__/currency.spec.ts"},{"assertionResults":[{"ancestorTitles":["getVisibleMethods"],"fullName":"getVisibleMethods normalizes provider aliases and keeps stripe as a top-level method","status":"passed","title":"normalizes provider aliases and keeps stripe as a top-level method","duration":2.3841999999999643,"failureMessages":[],"meta":{}},{"ancestorTitles":["getVisibleMethods"],"fullName":"getVisibleMethods prefers canonical visible methods over aliases when both exist","status":"passed","title":"prefers canonical visible methods over aliases when both exist","duration":0.5216000000000349,"failureMessages":[],"meta":{}},{"ancestorTitles":["getVisibleMethods"],"fullName":"getVisibleMethods keeps custom EasyPay methods as visible methods","status":"passed","title":"keeps custom EasyPay methods as visible methods","duration":0.35150000000021464,"failureMessages":[],"meta":{}},{"ancestorTitles":["decidePaymentLaunch"],"fullName":"decidePaymentLaunch uses Stripe popup waiting flow for desktop Alipay client secret","status":"passed","title":"uses Stripe popup waiting flow for desktop Alipay client secret","duration":0.7288000000003194,"failureMessages":[],"meta":{}},{"ancestorTitles":["decidePaymentLaunch"],"fullName":"decidePaymentLaunch routes Stripe button click to the full Payment Element without a preselected sub-method","status":"passed","title":"routes Stripe button click to the full Payment Element without a preselected sub-method","duration":0.2638000000001739,"failureMessages":[],"meta":{}},{"ancestorTitles":["decidePaymentLaunch"],"fullName":"decidePaymentLaunch uses Stripe route flow for mobile WeChat client secret","status":"passed","title":"uses Stripe route flow for mobile WeChat client secret","duration":0.2743999999997868,"failureMessages":[],"meta":{}},{"ancestorTitles":["decidePaymentLaunch"],"fullName":"decidePaymentLaunch routes Airwallex client secrets through the hosted Airwallex page","status":"passed","title":"routes Airwallex client secrets through the hosted Airwallex page","duration":0.4768999999996595,"failureMessages":[],"meta":{}},{"ancestorTitles":["decidePaymentLaunch"],"fullName":"decidePaymentLaunch keeps hosted redirect metadata for recovery flows","status":"passed","title":"keeps hosted redirect metadata for recovery flows","duration":0.33750000000009095,"failureMessages":[],"meta":{}},{"ancestorTitles":["decidePaymentLaunch"],"fullName":"decidePaymentLaunch prefers redirect on mobile when both pay_url and qr_code are present","status":"passed","title":"prefers redirect on mobile when both pay_url and qr_code are present","duration":0.2794999999996435,"failureMessages":[],"meta":{}},{"ancestorTitles":["decidePaymentLaunch"],"fullName":"decidePaymentLaunch keeps QR flow on desktop when both pay_url and qr_code are present","status":"passed","title":"keeps QR flow on desktop when both pay_url and qr_code are present","duration":0.20739999999977954,"failureMessages":[],"meta":{}},{"ancestorTitles":["decidePaymentLaunch"],"fullName":"decidePaymentLaunch returns wechat oauth launch when backend requires in-app authorization","status":"passed","title":"returns wechat oauth launch when backend requires in-app authorization","duration":0.4088000000001557,"failureMessages":[],"meta":{}},{"ancestorTitles":["decidePaymentLaunch"],"fullName":"decidePaymentLaunch returns wechat jsapi launch when backend has a jsapi payload ready","status":"passed","title":"returns wechat jsapi launch when backend has a jsapi payload ready","duration":0.28090000000020154,"failureMessages":[],"meta":{}},{"ancestorTitles":["decidePaymentLaunch"],"fullName":"decidePaymentLaunch forces qr_waiting for mobile alipay when forceQRCode is enabled","status":"passed","title":"forces qr_waiting for mobile alipay when forceQRCode is enabled","duration":0.17599999999993088,"failureMessages":[],"meta":{}},{"ancestorTitles":["decidePaymentLaunch"],"fullName":"decidePaymentLaunch launches the Alipay app for a mobile precreate order","status":"passed","title":"launches the Alipay app for a mobile precreate order","duration":0.17309999999997672,"failureMessages":[],"meta":{}},{"ancestorTitles":["decidePaymentLaunch"],"fullName":"decidePaymentLaunch keeps the desktop Alipay QR flow when a precreate marker is present","status":"passed","title":"keeps the desktop Alipay QR flow when a precreate marker is present","duration":0.12130000000024665,"failureMessages":[],"meta":{}},{"ancestorTitles":["decidePaymentLaunch"],"fullName":"decidePaymentLaunch does not affect non-alipay methods when forceQRCode is enabled","status":"passed","title":"does not affect non-alipay methods when forceQRCode is enabled","duration":0.16660000000001673,"failureMessages":[],"meta":{}},{"ancestorTitles":["buildCreateOrderPayload"],"fullName":"buildCreateOrderPayload normalizes visible method aliases and attaches a canonical result URL","status":"passed","title":"normalizes visible method aliases and attaches a canonical result URL","duration":0.35199999999986176,"failureMessages":[],"meta":{}},{"ancestorTitles":["buildCreateOrderPayload"],"fullName":"buildCreateOrderPayload uses WeChat in-app resume source for visible WeChat payments in the WeChat browser","status":"passed","title":"uses WeChat in-app resume source for visible WeChat payments in the WeChat browser","duration":0.26119999999991705,"failureMessages":[],"meta":{}},{"ancestorTitles":["buildCreateOrderPayload"],"fullName":"buildCreateOrderPayload passes is_mobile: false when forceQRCode is enabled for alipay","status":"passed","title":"passes is_mobile: false when forceQRCode is enabled for alipay","duration":0.718000000000302,"failureMessages":[],"meta":{}},{"ancestorTitles":["buildCreateOrderPayload"],"fullName":"buildCreateOrderPayload keeps is_mobile true when mobile precreate takes priority over forceQRCode","status":"passed","title":"keeps is_mobile true when mobile precreate takes priority over forceQRCode","duration":0.1914999999999054,"failureMessages":[],"meta":{}},{"ancestorTitles":["buildCreateOrderPayload"],"fullName":"buildCreateOrderPayload still passes is_mobile: true when forceQRCode is enabled for non-alipay methods","status":"passed","title":"still passes is_mobile: true when forceQRCode is enabled for non-alipay methods","duration":0.17090000000007421,"failureMessages":[],"meta":{}},{"ancestorTitles":["readPaymentRecoverySnapshot"],"fullName":"readPaymentRecoverySnapshot restores an unexpired snapshot when the resume token matches","status":"passed","title":"restores an unexpired snapshot when the resume token matches","duration":0.4103999999997541,"failureMessages":[],"meta":{}},{"ancestorTitles":["readPaymentRecoverySnapshot"],"fullName":"readPaymentRecoverySnapshot drops expired or mismatched recovery snapshots","status":"passed","title":"drops expired or mismatched recovery snapshots","duration":0.2402999999999338,"failureMessages":[],"meta":{}},{"ancestorTitles":["readPaymentRecoverySnapshot"],"fullName":"readPaymentRecoverySnapshot keeps backward compatibility with snapshots written before outTradeNo existed","status":"passed","title":"keeps backward compatibility with snapshots written before outTradeNo existed","duration":0.20739999999977954,"failureMessages":[],"meta":{}},{"ancestorTitles":["readPaymentRecoverySnapshot"],"fullName":"readPaymentRecoverySnapshot keeps backward compatibility with snapshots written before Airwallex fields existed","status":"passed","title":"keeps backward compatibility with snapshots written before Airwallex fields existed","duration":0.28490000000010696,"failureMessages":[],"meta":{}}],"startTime":1789442768495,"endTime":1789442768505.4104,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/components/payment/__tests__/paymentFlow.spec.ts"},{"assertionResults":[{"ancestorTitles":["PaymentMethodSelector"],"fullName":"PaymentMethodSelector wraps large custom method collections without letting labels widen the selector","status":"passed","title":"wraps large custom method collections without letting labels widen the selector","duration":19.431600000000003,"failureMessages":[],"meta":{}},{"ancestorTitles":["PaymentMethodSelector"],"fullName":"PaymentMethodSelector shows the configured display name for custom EasyPay methods","status":"passed","title":"shows the configured display name for custom EasyPay methods","duration":1.3777000000000044,"failureMessages":[],"meta":{}},{"ancestorTitles":["PaymentMethodSelector"],"fullName":"PaymentMethodSelector uses the generic selected style for custom methods that contain built-in names","status":"passed","title":"uses the generic selected style for custom methods that contain built-in names","duration":1.20150000000001,"failureMessages":[],"meta":{}}],"startTime":1789442806740,"endTime":1789442806762.2014,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/components/payment/__tests__/PaymentMethodSelector.spec.ts"},{"assertionResults":[{"ancestorTitles":["PaymentProviderDialog payment guide"],"fullName":"PaymentProviderDialog payment guide shows no payment guide for providers without a flow guide","status":"passed","title":"shows no payment guide for providers without a flow guide","duration":48.94869999999992,"failureMessages":[],"meta":{}},{"ancestorTitles":["PaymentProviderDialog payment guide"],"fullName":"PaymentProviderDialog payment guide shows the payment guide summary for alipay","status":"passed","title":"shows the payment guide summary for alipay","duration":31.2038,"failureMessages":[],"meta":{}},{"ancestorTitles":["PaymentProviderDialog payment guide"],"fullName":"PaymentProviderDialog payment guide shows the payment guide summary for wxpay","status":"passed","title":"shows the payment guide summary for wxpay","duration":20.244500000000016,"failureMessages":[],"meta":{}},{"ancestorTitles":["PaymentProviderDialog payment guide"],"fullName":"PaymentProviderDialog payment guide shows the payment guide summary for airwallex","status":"passed","title":"shows the payment guide summary for airwallex","duration":15.547199999999975,"failureMessages":[],"meta":{}},{"ancestorTitles":["PaymentProviderDialog payment guide"],"fullName":"PaymentProviderDialog payment guide shows Airwallex webhook event and API version guidance with the webhook URL","status":"passed","title":"shows Airwallex webhook event and API version guidance with the webhook URL","duration":12.982499999999959,"failureMessages":[],"meta":{}},{"ancestorTitles":["PaymentProviderDialog payment guide"],"fullName":"PaymentProviderDialog payment guide shows Stripe webhook API version guidance with the integrated SDK version","status":"passed","title":"shows Stripe webhook API version guidance with the integrated SDK version","duration":8.46690000000001,"failureMessages":[],"meta":{}},{"ancestorTitles":["PaymentProviderDialog payment guide"],"fullName":"PaymentProviderDialog payment guide emits an empty Airwallex accountId when the admin clears it","status":"passed","title":"emits an empty Airwallex accountId when the admin clears it","duration":17.002200000000016,"failureMessages":[],"meta":{}},{"ancestorTitles":["PaymentProviderDialog payment guide"],"fullName":"PaymentProviderDialog payment guide serializes EasyPay custom methods and adds them to supported_types","status":"passed","title":"serializes EasyPay custom methods and adds them to supported_types","duration":25.93889999999999,"failureMessages":[],"meta":{}},{"ancestorTitles":["PaymentProviderDialog payment guide"],"fullName":"PaymentProviderDialog payment guide rejects custom EasyPay method types with built-in payment prefixes","status":"passed","title":"rejects custom EasyPay method types with built-in payment prefixes","duration":12.571299999999951,"failureMessages":[],"meta":{}}],"startTime":1789442775775,"endTime":1789442775967.5713,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/components/payment/__tests__/PaymentProviderDialog.spec.ts"},{"assertionResults":[{"ancestorTitles":["PaymentQRDialog currency display"],"fullName":"PaymentQRDialog currency display uses order currency for pay_amount and USD for credited amount","status":"passed","title":"uses order currency for pay_amount and USD for credited amount","duration":20.632400000000075,"failureMessages":[],"meta":{}}],"startTime":1789442805926,"endTime":1789442805946.6323,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/components/payment/__tests__/PaymentQRDialog.spec.ts"},{"assertionResults":[{"ancestorTitles":["PaymentStatusPanel"],"fullName":"PaymentStatusPanel treats RECHARGING as a successful terminal state","status":"passed","title":"treats RECHARGING as a successful terminal state","duration":60.3836,"failureMessages":[],"meta":{}},{"ancestorTitles":["PaymentStatusPanel"],"fullName":"PaymentStatusPanel shows reopen button in QR mode when payUrl is also available","status":"passed","title":"shows reopen button in QR mode when payUrl is also available","duration":16.1952,"failureMessages":[],"meta":{}},{"ancestorTitles":["PaymentStatusPanel"],"fullName":"PaymentStatusPanel uses generic QR copy for custom methods that contain built-in names","status":"passed","title":"uses generic QR copy for custom methods that contain built-in names","duration":4.09579999999994,"failureMessages":[],"meta":{}},{"ancestorTitles":["PaymentStatusPanel"],"fullName":"PaymentStatusPanel actively verifies a stuck pending order and settles it when upstream confirms payment","status":"passed","title":"actively verifies a stuck pending order and settles it when upstream confirms payment","duration":8.115300000000047,"failureMessages":[],"meta":{}},{"ancestorTitles":["PaymentStatusPanel"],"fullName":"PaymentStatusPanel actively verifies a pending mobile Alipay precreate order","status":"passed","title":"actively verifies a pending mobile Alipay precreate order","duration":12.628299999999967,"failureMessages":[],"meta":{}},{"ancestorTitles":["PaymentStatusPanel"],"fullName":"PaymentStatusPanel actively verifies a pending desktop Alipay order","status":"passed","title":"actively verifies a pending desktop Alipay order","duration":5.5885999999999285,"failureMessages":[],"meta":{}},{"ancestorTitles":["PaymentStatusPanel"],"fullName":"PaymentStatusPanel keeps the QR fallback hidden until the Alipay app launch times out","status":"passed","title":"keeps the QR fallback hidden until the Alipay app launch times out","duration":10.521799999999985,"failureMessages":[],"meta":{}},{"ancestorTitles":["PaymentStatusPanel"],"fullName":"PaymentStatusPanel does not show the QR fallback after the page enters the background","status":"passed","title":"does not show the QR fallback after the page enters the background","duration":5.892500000000041,"failureMessages":[],"meta":{}}],"startTime":1789442775636,"endTime":1789442775758.8926,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/components/payment/__tests__/PaymentStatusPanel.spec.ts"},{"assertionResults":[{"ancestorTitles":["PROVIDER_CONFIG_FIELDS.wxpay"],"fullName":"PROVIDER_CONFIG_FIELDS.wxpay keeps admin form validation aligned with backend-required credentials","status":"passed","title":"keeps admin form validation aligned with backend-required credentials","duration":0.601099999999974,"failureMessages":[],"meta":{}},{"ancestorTitles":["PROVIDER_CONFIG_FIELDS.wxpay"],"fullName":"PROVIDER_CONFIG_FIELDS.wxpay only keeps the simplified visible credential set in the admin form","status":"passed","title":"only keeps the simplified visible credential set in the admin form","duration":0.13610000000005584,"failureMessages":[],"meta":{}},{"ancestorTitles":["PROVIDER_CONFIG_FIELDS.airwallex"],"fullName":"PROVIDER_CONFIG_FIELDS.airwallex adds currency config with CNY as the default","status":"passed","title":"adds currency config with CNY as the default","duration":0.15670000000000073,"failureMessages":[],"meta":{}},{"ancestorTitles":["PROVIDER_CONFIG_FIELDS.airwallex"],"fullName":"PROVIDER_CONFIG_FIELDS.airwallex marks accountId as optional and explains when it can be left blank","status":"passed","title":"marks accountId as optional and explains when it can be left blank","duration":0.08910000000003038,"failureMessages":[],"meta":{}},{"ancestorTitles":["PROVIDER_CONFIG_FIELDS.airwallex"],"fullName":"PROVIDER_CONFIG_FIELDS.airwallex explains that apiBase must match the Airwallex key environment","status":"passed","title":"explains that apiBase must match the Airwallex key environment","duration":0.04930000000001655,"failureMessages":[],"meta":{}},{"ancestorTitles":["PROVIDER_CONFIG_FIELDS.stripe"],"fullName":"PROVIDER_CONFIG_FIELDS.stripe adds currency config with CNY as the default","status":"passed","title":"adds currency config with CNY as the default","duration":0.09789999999998145,"failureMessages":[],"meta":{}},{"ancestorTitles":["EasyPay custom methods config"],"fullName":"EasyPay custom methods config parses customMethods from the JSON string stored in provider config","status":"passed","title":"parses customMethods from the JSON string stored in provider config","duration":0.4271999999999707,"failureMessages":[],"meta":{}},{"ancestorTitles":["EasyPay custom methods config"],"fullName":"EasyPay custom methods config serializes non-empty custom methods into the config string format","status":"passed","title":"serializes non-empty custom methods into the config string format","duration":0.11009999999998854,"failureMessages":[],"meta":{}},{"ancestorTitles":["EasyPay custom methods config"],"fullName":"EasyPay custom methods config returns an empty string for invalid or empty custom methods","status":"passed","title":"returns an empty string for invalid or empty custom methods","duration":0.11649999999997362,"failureMessages":[],"meta":{}},{"ancestorTitles":["built-in payment method helpers"],"fullName":"built-in payment method helpers only treats exact built-in aliases as Alipay or WeChat Pay","status":"passed","title":"only treats exact built-in aliases as Alipay or WeChat Pay","duration":0.15049999999996544,"failureMessages":[],"meta":{}}],"startTime":1789442794582,"endTime":1789442794584.1504,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/components/payment/__tests__/providerConfig.spec.ts"},{"assertionResults":[{"ancestorTitles":["SubscriptionPlanCard"],"fullName":"SubscriptionPlanCard does not show Antigravity model scopes for OpenAI plans","status":"passed","title":"does not show Antigravity model scopes for OpenAI plans","duration":14.65479999999991,"failureMessages":[],"meta":{}},{"ancestorTitles":["SubscriptionPlanCard"],"fullName":"SubscriptionPlanCard shows model scopes for Antigravity plans","status":"passed","title":"shows model scopes for Antigravity plans","duration":2.8114000000000487,"failureMessages":[],"meta":{}},{"ancestorTitles":["SubscriptionPlanCard"],"fullName":"SubscriptionPlanCard renders plural admin-form validity units instead of mislabeled days (#4607)","status":"passed","title":"renders plural admin-form validity units instead of mislabeled days (#4607)","duration":6.955900000000042,"failureMessages":[],"meta":{}},{"ancestorTitles":["SubscriptionPlanCard"],"fullName":"SubscriptionPlanCard uses the configured currency symbol while preserving USD for legacy plans","status":"passed","title":"uses the configured currency symbol while preserving USD for legacy plans","duration":5.179000000000087,"failureMessages":[],"meta":{}},{"ancestorTitles":["SubscriptionPlanCard"],"fullName":"SubscriptionPlanCard keeps the full long Chinese plan title accessible in a bounded two-line area","status":"passed","title":"keeps the full long Chinese plan title accessible in a bounded two-line area","duration":7.326000000000022,"failureMessages":[],"meta":{}},{"ancestorTitles":["SubscriptionPlanCard"],"fullName":"SubscriptionPlanCard keeps the full long English plan title accessible in a bounded two-line area","status":"passed","title":"keeps the full long English plan title accessible in a bounded two-line area","duration":2.833900000000085,"failureMessages":[],"meta":{}},{"ancestorTitles":["SubscriptionPlanCard"],"fullName":"SubscriptionPlanCard keeps the full unbroken token plan title accessible in a bounded two-line area","status":"passed","title":"keeps the full unbroken token plan title accessible in a bounded two-line area","duration":1.8735000000000355,"failureMessages":[],"meta":{}},{"ancestorTitles":["SubscriptionPlanCard"],"fullName":"SubscriptionPlanCard keeps title, badge, price, description, and purchase action in separate bounded regions","status":"passed","title":"keeps title, badge, price, description, and purchase action in separate bounded regions","duration":2.889499999999998,"failureMessages":[],"meta":{}},{"ancestorTitles":["SubscriptionPlanCard"],"fullName":"SubscriptionPlanCard keeps short plan titles compact and aligned","status":"passed","title":"keeps short plan titles compact and aligned","duration":1.8614000000000033,"failureMessages":[],"meta":{}}],"startTime":1789442787025,"endTime":1789442787070.8613,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/components/payment/__tests__/SubscriptionPlanCard.spec.ts"},{"assertionResults":[{"ancestorTitles":["planValiditySuffix"],"fullName":"planValiditySuffix renders admin-form plural months correctly","status":"passed","title":"renders admin-form plural months correctly","duration":0.6825000000000045,"failureMessages":[],"meta":{}},{"ancestorTitles":["planValiditySuffix"],"fullName":"planValiditySuffix renders singular month the same way","status":"passed","title":"renders singular month the same way","duration":0.12460000000010041,"failureMessages":[],"meta":{}},{"ancestorTitles":["planValiditySuffix"],"fullName":"planValiditySuffix renders weeks as weeks instead of mislabeled days","status":"passed","title":"renders weeks as weeks instead of mislabeled days","duration":0.09969999999998436,"failureMessages":[],"meta":{}},{"ancestorTitles":["planValiditySuffix"],"fullName":"planValiditySuffix renders day-based and legacy units as days","status":"passed","title":"renders day-based and legacy units as days","duration":0.09249999999997272,"failureMessages":[],"meta":{}},{"ancestorTitles":["planValiditySuffix"],"fullName":"planValiditySuffix falls back to days for units billing does not honor","status":"passed","title":"falls back to days for units billing does not honor","duration":0.08600000000001273,"failureMessages":[],"meta":{}},{"ancestorTitles":["planValiditySuffix"],"fullName":"planValiditySuffix normalizes casing and whitespace","status":"passed","title":"normalizes casing and whitespace","duration":0.0765999999999849,"failureMessages":[],"meta":{}}],"startTime":1789442812331,"endTime":1789442812333.0767,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/components/payment/__tests__/validity.spec.ts"},{"assertionResults":[{"ancestorTitles":["channel-monitor-v2 design system structure"],"fullName":"channel-monitor-v2 design system structure user ChannelStatus V2 shell uses page-header, card, btn, tabs utilities","status":"passed","title":"user ChannelStatus V2 shell uses page-header, card, btn, tabs utilities","duration":1.3304000000000542,"failureMessages":[],"meta":{}},{"ancestorTitles":["channel-monitor-v2 design system structure"],"fullName":"channel-monitor-v2 design system structure RelayPulseMatrix uses card chrome, matrix scroll, and hover tooltips (no click modal)","status":"passed","title":"RelayPulseMatrix uses card chrome, matrix scroll, and hover tooltips (no click modal)","duration":0.38440000000002783,"failureMessages":[],"meta":{}},{"ancestorTitles":["channel-monitor-v2 design system structure"],"fullName":"channel-monitor-v2 design system structure MetricCell uses stat-card utility","status":"passed","title":"MetricCell uses stat-card utility","duration":0.24220000000002528,"failureMessages":[],"meta":{}},{"ancestorTitles":["channel-monitor-v2 design system structure"],"fullName":"channel-monitor-v2 design system structure MonitorTrendChart uses Ops chart shell tokens","status":"passed","title":"MonitorTrendChart uses Ops chart shell tokens","duration":0.19429999999999836,"failureMessages":[],"meta":{}},{"ancestorTitles":["channel-monitor-v2 design system structure"],"fullName":"channel-monitor-v2 design system structure FilterMultiSelect uses rounded-xl input chrome and dropdown utility","status":"passed","title":"FilterMultiSelect uses rounded-xl input chrome and dropdown utility","duration":0.1753999999999678,"failureMessages":[],"meta":{}},{"ancestorTitles":["channel-monitor-v2 design system structure"],"fullName":"channel-monitor-v2 design system structure MonitorSettingsPanel uses page-header, card, btn-primary, tabs","status":"passed","title":"MonitorSettingsPanel uses page-header, card, btn-primary, tabs","duration":0.2236000000000331,"failureMessages":[],"meta":{}},{"ancestorTitles":["channel-monitor-v2 design system structure"],"fullName":"channel-monitor-v2 design system structure admin ChannelMonitorView V2 tab chrome uses project tabs","status":"passed","title":"admin ChannelMonitorView V2 tab chrome uses project tabs","duration":0.18669999999997344,"failureMessages":[],"meta":{}}],"startTime":1789442792694,"endTime":1789442792697.1868,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/features/channel-monitor-v2/__tests__/designSystem.structure.spec.ts"},{"assertionResults":[{"ancestorTitles":["MetricCell"],"fullName":"MetricCell renders label/value/detail through shipped template with design-system classes","status":"passed","title":"renders label/value/detail through shipped template with design-system classes","duration":14.962300000000027,"failureMessages":[],"meta":{}},{"ancestorTitles":["MetricCell"],"fullName":"MetricCell does not paint missing first-token dash as critical red","status":"passed","title":"does not paint missing first-token dash as critical red","duration":1.8746999999999616,"failureMessages":[],"meta":{}},{"ancestorTitles":["MetricCell"],"fullName":"MetricCell maps warning and critical health states to distinct colors","status":"passed","title":"maps warning and critical health states to distinct colors","duration":2.036699999999996,"failureMessages":[],"meta":{}},{"ancestorTitles":["MetricCell"],"fullName":"MetricCell renders multi-part detail as non-truncated chips (AVG · P90 fully visible)","status":"passed","title":"renders multi-part detail as non-truncated chips (AVG · P90 fully visible)","duration":2.5336999999999534,"failureMessages":[],"meta":{}}],"startTime":1789442808552,"endTime":1789442808573.5337,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/features/channel-monitor-v2/__tests__/MetricCell.spec.ts"},{"assertionResults":[{"ancestorTitles":["monitorFormat accuracy"],"fullName":"monitorFormat accuracy converts backend TPM (per minute) to tokens/sec for display","status":"passed","title":"converts backend TPM (per minute) to tokens/sec for display","duration":10.509500000000003,"failureMessages":[],"meta":{}},{"ancestorTitles":["monitorFormat accuracy"],"fullName":"monitorFormat accuracy formats request/token counts with compact notation above threshold","status":"passed","title":"formats request/token counts with compact notation above threshold","duration":0.6169999999999618,"failureMessages":[],"meta":{}},{"ancestorTitles":["monitorFormat accuracy"],"fullName":"monitorFormat accuracy formats rates and percents from raw API fractions without hardcoding pretty values","status":"passed","title":"formats rates and percents from raw API fractions without hardcoding pretty values","duration":0.5837000000000216,"failureMessages":[],"meta":{}},{"ancestorTitles":["monitorFormat accuracy"],"fullName":"monitorFormat accuracy formats RPM/TPM throughput with K/M compact notation","status":"passed","title":"formats RPM/TPM throughput with K/M compact notation","duration":0.35969999999997526,"failureMessages":[],"meta":{}},{"ancestorTitles":["monitorFormat accuracy"],"fullName":"monitorFormat accuracy formats latency ms/s boundaries from API fields","status":"passed","title":"formats latency ms/s boundaries from API fields","duration":0.13799999999991996,"failureMessages":[],"meta":{}},{"ancestorTitles":["monitorFormat accuracy"],"fullName":"monitorFormat accuracy formats KPI secondary latency as AVG · P90 (P50 is primary)","status":"passed","title":"formats KPI secondary latency as AVG · P90 (P50 is primary)","duration":0.13839999999993324,"failureMessages":[],"meta":{}},{"ancestorTitles":["monitorFormat accuracy"],"fullName":"monitorFormat accuracy computes success rate from success_requests / request_count","status":"passed","title":"computes success rate from success_requests / request_count","duration":0.1996000000000322,"failureMessages":[],"meta":{}},{"ancestorTitles":["monitorFormat accuracy"],"fullName":"monitorFormat accuracy derives success rate from error_rate without absolute counts","status":"passed","title":"derives success rate from error_rate without absolute counts","duration":0.1532999999999447,"failureMessages":[],"meta":{}},{"ancestorTitles":["monitorFormat accuracy"],"fullName":"monitorFormat accuracy maps continuous scores to multi-stop bands","status":"passed","title":"maps continuous scores to multi-stop bands","duration":0.13650000000006912,"failureMessages":[],"meta":{}},{"ancestorTitles":["monitorFormat accuracy"],"fullName":"monitorFormat accuracy builds score-based health classes for matrix cells","status":"passed","title":"builds score-based health classes for matrix cells","duration":0.18250000000000455,"failureMessages":[],"meta":{}},{"ancestorTitles":["monitorFormat accuracy"],"fullName":"monitorFormat accuracy maps health states for status dots","status":"passed","title":"maps health states for status dots","duration":0.06709999999998217,"failureMessages":[],"meta":{}},{"ancestorTitles":["monitorFormat accuracy"],"fullName":"monitorFormat accuracy keeps missing first-token samples neutral instead of critical","status":"passed","title":"keeps missing first-token samples neutral instead of critical","duration":0.08379999999999654,"failureMessages":[],"meta":{}},{"ancestorTitles":["monitorFormat accuracy"],"fullName":"monitorFormat accuracy formats privacy-safe latency lines with avg/p50/p90","status":"passed","title":"formats privacy-safe latency lines with avg/p50/p90","duration":0.08159999999998035,"failureMessages":[],"meta":{}}],"startTime":1789442788323,"endTime":1789442788336.1826,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/features/channel-monitor-v2/__tests__/monitorFormat.spec.ts"},{"assertionResults":[{"ancestorTitles":["monitorZoom"],"fullName":"monitorZoom resets to full span","status":"passed","title":"resets to full span","duration":1.0514000000000578,"failureMessages":[],"meta":{}},{"ancestorTitles":["monitorZoom"],"fullName":"monitorZoom zooms in around cursor without always pinning to the end","status":"passed","title":"zooms in around cursor without always pinning to the end","duration":0.3993000000000393,"failureMessages":[],"meta":{}},{"ancestorTitles":["monitorZoom"],"fullName":"monitorZoom pans with shift+wheel","status":"passed","title":"pans with shift+wheel","duration":0.16550000000006548,"failureMessages":[],"meta":{}},{"ancestorTitles":["monitorZoom"],"fullName":"monitorZoom clamps span to MIN_ZOOM_SPAN and keeps window in range","status":"passed","title":"clamps span to MIN_ZOOM_SPAN and keeps window in range","duration":0.08499999999992269,"failureMessages":[],"meta":{}},{"ancestorTitles":["monitorZoom"],"fullName":"monitorZoom slices series by window, not always last N points","status":"passed","title":"slices series by window, not always last N points","duration":0.6131000000000313,"failureMessages":[],"meta":{}}],"startTime":1789442809772,"endTime":1789442809773.613,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/features/channel-monitor-v2/__tests__/monitorZoom.spec.ts"},{"assertionResults":[{"ancestorTitles":["RelayPulseMatrix"],"fullName":"RelayPulseMatrix shows privacy-safe hover tooltips and multi-band colors without click modal","status":"passed","title":"shows privacy-safe hover tooltips and multi-band colors without click modal","duration":38.710000000000036,"failureMessages":[],"meta":{}},{"ancestorTitles":["RelayPulseMatrix axis range"],"fullName":"RelayPulseMatrix axis range uses selected requested range for the X axis even with partial coverage","status":"passed","title":"uses selected requested range for the X axis even with partial coverage","duration":8.097899999999981,"failureMessages":[],"meta":{}}],"startTime":1789442784803,"endTime":1789442784849.098,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/features/channel-monitor-v2/__tests__/RelayPulseMatrix.spec.ts"},{"assertionResults":[{"ancestorTitles":["Prompt Audit API"],"fullName":"Prompt Audit API uses the independent admin route namespace","status":"passed","title":"uses the independent admin route namespace","duration":1.4633999999999787,"failureMessages":[],"meta":{}},{"ancestorTitles":["Prompt Audit API"],"fullName":"Prompt Audit API sends a temporary probe token only in the request and never invents response credentials","status":"passed","title":"sends a temporary probe token only in the request and never invents response credentials","duration":1.0170000000000528,"failureMessages":[],"meta":{}},{"ancestorTitles":["Prompt Audit API"],"fullName":"Prompt Audit API passes a server preview token through the confirmed filter-delete contract","status":"passed","title":"passes a server preview token through the confirmed filter-delete contract","duration":0.49450000000001637,"failureMessages":[],"meta":{}}],"startTime":1789442806087,"endTime":1789442806090.4944,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/features/prompt-audit/__tests__/api.spec.ts"},{"assertionResults":[{"ancestorTitles":["Prompt Audit components"],"fullName":"Prompt Audit components edits a saved endpoint with blank-secret keep, explicit clear, replacement, and probe actions","status":"passed","title":"edits a saved endpoint with blank-secret keep, explicit clear, replacement, and probe actions","duration":49.68249999999989,"failureMessages":[],"meta":{}},{"ancestorTitles":["Prompt Audit components"],"fullName":"Prompt Audit components surfaces an undecryptable saved credential and prompts for re-entry","status":"passed","title":"surfaces an undecryptable saved credential and prompts for re-entry","duration":8.727300000000014,"failureMessages":[],"meta":{}},{"ancestorTitles":["Prompt Audit components"],"fullName":"Prompt Audit components supports group search, stale configured groups, nine scanners, and bounded worker inputs","status":"passed","title":"supports group search, stale configured groups, nine scanners, and bounded worker inputs","duration":15.451000000000022,"failureMessages":[],"meta":{}},{"ancestorTitles":["Prompt Audit components"],"fullName":"Prompt Audit components keeps identity fields separate, supports selection, and opens filter deletion from the toolbar","status":"passed","title":"keeps identity fields separate, supports selection, and opens filter deletion from the toolbar","duration":38.65370000000007,"failureMessages":[],"meta":{}},{"ancestorTitles":["Prompt Audit components"],"fullName":"Prompt Audit components resolves delete range presets to an epoch start and a cutoff end","status":"passed","title":"resolves delete range presets to an epoch start and a cutoff end","duration":0.7229999999999563,"failureMessages":[],"meta":{}},{"ancestorTitles":["Prompt Audit components"],"fullName":"Prompt Audit components drives filter deletion through presets, custom validation, preview, and confirm","status":"passed","title":"drives filter deletion through presets, custom validation, preview, and confirm","duration":28.985799999999927,"failureMessages":[],"meta":{}},{"ancestorTitles":["Prompt Audit components"],"fullName":"Prompt Audit components explains that a zero-match preview leaves nothing to delete","status":"passed","title":"explains that a zero-match preview leaves nothing to delete","duration":9.70029999999997,"failureMessages":[],"meta":{}},{"ancestorTitles":["Prompt Audit components"],"fullName":"Prompt Audit components inherits an explicit list-filter range as the custom preset","status":"passed","title":"inherits an explicit list-filter range as the custom preset","duration":9.130699999999933,"failureMessages":[],"meta":{}},{"ancestorTitles":["Prompt Audit components"],"fullName":"Prompt Audit components shows the full unredacted prompt and structured guard return on the risks tab","status":"passed","title":"shows the full unredacted prompt and structured guard return on the risks tab","duration":16.508800000000065,"failureMessages":[],"meta":{}},{"ancestorTitles":["Prompt Audit components"],"fullName":"Prompt Audit components falls back to the redacted preview for events stored before full prompts were kept","status":"passed","title":"falls back to the redacted preview for events stored before full prompts were kept","duration":9.688799999999901,"failureMessages":[],"meta":{}}],"startTime":1789442765671,"endTime":1789442765858.6887,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/features/prompt-audit/__tests__/components.spec.ts"},{"assertionResults":[{"ancestorTitles":["Prompt Audit integration surface"],"fullName":"Prompt Audit integration surface registers an admin and risk-control guarded route","status":"passed","title":"registers an admin and risk-control guarded route","duration":0.9385999999999513,"failureMessages":[],"meta":{}},{"ancestorTitles":["Prompt Audit integration surface"],"fullName":"Prompt Audit integration surface keeps the legacy content moderation route and adds both pages under an expand-only security group","status":"passed","title":"keeps the legacy content moderation route and adds both pages under an expand-only security group","duration":0.3631000000000313,"failureMessages":[],"meta":{}},{"ancestorTitles":["Prompt Audit integration surface"],"fullName":"Prompt Audit integration surface keeps Prompt Audit locale trees symmetric and all operational controls named","status":"passed","title":"keeps Prompt Audit locale trees symmetric and all operational controls named","duration":0.7401999999999589,"failureMessages":[],"meta":{}}],"startTime":1789442811100,"endTime":1789442811101.7402,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/features/prompt-audit/__tests__/integrationSurface.spec.ts"},{"assertionResults":[{"ancestorTitles":["PromptAuditView"],"fullName":"PromptAuditView starts config, runtime, groups, and events loads independently","status":"passed","title":"starts config, runtime, groups, and events loads independently","duration":127.61779999999999,"failureMessages":[],"meta":{}},{"ancestorTitles":["PromptAuditView"],"fullName":"PromptAuditView separates configuration and audit events into page tabs","status":"passed","title":"separates configuration and audit events into page tabs","duration":58.5003999999999,"failureMessages":[],"meta":{}},{"ancestorTitles":["PromptAuditView"],"fullName":"PromptAuditView requires confirmation for blocking and disables it when audit is turned off","status":"passed","title":"requires confirmation for blocking and disables it when audit is turned off","duration":36.96399999999994,"failureMessages":[],"meta":{}},{"ancestorTitles":["PromptAuditView"],"fullName":"PromptAuditView clears plaintext token state after a successful save","status":"passed","title":"clears plaintext token state after a successful save","duration":41.291099999999915,"failureMessages":[],"meta":{}},{"ancestorTitles":["PromptAuditView"],"fullName":"PromptAuditView reports real probe progress/results and invalidates filter confirmation when filters change","status":"passed","title":"reports real probe progress/results and invalidates filter confirmation when filters change","duration":24.248599999999897,"failureMessages":[],"meta":{}},{"ancestorTitles":["PromptAuditView"],"fullName":"PromptAuditView uses native labeled switches and a responsive fixed save surface","status":"passed","title":"uses native labeled switches and a responsive fixed save surface","duration":18.047900000000027,"failureMessages":[],"meta":{}},{"ancestorTitles":["PromptAuditView"],"fullName":"PromptAuditView executes single, selected-batch, and preview-confirmed filter deletion flows","status":"passed","title":"executes single, selected-batch, and preview-confirmed filter deletion flows","duration":22.96419999999989,"failureMessages":[],"meta":{}},{"ancestorTitles":["PromptAuditView"],"fullName":"PromptAuditView mints the confirmation token on the fly for one-click filter deletion without a manual preview","status":"passed","title":"mints the confirmation token on the fly for one-click filter deletion without a manual preview","duration":19.0625,"failureMessages":[],"meta":{}}],"startTime":1789442768503,"endTime":1789442768852.0625,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/features/prompt-audit/__tests__/PromptAuditView.spec.ts"},{"assertionResults":[{"ancestorTitles":["Prompt Audit view model"],"fullName":"Prompt Audit view model normalizes legacy null collections from the public config","status":"passed","title":"normalizes legacy null collections from the public config","duration":1.2504000000000133,"failureMessages":[],"meta":{}},{"ancestorTitles":["Prompt Audit view model"],"fullName":"Prompt Audit view model models all nine official input scanners","status":"passed","title":"models all nine official input scanners","duration":0.8421999999999343,"failureMessages":[],"meta":{}},{"ancestorTitles":["Prompt Audit view model"],"fullName":"Prompt Audit view model keeps, replaces, or explicitly clears a saved token without copying plaintext from the server","status":"passed","title":"keeps, replaces, or explicitly clears a saved token without copying plaintext from the server","duration":0.491800000000012,"failureMessages":[],"meta":{}},{"ancestorTitles":["Prompt Audit view model"],"fullName":"Prompt Audit view model includes the optional narrow blocking scope in the update payload","status":"passed","title":"includes the optional narrow blocking scope in the update payload","duration":0.11189999999999145,"failureMessages":[],"meta":{}},{"ancestorTitles":["Prompt Audit view model"],"fullName":"Prompt Audit view model tracks dirty state from the full normalized save payload","status":"passed","title":"tracks dirty state from the full normalized save payload","duration":0.23119999999994434,"failureMessages":[],"meta":{}},{"ancestorTitles":["Prompt Audit view model"],"fullName":"Prompt Audit view model requires a valid explicit range and sends canonical ISO timestamps for filter deletion","status":"passed","title":"requires a valid explicit range and sends canonical ISO timestamps for filter deletion","duration":0.3373999999998887,"failureMessages":[],"meta":{}}],"startTime":1789442797219,"endTime":1789442797222.3374,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/features/prompt-audit/__tests__/viewModel.spec.ts"},{"assertionResults":[{"ancestorTitles":["admin AccountsView bulk edit scope"],"fullName":"admin AccountsView bulk edit scope opens bulk edit in filtered-results mode from the bulk actions dropdown","status":"passed","title":"opens bulk edit in filtered-results mode from the bulk actions dropdown","duration":115.10320000000002,"failureMessages":[],"meta":{}},{"ancestorTitles":["admin AccountsView bulk edit scope"],"fullName":"admin AccountsView bulk edit scope renders the created_at column by default","status":"passed","title":"renders the created_at column by default","duration":44.42340000000013,"failureMessages":[],"meta":{}},{"ancestorTitles":["admin AccountsView bulk edit scope"],"fullName":"admin AccountsView bulk edit scope passes the loaded global probe state to every upstream billing cell","status":"passed","title":"passes the loaded global probe state to every upstream billing cell","duration":22.72230000000036,"failureMessages":[],"meta":{}},{"ancestorTitles":["admin AccountsView bulk edit scope"],"fullName":"admin AccountsView bulk edit scope submits selected account IDs from every page for backend eligibility checks","status":"passed","title":"submits selected account IDs from every page for backend eligibility checks","duration":39.26750000000038,"failureMessages":[],"meta":{}},{"ancestorTitles":["admin AccountsView bulk edit scope"],"fullName":"admin AccountsView bulk edit scope updates the current page locally after a batch probe","status":"passed","title":"updates the current page locally after a batch probe","duration":33.17920000000004,"failureMessages":[],"meta":{}},{"ancestorTitles":["admin AccountsView bulk edit scope"],"fullName":"admin AccountsView bulk edit scope does not report a successful batch probe as failed when reconciliation is skipped","status":"passed","title":"does not report a successful batch probe as failed when reconciliation is skipped","duration":20.521899999999732,"failureMessages":[],"meta":{}},{"ancestorTitles":["admin AccountsView bulk edit scope"],"fullName":"admin AccountsView bulk edit scope updates the account row after a successful single-account probe","status":"passed","title":"updates the account row after a successful single-account probe","duration":33.996900000000096,"failureMessages":[],"meta":{}}],"startTime":1789442764904,"endTime":1789442765212.9968,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/views/admin/__tests__/AccountsView.bulkEdit.spec.ts"},{"assertionResults":[{"ancestorTitles":["admin AccountsView lite account list"],"fullName":"admin AccountsView lite account list keeps lite=1 on the initial list request","status":"passed","title":"keeps lite=1 on the initial list request","duration":88.05860000000007,"failureMessages":[],"meta":{}},{"ancestorTitles":["admin AccountsView lite account list"],"fullName":"admin AccountsView lite account list maps group_ids through the group catalog for the table cell","status":"passed","title":"maps group_ids through the group catalog for the table cell","duration":39.3454999999999,"failureMessages":[],"meta":{}},{"ancestorTitles":["admin AccountsView lite account list"],"fullName":"admin AccountsView lite account list keeps the action menu open during internal scrolling but closes it on table scrolling","status":"passed","title":"keeps the action menu open during internal scrolling but closes it on table scrolling","duration":49.609300000000076,"failureMessages":[],"meta":{}},{"ancestorTitles":["admin AccountsView lite account list"],"fullName":"admin AccountsView lite account list keeps lite=1 on automatic ETag refreshes","status":"passed","title":"keeps lite=1 on automatic ETag refreshes","duration":31.4065999999998,"failureMessages":[],"meta":{}},{"ancestorTitles":["admin AccountsView lite account list"],"fullName":"admin AccountsView lite account list loads the full account by id before opening edit, test, and stats actions","status":"passed","title":"loads the full account by id before opening edit, test, and stats actions","duration":34.4390999999996,"failureMessages":[],"meta":{}},{"ancestorTitles":["admin AccountsView lite account list"],"fullName":"admin AccountsView lite account list shows an error and keeps the modal closed when detail loading fails","status":"passed","title":"shows an error and keeps the modal closed when detail loading fails","duration":28.179000000000087,"failureMessages":[],"meta":{}}],"startTime":1789442777778,"endTime":1789442778049.179,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/views/admin/__tests__/AccountsView.lite.spec.ts"},{"assertionResults":[{"ancestorTitles":["admin AccountsView priority column preferences"],"fullName":"admin AccountsView priority column preferences shows priority as a sortable column for fresh preferences","status":"passed","title":"shows priority as a sortable column for fresh preferences","duration":49.01209999999992,"failureMessages":[],"meta":{}},{"ancestorTitles":["admin AccountsView priority column preferences"],"fullName":"admin AccountsView priority column preferences preserves an existing preference that explicitly hides priority","status":"passed","title":"preserves an existing preference that explicitly hides priority","duration":10.392299999999977,"failureMessages":[],"meta":{}},{"ancestorTitles":["admin AccountsView priority column preferences"],"fullName":"admin AccountsView priority column preferences keeps priority visible while migrating older saved preferences","status":"passed","title":"keeps priority visible while migrating older saved preferences","duration":10.101299999999924,"failureMessages":[],"meta":{}}],"startTime":1789442790959,"endTime":1789442791028.1013,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/views/admin/__tests__/AccountsView.priorityColumn.spec.ts"},{"assertionResults":[{"ancestorTitles":["admin AccountsView scheduler score column"],"fullName":"admin AccountsView scheduler score column falls back to the base score for ungrouped accounts instead of showing a dash","status":"passed","title":"falls back to the base score for ungrouped accounts instead of showing a dash","duration":54.91980000000012,"failureMessages":[],"meta":{}},{"ancestorTitles":["admin AccountsView scheduler score column"],"fullName":"admin AccountsView scheduler score column renders per-group scores for grouped accounts","status":"passed","title":"renders per-group scores for grouped accounts","duration":16.5788,"failureMessages":[],"meta":{}},{"ancestorTitles":["admin AccountsView scheduler score column"],"fullName":"admin AccountsView scheduler score column keeps scheduler score hidden for old saved column settings until the admin opts in again","status":"passed","title":"keeps scheduler score hidden for old saved column settings until the admin opts in again","duration":11.187599999999975,"failureMessages":[],"meta":{}},{"ancestorTitles":["admin AccountsView scheduler score column"],"fullName":"admin AccountsView scheduler score column requests scheduler scores when the migrated column settings explicitly show the column","status":"passed","title":"requests scheduler scores when the migrated column settings explicitly show the column","duration":10.805299999999988,"failureMessages":[],"meta":{}},{"ancestorTitles":["admin AccountsView scheduler score column"],"fullName":"admin AccountsView scheduler score column still shows a dash when no scheduler score is available","status":"passed","title":"still shows a dash when no scheduler score is available","duration":11.47810000000004,"failureMessages":[],"meta":{}}],"startTime":1789442782084,"endTime":1789442782189.478,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/views/admin/__tests__/AccountsView.schedulerScore.spec.ts"},{"assertionResults":[{"ancestorTitles":["admin AccountsView select all filtered results"],"fullName":"admin AccountsView select all filtered results 'keeps only failed accounts selected' after a batch token refresh and table reload","status":"passed","title":"'keeps only failed accounts selected' after a batch token refresh and table reload","duration":130.94759999999997,"failureMessages":[],"meta":{}},{"ancestorTitles":["admin AccountsView select all filtered results"],"fullName":"admin AccountsView select all filtered results 'clears the selection after every acco…' after a batch token refresh and table reload","status":"passed","title":"'clears the selection after every acco…' after a batch token refresh and table reload","duration":33.650899999999865,"failureMessages":[],"meta":{}},{"ancestorTitles":["admin AccountsView select all filtered results"],"fullName":"admin AccountsView select all filtered results 'keeps the original selection when fai…' after a batch token refresh and table reload","status":"passed","title":"'keeps the original selection when fai…' after a batch token refresh and table reload","duration":25.668699999999717,"failureMessages":[],"meta":{}},{"ancestorTitles":["admin AccountsView select all filtered results"],"fullName":"admin AccountsView select all filtered results selects all matching IDs in one commit and clears the selection when filters change","status":"passed","title":"selects all matching IDs in one commit and clears the selection when filters change","duration":20.655899999999747,"failureMessages":[],"meta":{}},{"ancestorTitles":["admin AccountsView select all filtered results"],"fullName":"admin AccountsView select all filtered results keeps the original page selection when loading all results fails","status":"passed","title":"keeps the original page selection when loading all results fails","duration":21.21820000000025,"failureMessages":[],"meta":{}}],"startTime":1789442777974,"endTime":1789442778206.2183,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/views/admin/__tests__/AccountsView.selectAllResults.spec.ts"},{"assertionResults":[{"ancestorTitles":["admin AccountsView — 外审 F2:spark 影子创建接线"],"fullName":"admin AccountsView — 外审 F2:spark 影子创建接线 AccountActionMenu 的 duplicate 事件一键复制账号并刷新列表","status":"passed","title":"AccountActionMenu 的 duplicate 事件一键复制账号并刷新列表","duration":99.92209999999977,"failureMessages":[],"meta":{}},{"ancestorTitles":["admin AccountsView — 外审 F2:spark 影子创建接线"],"fullName":"admin AccountsView — 外审 F2:spark 影子创建接线 同一账号复制请求未完成时忽略重复点击","status":"passed","title":"同一账号复制请求未完成时忽略重复点击","duration":24.03139999999985,"failureMessages":[],"meta":{}},{"ancestorTitles":["admin AccountsView — 外审 F2:spark 影子创建接线"],"fullName":"admin AccountsView — 外审 F2:spark 影子创建接线 复制失败时显示后端错误","status":"passed","title":"复制失败时显示后端错误","duration":18.683700000000044,"failureMessages":[],"meta":{}},{"ancestorTitles":["admin AccountsView — 外审 F2:spark 影子创建接线"],"fullName":"admin AccountsView — 外审 F2:spark 影子创建接线 AccountActionMenu 的 create-spark-shadow 事件触发 createSparkShadow API + 成功提示","status":"passed","title":"AccountActionMenu 的 create-spark-shadow 事件触发 createSparkShadow API + 成功提示","duration":23.090899999999692,"failureMessages":[],"meta":{}},{"ancestorTitles":["admin AccountsView — 外审 F2:spark 影子创建接线"],"fullName":"admin AccountsView — 外审 F2:spark 影子创建接线 用户取消确认时不调用 API","status":"passed","title":"用户取消确认时不调用 API","duration":25.86130000000003,"failureMessages":[],"meta":{}},{"ancestorTitles":["admin AccountsView — 账号行展示"],"fullName":"admin AccountsView — 账号行展示 影子行 email 单元格显示 parent_email,PlatformTypeBadge 接收 parent_plan_type/parent_privacy_mode","status":"passed","title":"影子行 email 单元格显示 parent_email,PlatformTypeBadge 接收 parent_plan_type/parent_privacy_mode","duration":24.07510000000002,"failureMessages":[],"meta":{}},{"ancestorTitles":["admin AccountsView — 账号行展示"],"fullName":"admin AccountsView — 账号行展示 仅将具有安全 base_url 的 API Key 账号名称链接到站点主页","status":"passed","title":"仅将具有安全 base_url 的 API Key 账号名称链接到站点主页","duration":51.21720000000005,"failureMessages":[],"meta":{}},{"ancestorTitles":["admin AccountsView — 账号行展示"],"fullName":"admin AccountsView — 账号行展示 prefers persisted Grok JWT tier over lagging billing/quota snapshots","status":"passed","title":"prefers persisted Grok JWT tier over lagging billing/quota snapshots","duration":33.22980000000007,"failureMessages":[],"meta":{}},{"ancestorTitles":["admin AccountsView — 账号行展示"],"fullName":"admin AccountsView — 账号行展示 skips malformed Grok plan fields and safely uses the next valid fallback","status":"passed","title":"skips malformed Grok plan fields and safely uses the next valid fallback","duration":20.039400000000114,"failureMessages":[],"meta":{}},{"ancestorTitles":["admin AccountsView — 账号行展示"],"fullName":"admin AccountsView — 账号行展示 replaces a Grok row when auto refresh returns a changed canonical usage snapshot","status":"passed","title":"replaces a Grok row when auto refresh returns a changed canonical usage snapshot","duration":46.1275999999998,"failureMessages":[],"meta":{}}],"startTime":1789442764904,"endTime":1789442765271.1277,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/views/admin/__tests__/AccountsView.sparkShadow.spec.ts"},{"assertionResults":[{"ancestorTitles":["admin AccountsView usage windows hint"],"fullName":"admin AccountsView usage windows hint keeps groups available when loading proxies fails","status":"passed","title":"keeps groups available when loading proxies fails","duration":46.73720000000003,"failureMessages":[],"meta":{}},{"ancestorTitles":["admin AccountsView usage windows hint"],"fullName":"admin AccountsView usage windows hint renders an explanatory tooltip next to the usage windows column header","status":"passed","title":"renders an explanatory tooltip next to the usage windows column header","duration":12.96770000000015,"failureMessages":[],"meta":{}},{"ancestorTitles":["admin AccountsView usage windows hint"],"fullName":"admin AccountsView usage windows hint keeps Ollama Cloud in the single usage column and ignores legacy column preferences","status":"passed","title":"keeps Ollama Cloud in the single usage column and ignores legacy column preferences","duration":12.532799999999952,"failureMessages":[],"meta":{}},{"ancestorTitles":["admin AccountsView usage windows hint"],"fullName":"admin AccountsView usage windows hint renders the upstream billing trust warning next to the declared-rate column","status":"passed","title":"renders the upstream billing trust warning next to the declared-rate column","duration":13.566600000000108,"failureMessages":[],"meta":{}},{"ancestorTitles":["admin AccountsView usage windows hint"],"fullName":"admin AccountsView usage windows hint shows account multipliers with enough precision to match declared rates","status":"passed","title":"shows account multipliers with enough precision to match declared rates","duration":12.962099999999964,"failureMessages":[],"meta":{}}],"startTime":1789442779918,"endTime":1789442780016.9622,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/views/admin/__tests__/AccountsView.usageWindowsHint.spec.ts"},{"assertionResults":[{"ancestorTitles":["buildApiKeyGroupFilterOptions"],"fullName":"buildApiKeyGroupFilterOptions partitions active groups into exclusive/public/subscription with headers","status":"passed","title":"partitions active groups into exclusive/public/subscription with headers","duration":0.9775999999999385,"failureMessages":[],"meta":{}},{"ancestorTitles":["buildApiKeyGroupFilterOptions"],"fullName":"buildApiKeyGroupFilterOptions treats subscription_type=subscription as subscription even if is_exclusive","status":"passed","title":"treats subscription_type=subscription as subscription even if is_exclusive","duration":0.2037000000000262,"failureMessages":[],"meta":{}},{"ancestorTitles":["buildApiKeyGroupFilterOptions"],"fullName":"buildApiKeyGroupFilterOptions skips empty section headers","status":"passed","title":"skips empty section headers","duration":0.14780000000007476,"failureMessages":[],"meta":{}},{"ancestorTitles":["buildApiKeyGroupFilterOptions"],"fullName":"buildApiKeyGroupFilterOptions places non-active groups in a separate disabled section (not omitted)","status":"passed","title":"places non-active groups in a separate disabled section (not omitted)","duration":0.2340000000000373,"failureMessages":[],"meta":{}},{"ancestorTitles":["buildApiKeyGroupFilterOptions"],"fullName":"buildApiKeyGroupFilterOptions section headers use distinct negative values (no duplicate Vue :key)","status":"passed","title":"section headers use distinct negative values (no duplicate Vue :key)","duration":0.189200000000028,"failureMessages":[],"meta":{}},{"ancestorTitles":["buildApiKeyGroupFilterOptions"],"fullName":"buildApiKeyGroupFilterOptions returns only the all-option when there are no groups","status":"passed","title":"returns only the all-option when there are no groups","duration":0.08859999999992851,"failureMessages":[],"meta":{}}],"startTime":1789442793973,"endTime":1789442793975.234,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/views/admin/__tests__/apiKeyGroupFilterOptions.spec.ts"},{"assertionResults":[{"ancestorTitles":["admin BackupView 分卷备份"],"fullName":"admin BackupView 分卷备份 显示分卷数并在下载时列出每个分卷链接","status":"passed","title":"显示分卷数并在下载时列出每个分卷链接","duration":42.59159999999997,"failureMessages":[],"meta":{}},{"ancestorTitles":["admin BackupView 分卷备份"],"fullName":"admin BackupView 分卷备份 旧单文件记录仍使用单个下载地址","status":"passed","title":"旧单文件记录仍使用单个下载地址","duration":8.01870000000008,"failureMessages":[],"meta":{}},{"ancestorTitles":["admin BackupView 分卷备份"],"fullName":"admin BackupView 分卷备份 运行中的备份不显示删除入口","status":"passed","title":"运行中的备份不显示删除入口","duration":7.802699999999959,"failureMessages":[],"meta":{}}],"startTime":1789442791355,"endTime":1789442791413.8027,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/views/admin/__tests__/BackupView.spec.ts"},{"assertionResults":[{"ancestorTitles":["ChannelMonitorView check-mode badge"],"fullName":"ChannelMonitorView check-mode badge renders the quota badge next to the provider badge","status":"passed","title":"renders the quota badge next to the provider badge","duration":28.337600000000066,"failureMessages":[],"meta":{}},{"ancestorTitles":["ChannelMonitorView check-mode badge"],"fullName":"ChannelMonitorView check-mode badge renders the quota_probe badge next to the provider badge","status":"passed","title":"renders the quota_probe badge next to the provider badge","duration":4.349399999999946,"failureMessages":[],"meta":{}},{"ancestorTitles":["ChannelMonitorView check-mode badge"],"fullName":"ChannelMonitorView check-mode badge renders the probe badge next to the provider badge","status":"passed","title":"renders the probe badge next to the provider badge","duration":5.799200000000042,"failureMessages":[],"meta":{}}],"startTime":1789442791433,"endTime":1789442791471.7993,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/views/admin/__tests__/ChannelMonitorView.checkModeBadge.spec.ts"},{"assertionResults":[{"ancestorTitles":["ChannelMonitorView duplicate action"],"fullName":"ChannelMonitorView duplicate action duplicates the selected monitor, reports success, and refreshes the list","status":"passed","title":"duplicates the selected monitor, reports success, and refreshes the list","duration":29.388099999999895,"failureMessages":[],"meta":{}},{"ancestorTitles":["ChannelMonitorView duplicate action"],"fullName":"ChannelMonitorView duplicate action keeps a successful duplicate successful when the follow-up refresh fails","status":"passed","title":"keeps a successful duplicate successful when the follow-up refresh fails","duration":9.092099999999846,"failureMessages":[],"meta":{}},{"ancestorTitles":["ChannelMonitorView duplicate action"],"fullName":"ChannelMonitorView duplicate action ignores repeated clicks while a duplicate request is in flight","status":"passed","title":"ignores repeated clicks while a duplicate request is in flight","duration":6.427200000000084,"failureMessages":[],"meta":{}},{"ancestorTitles":["ChannelMonitorView duplicate action"],"fullName":"ChannelMonitorView duplicate action shows the API error when duplication fails","status":"passed","title":"shows the API error when duplication fails","duration":4.139499999999998,"failureMessages":[],"meta":{}},{"ancestorTitles":["ChannelMonitorView duplicate action"],"fullName":"ChannelMonitorView duplicate action rejects a defensive duplicate event when the API key is unavailable","status":"passed","title":"rejects a defensive duplicate event when the API key is unavailable","duration":4.025200000000041,"failureMessages":[],"meta":{}}],"startTime":1789442783186,"endTime":1789442783239.0251,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/views/admin/__tests__/ChannelMonitorView.duplicate.spec.ts"},{"assertionResults":[{"ancestorTitles":["channel monitor Grok provider"],"fullName":"channel monitor Grok provider offers Grok in the responsive provider grid and prefills its official defaults","status":"passed","title":"offers Grok in the responsive provider grid and prefills its official defaults","duration":41.40160000000003,"failureMessages":[],"meta":{}},{"ancestorTitles":["channel monitor Grok provider"],"fullName":"channel monitor Grok provider prefills only empty Grok fields and preserves existing provider values","status":"passed","title":"prefills only empty Grok fields and preserves existing provider values","duration":10.880999999999972,"failureMessages":[],"meta":{}}],"startTime":1789442787872,"endTime":1789442787923.881,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/views/admin/__tests__/ChannelMonitorView.grok.spec.ts"},{"assertionResults":[{"ancestorTitles":["Composite channel platform options"],"fullName":"Composite channel platform options includes the CN concrete providers for pricing and model mapping","status":"passed","title":"includes the CN concrete providers for pricing and model mapping","duration":0.9451999999999998,"failureMessages":[],"meta":{}}],"startTime":1789442824948,"endTime":1789442824948.9453,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/views/admin/__tests__/channelPlatformOptions.spec.ts"},{"assertionResults":[{"ancestorTitles":["codex fingerprint signals 行编解码"],"fullName":"codex fingerprint signals 行编解码 解析: 变体数组 → / 合并字符串","status":"passed","title":"解析: 变体数组 → / 合并字符串","duration":0.8700999999999794,"failureMessages":[],"meta":{}},{"ancestorTitles":["codex fingerprint signals 行编解码"],"fullName":"codex fingerprint signals 行编解码 序列化: / 合并 → 变体数组, required 透传","status":"passed","title":"序列化: / 合并 → 变体数组, required 透传","duration":0.22429999999997108,"failureMessages":[],"meta":{}},{"ancestorTitles":["codex fingerprint signals 行编解码"],"fullName":"codex fingerprint signals 行编解码 空/非法 → 空数组 / [] 串","status":"passed","title":"空/非法 → 空数组 / [] 串","duration":0.19640000000003965,"failureMessages":[],"meta":{}}],"startTime":1789442818774,"endTime":1789442818775.2244,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/views/admin/__tests__/codexFingerprintSignals.spec.ts"},{"assertionResults":[{"ancestorTitles":["admin DashboardView"],"fullName":"admin DashboardView uses last 24 hours as default dashboard range","status":"passed","title":"uses last 24 hours as default dashboard range","duration":34.02579999999989,"failureMessages":[],"meta":{}}],"startTime":1789442797010,"endTime":1789442797044.026,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/views/admin/__tests__/DashboardView.spec.ts"},{"assertionResults":[{"ancestorTitles":["new feature settings in Chinese"],"fullName":"new feature settings in Chinese renders '账号健康' and its settings without translation fallbacks","status":"passed","title":"renders '账号健康' and its settings without translation fallbacks","duration":97.74620000000004,"failureMessages":[],"meta":{}},{"ancestorTitles":["new feature settings in Chinese"],"fullName":"new feature settings in Chinese renders '毛利中心' and its settings without translation fallbacks","status":"passed","title":"renders '毛利中心' and its settings without translation fallbacks","duration":39.738399999999956,"failureMessages":[],"meta":{}},{"ancestorTitles":["new feature settings in Chinese"],"fullName":"new feature settings in Chinese renders '烧钱防护' and its settings without translation fallbacks","status":"passed","title":"renders '烧钱防护' and its settings without translation fallbacks","duration":16.517599999999902,"failureMessages":[],"meta":{}},{"ancestorTitles":["new feature settings in Chinese"],"fullName":"new feature settings in Chinese renders '全站模型定价' and its settings without translation fallbacks","status":"passed","title":"renders '全站模型定价' and its settings without translation fallbacks","duration":10.86279999999988,"failureMessages":[],"meta":{}},{"ancestorTitles":["new feature settings in Chinese"],"fullName":"new feature settings in Chinese renders '工单支持' and its settings without translation fallbacks","status":"passed","title":"renders '工单支持' and its settings without translation fallbacks","duration":5.9215999999998985,"failureMessages":[],"meta":{}},{"ancestorTitles":["new feature settings in Chinese"],"fullName":"new feature settings in Chinese renders '分级路由' with Chinese labels","status":"passed","title":"renders '分级路由' with Chinese labels","duration":5.557999999999993,"failureMessages":[],"meta":{}},{"ancestorTitles":["new feature settings in Chinese"],"fullName":"new feature settings in Chinese renders '工单管理' with Chinese labels","status":"passed","title":"renders '工单管理' with Chinese labels","duration":4.87740000000008,"failureMessages":[],"meta":{}},{"ancestorTitles":["new feature settings in Chinese"],"fullName":"new feature settings in Chinese renders '账单' with Chinese labels","status":"passed","title":"renders '账单' with Chinese labels","duration":3.967399999999998,"failureMessages":[],"meta":{}},{"ancestorTitles":["new feature settings in Chinese"],"fullName":"new feature settings in Chinese translates pricing labels without changing the API billing-mode value","status":"passed","title":"translates pricing labels without changing the API billing-mode value","duration":15.874700000000075,"failureMessages":[],"meta":{}},{"ancestorTitles":["new feature settings in Chinese"],"fullName":"new feature settings in Chinese renders the security-policy word-list settings and category options in Chinese","status":"passed","title":"renders the security-policy word-list settings and category options in Chinese","duration":21.471100000000206,"failureMessages":[],"meta":{}}],"startTime":1789442779209,"endTime":1789442779431.4712,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/views/admin/__tests__/FeatureSettings.locale.spec.ts"},{"assertionResults":[{"ancestorTitles":["groupModelAllowlist"],"fullName":"groupModelAllowlist selects all default candidates for a new disabled config","status":"passed","title":"selects all default candidates for a new disabled config","duration":0.9990999999999985,"failureMessages":[],"meta":{}},{"ancestorTitles":["groupModelAllowlist"],"fullName":"groupModelAllowlist keeps saved selections and marks new candidates as unselected when editing","status":"passed","title":"keeps saved selections and marks new candidates as unselected when editing","duration":0.18279999999992924,"failureMessages":[],"meta":{}},{"ancestorTitles":["groupModelAllowlist"],"fullName":"groupModelAllowlist preserves explicitly unselected saved candidates when candidates refresh","status":"passed","title":"preserves explicitly unselected saved candidates when candidates refresh","duration":0.11339999999995598,"failureMessages":[],"meta":{}},{"ancestorTitles":["groupModelAllowlist"],"fullName":"groupModelAllowlist builds config with selected models in current display order","status":"passed","title":"builds config with selected models in current display order","duration":0.1671000000000049,"failureMessages":[],"meta":{}},{"ancestorTitles":["groupModelAllowlist"],"fullName":"groupModelAllowlist keeps selected models in payload even when disabled so reopening can restore choices","status":"passed","title":"keeps selected models in payload even when disabled so reopening can restore choices","duration":0.08289999999999509,"failureMessages":[],"meta":{}},{"ancestorTitles":["groupModelAllowlist"],"fullName":"groupModelAllowlist preserves saved models when candidates have not loaded yet","status":"passed","title":"preserves saved models when candidates have not loaded yet","duration":0.08969999999999345,"failureMessages":[],"meta":{}},{"ancestorTitles":["groupModelAllowlist"],"fullName":"groupModelAllowlist selects all candidate models from the toolbar action","status":"passed","title":"selects all candidate models from the toolbar action","duration":0.10599999999999454,"failureMessages":[],"meta":{}},{"ancestorTitles":["groupModelAllowlist"],"fullName":"groupModelAllowlist inverts selected models from the toolbar action","status":"passed","title":"inverts selected models from the toolbar action","duration":0.10429999999996653,"failureMessages":[],"meta":{}},{"ancestorTitles":["addCustomModelAllowlistItem"],"fullName":"addCustomModelAllowlistItem appends a trimmed entry as selected","status":"passed","title":"appends a trimmed entry as selected","duration":0.15480000000002292,"failureMessages":[],"meta":{}},{"ancestorTitles":["addCustomModelAllowlistItem"],"fullName":"addCustomModelAllowlistItem accepts trailing wildcard entries","status":"passed","title":"accepts trailing wildcard entries","duration":0.08990000000005693,"failureMessages":[],"meta":{}},{"ancestorTitles":["addCustomModelAllowlistItem"],"fullName":"addCustomModelAllowlistItem rejects blank input","status":"passed","title":"rejects blank input","duration":0.05740000000002965,"failureMessages":[],"meta":{}},{"ancestorTitles":["addCustomModelAllowlistItem"],"fullName":"addCustomModelAllowlistItem rejects wildcards that are not trailing","status":"passed","title":"rejects wildcards that are not trailing","duration":0.061599999999998545,"failureMessages":[],"meta":{}},{"ancestorTitles":["addCustomModelAllowlistItem"],"fullName":"addCustomModelAllowlistItem rejects duplicates case-insensitively","status":"passed","title":"rejects duplicates case-insensitively","duration":0.04610000000002401,"failureMessages":[],"meta":{}}],"startTime":1789442789377,"endTime":1789442789380.0898,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/views/admin/__tests__/groupModelAllowlist.spec.ts"},{"assertionResults":[{"ancestorTitles":["groups model allowlist layout"],"fullName":"groups model allowlist layout keeps the toolbar outside of the scrolling list content","status":"passed","title":"keeps the toolbar outside of the scrolling list content","duration":0.8742999999999483,"failureMessages":[],"meta":{}},{"ancestorTitles":["groups model allowlist layout"],"fullName":"groups model allowlist layout uses a wide dialog and keeps model pricing controls responsive","status":"passed","title":"uses a wide dialog and keeps model pricing controls responsive","duration":0.13819999999998345,"failureMessages":[],"meta":{}}],"startTime":1789442822517,"endTime":1789442822517.8743,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/views/admin/__tests__/groupModelAllowlistLayout.spec.ts"},{"assertionResults":[{"ancestorTitles":["groups image pricing platform support"],"fullName":"groups image pricing platform support includes Grok image groups","status":"passed","title":"includes Grok image groups","duration":0.6367000000000189,"failureMessages":[],"meta":{}},{"ancestorTitles":["groups image pricing platform support"],"fullName":"groups image pricing platform support enables video pricing controls for Grok only","status":"passed","title":"enables video pricing controls for Grok only","duration":0.13450000000000273,"failureMessages":[],"meta":{}},{"ancestorTitles":["groups image pricing platform support"],"fullName":"groups image pricing platform support keeps non-media group platforms out of the image pricing controls","status":"passed","title":"keeps non-media group platforms out of the image pricing controls","duration":0.07709999999997308,"failureMessages":[],"meta":{}},{"ancestorTitles":["groups image pricing platform support"],"fullName":"groups image pricing platform support includes Composite groups in image pricing controls","status":"passed","title":"includes Composite groups in image pricing controls","duration":0.07370000000003074,"failureMessages":[],"meta":{}},{"ancestorTitles":["groups image pricing platform support"],"fullName":"groups image pricing platform support keeps image and video pricing copy separate","status":"passed","title":"keeps image and video pricing copy separate","duration":0.08500000000003638,"failureMessages":[],"meta":{}},{"ancestorTitles":["groups image pricing platform support"],"fullName":"groups image pricing platform support uses Grok media defaults instead of generic image fallback placeholders","status":"passed","title":"uses Grok media defaults instead of generic image fallback placeholders","duration":0.14750000000003638,"failureMessages":[],"meta":{}},{"ancestorTitles":["groups image pricing platform support"],"fullName":"groups image pricing platform support keeps non-Grok image placeholders on the generic image card","status":"passed","title":"keeps non-Grok image placeholders on the generic image card","duration":0.12599999999997635,"failureMessages":[],"meta":{}}],"startTime":1789442807187,"endTime":1789442807188.1475,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/views/admin/__tests__/groupsImagePricing.spec.ts"},{"assertionResults":[{"ancestorTitles":["groupsMessagesDispatch"],"fullName":"groupsMessagesDispatch supports OpenAI and composite groups","status":"passed","title":"supports OpenAI and composite groups","duration":0.6368999999999687,"failureMessages":[],"meta":{}},{"ancestorTitles":["groupsMessagesDispatch"],"fullName":"groupsMessagesDispatch returns the expected default form state","status":"passed","title":"returns the expected default form state","duration":0.3805999999999585,"failureMessages":[],"meta":{}},{"ancestorTitles":["groupsMessagesDispatch"],"fullName":"groupsMessagesDispatch sanitizes exact model mapping rows when converting to config","status":"passed","title":"sanitizes exact model mapping rows when converting to config","duration":0.1675000000000182,"failureMessages":[],"meta":{}},{"ancestorTitles":["groupsMessagesDispatch"],"fullName":"groupsMessagesDispatch hydrates form state from api config","status":"passed","title":"hydrates form state from api config","duration":5.8134000000000015,"failureMessages":[],"meta":{}},{"ancestorTitles":["groupsMessagesDispatch"],"fullName":"groupsMessagesDispatch resets mutable form state when platform switches away from openai","status":"passed","title":"resets mutable form state when platform switches away from openai","duration":0.1311000000000604,"failureMessages":[],"meta":{}}],"startTime":1789442797865,"endTime":1789442797872.131,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/views/admin/__tests__/groupsMessagesDispatch.spec.ts"},{"assertionResults":[{"ancestorTitles":["groupsOpenAIFast"],"fullName":"groupsOpenAIFast supports OpenAI and composite groups","status":"passed","title":"supports OpenAI and composite groups","duration":0.6924000000000206,"failureMessages":[],"meta":{}},{"ancestorTitles":["groupsOpenAIFast"],"fullName":"groupsOpenAIFast clears stale enabled state on unsupported platforms","status":"passed","title":"clears stale enabled state on unsupported platforms","duration":0.19669999999996435,"failureMessages":[],"meta":{}},{"ancestorTitles":["groupsOpenAIFast"],"fullName":"groupsOpenAIFast provides localized switch labels","status":"passed","title":"provides localized switch labels","duration":0.7305000000000064,"failureMessages":[],"meta":{}}],"startTime":1789442816022,"endTime":1789442816023.7305,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/views/admin/__tests__/groupsOpenAIFast.spec.ts"},{"assertionResults":[{"ancestorTitles":["profitPercentToDecimal"],"fullName":"profitPercentToDecimal converts percent input to backend decimal","status":"passed","title":"converts percent input to backend decimal","duration":0.7253000000000611,"failureMessages":[],"meta":{}},{"ancestorTitles":["profitPercentToDecimal"],"fullName":"profitPercentToDecimal rounds to four decimal places matching decimal(10,4) storage","status":"passed","title":"rounds to four decimal places matching decimal(10,4) storage","duration":0.2906999999999016,"failureMessages":[],"meta":{}},{"ancestorTitles":["profitPercentToDecimal"],"fullName":"profitPercentToDecimal treats empty, invalid and non-positive input as zero","status":"passed","title":"treats empty, invalid and non-positive input as zero","duration":0.17200000000002547,"failureMessages":[],"meta":{}},{"ancestorTitles":["profitDecimalToPercent"],"fullName":"profitDecimalToPercent converts backend decimal to percent without float tail noise","status":"passed","title":"converts backend decimal to percent without float tail noise","duration":0.12180000000000746,"failureMessages":[],"meta":{}},{"ancestorTitles":["profitDecimalToPercent"],"fullName":"profitDecimalToPercent treats missing and non-positive values as zero","status":"passed","title":"treats missing and non-positive values as zero","duration":0.08159999999998035,"failureMessages":[],"meta":{}},{"ancestorTitles":["profitDecimalToPercent"],"fullName":"profitDecimalToPercent round-trips representative storage values","status":"passed","title":"round-trips representative storage values","duration":0.1533999999999196,"failureMessages":[],"meta":{}},{"ancestorTitles":["validateProfitControlFormState"],"fullName":"validateProfitControlFormState passes valid enabled configurations","status":"passed","title":"passes valid enabled configurations","duration":0.15960000000006858,"failureMessages":[],"meta":{}},{"ancestorTitles":["validateProfitControlFormState"],"fullName":"validateProfitControlFormState validates all five supported platforms and skips unsupported platforms","status":"passed","title":"validates all five supported platforms and skips unsupported platforms","duration":0.1490999999999758,"failureMessages":[],"meta":{}},{"ancestorTitles":["validateProfitControlFormState"],"fullName":"validateProfitControlFormState treats empty inputs as zero","status":"passed","title":"treats empty inputs as zero","duration":0.058400000000006,"failureMessages":[],"meta":{}},{"ancestorTitles":["validateProfitControlFormState"],"fullName":"validateProfitControlFormState rejects out-of-range margin and buffer","status":"passed","title":"rejects out-of-range margin and buffer","duration":0.09370000000001255,"failureMessages":[],"meta":{}},{"ancestorTitles":["validateProfitControlFormState"],"fullName":"validateProfitControlFormState rejects margin plus buffer reaching 100 percent","status":"passed","title":"rejects margin plus buffer reaching 100 percent","duration":0.045999999999935426,"failureMessages":[],"meta":{}},{"ancestorTitles":["validateProfitControlFormState"],"fullName":"validateProfitControlFormState rejects percents that round up to a decimal the backend rejects","status":"passed","title":"rejects percents that round up to a decimal the backend rejects","duration":0.06330000000002656,"failureMessages":[],"meta":{}},{"ancestorTitles":["validateProfitControlFormState"],"fullName":"validateProfitControlFormState still accepts the largest percent that survives the rounding","status":"passed","title":"still accepts the largest percent that survives the rounding","duration":0.055000000000063665,"failureMessages":[],"meta":{}}],"startTime":1789442787683,"endTime":1789442787685.1597,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/views/admin/__tests__/groupsProfitControl.spec.ts"},{"assertionResults":[{"ancestorTitles":["groupsReasoningEffort"],"fullName":"groupsReasoningEffort provides fixed OpenAI choices to OpenAI and Composite groups","status":"passed","title":"provides fixed OpenAI choices to OpenAI and Composite groups","duration":1.761600000000044,"failureMessages":[],"meta":{}},{"ancestorTitles":["groupsReasoningEffort"],"fullName":"groupsReasoningEffort hydrates supported rows and drops stale custom values","status":"passed","title":"hydrates supported rows and drops stale custom values","duration":0.806699999999978,"failureMessages":[],"meta":{}},{"ancestorTitles":["groupsReasoningEffort"],"fullName":"groupsReasoningEffort hydrates and validates none only as a mapping source","status":"passed","title":"hydrates and validates none only as a mapping source","duration":0.35740000000009786,"failureMessages":[],"meta":{}},{"ancestorTitles":["groupsReasoningEffort"],"fullName":"groupsReasoningEffort hydrates and validates deny only as a mapping target","status":"passed","title":"hydrates and validates deny only as a mapping target","duration":0.21010000000001128,"failureMessages":[],"meta":{}},{"ancestorTitles":["groupsReasoningEffort"],"fullName":"groupsReasoningEffort hydrates model scoped mappings","status":"passed","title":"hydrates model scoped mappings","duration":0.12920000000008258,"failureMessages":[],"meta":{}},{"ancestorTitles":["groupsReasoningEffort"],"fullName":"groupsReasoningEffort groups multiple request mappings under the same type and model","status":"passed","title":"groups multiple request mappings under the same type and model","duration":0.2300999999999931,"failureMessages":[],"meta":{}},{"ancestorTitles":["groupsReasoningEffort"],"fullName":"groupsReasoningEffort omits empty model scopes from the API payload","status":"passed","title":"omits empty model scopes from the API payload","duration":0.08899999999994179,"failureMessages":[],"meta":{}},{"ancestorTitles":["groupsReasoningEffort"],"fullName":"groupsReasoningEffort hydrates suffix mappings","status":"passed","title":"hydrates suffix mappings","duration":0.0847999999999729,"failureMessages":[],"meta":{}},{"ancestorTitles":["groupsReasoningEffort"],"fullName":"groupsReasoningEffort clears values unsupported by OpenAI or used on another platform","status":"passed","title":"clears values unsupported by OpenAI or used on another platform","duration":0.11800000000005184,"failureMessages":[],"meta":{}},{"ancestorTitles":["groupsReasoningEffort"],"fullName":"groupsReasoningEffort normalizes match type to exact, prefix, suffix, or empty","status":"passed","title":"normalizes match type to exact, prefix, suffix, or empty","duration":0.10839999999996053,"failureMessages":[],"meta":{}},{"ancestorTitles":["groupsReasoningEffort"],"fullName":"groupsReasoningEffort requires both sides of every mapping","status":"passed","title":"requires both sides of every mapping","duration":0.12069999999994252,"failureMessages":[],"meta":{}},{"ancestorTitles":["groupsReasoningEffort"],"fullName":"groupsReasoningEffort rejects duplicate source values case insensitively","status":"passed","title":"rejects duplicate source values case insensitively","duration":0.10800000000006094,"failureMessages":[],"meta":{}},{"ancestorTitles":["groupsReasoningEffort"],"fullName":"groupsReasoningEffort allows the same source across different model scopes","status":"passed","title":"allows the same source across different model scopes","duration":0.08709999999996398,"failureMessages":[],"meta":{}},{"ancestorTitles":["groupsReasoningEffort"],"fullName":"groupsReasoningEffort allows multiple request values in one model scope","status":"passed","title":"allows multiple request values in one model scope","duration":0.10729999999989559,"failureMessages":[],"meta":{}},{"ancestorTitles":["groupsReasoningEffort"],"fullName":"groupsReasoningEffort rejects duplicate source values within the same model scope","status":"passed","title":"rejects duplicate source values within the same model scope","duration":0.09510000000000218,"failureMessages":[],"meta":{}},{"ancestorTitles":["groupsReasoningEffort"],"fullName":"groupsReasoningEffort allows empty type and model as a global mapping","status":"passed","title":"allows empty type and model as a global mapping","duration":0.07730000000003656,"failureMessages":[],"meta":{}},{"ancestorTitles":["groupsReasoningEffort"],"fullName":"groupsReasoningEffort treats prefix without a model as a global mapping","status":"passed","title":"treats prefix without a model as a global mapping","duration":0.09500000000002728,"failureMessages":[],"meta":{}},{"ancestorTitles":["groupsReasoningEffort"],"fullName":"groupsReasoningEffort rejects custom mappings","status":"passed","title":"rejects custom mappings","duration":0.0665000000000191,"failureMessages":[],"meta":{}},{"ancestorTitles":["groupsReasoningEffort"],"fullName":"groupsReasoningEffort normalizes over-limit access control to downgrade or deny","status":"passed","title":"normalizes over-limit access control to downgrade or deny","duration":0.11790000000007694,"failureMessages":[],"meta":{}}],"startTime":1789442774124,"endTime":1789442774129.118,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/views/admin/__tests__/groupsReasoningEffort.spec.ts"},{"assertionResults":[{"ancestorTitles":["normalizeSupportedModelScopesForPlatform"],"fullName":"normalizeSupportedModelScopesForPlatform preserves model scopes for Antigravity groups","status":"passed","title":"preserves model scopes for Antigravity groups","duration":0.8471999999999298,"failureMessages":[],"meta":{}},{"ancestorTitles":["normalizeSupportedModelScopesForPlatform"],"fullName":"normalizeSupportedModelScopesForPlatform returns an empty array for Antigravity groups without scopes","status":"passed","title":"returns an empty array for Antigravity groups without scopes","duration":0.10609999999996944,"failureMessages":[],"meta":{}},{"ancestorTitles":["normalizeSupportedModelScopesForPlatform"],"fullName":"normalizeSupportedModelScopesForPlatform drops hidden model scopes for OpenAI groups","status":"passed","title":"drops hidden model scopes for OpenAI groups","duration":0.09119999999995798,"failureMessages":[],"meta":{}},{"ancestorTitles":["normalizeSupportedModelScopesForPlatform"],"fullName":"normalizeSupportedModelScopesForPlatform drops hidden model scopes for other non-Antigravity groups","status":"passed","title":"drops hidden model scopes for other non-Antigravity groups","duration":0.06570000000010623,"failureMessages":[],"meta":{}}],"startTime":1789442821362,"endTime":1789442821363.1062,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/views/admin/__tests__/groupsSupportedModelScopes.spec.ts"},{"assertionResults":[{"ancestorTitles":["Grok video model pricing form"],"fullName":"Grok video model pricing form provides editable rows for both canonical Grok video families","status":"passed","title":"provides editable rows for both canonical Grok video families","duration":1.0386999999999489,"failureMessages":[],"meta":{}},{"ancestorTitles":["Grok video model pricing form"],"fullName":"Grok video model pricing form serializes only finite non-negative prices and preserves future families","status":"passed","title":"serializes only finite non-negative prices and preserves future families","duration":0.25699999999994816,"failureMessages":[],"meta":{}},{"ancestorTitles":["Grok video model pricing form"],"fullName":"Grok video model pricing form round-trips unknown model families so editing does not discard them","status":"passed","title":"round-trips unknown model families so editing does not discard them","duration":0.8297000000000025,"failureMessages":[],"meta":{}}],"startTime":1789442815394,"endTime":1789442815395.8296,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/views/admin/__tests__/groupsVideoModelPricing.spec.ts"},{"assertionResults":[{"ancestorTitles":["GroupsView Codex manifest binding"],"fullName":"GroupsView Codex manifest binding preserves consecutive child updates on the reactive edit config","status":"passed","title":"preserves consecutive child updates on the reactive edit config","duration":98.87939999999992,"failureMessages":[],"meta":{}}],"startTime":1789442779102,"endTime":1789442779200.8794,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/views/admin/__tests__/GroupsView.codexManifest.spec.ts"},{"assertionResults":[{"ancestorTitles":["admin GroupsView column settings"],"fullName":"admin GroupsView column settings does not call advanced group APIs or expose the exclusive filter in simple mode","status":"passed","title":"does not call advanced group APIs or expose the exclusive filter in simple mode","duration":56.740099999999984,"failureMessages":[],"meta":{}},{"ancestorTitles":["admin GroupsView column settings"],"fullName":"admin GroupsView column settings hides the id column by default while keeping other group columns visible","status":"passed","title":"hides the id column by default while keeping other group columns visible","duration":10.885099999999966,"failureMessages":[],"meta":{}},{"ancestorTitles":["admin GroupsView column settings"],"fullName":"admin GroupsView column settings applies saved hidden columns on mount and ignores unknown keys","status":"passed","title":"applies saved hidden columns on mount and ignores unknown keys","duration":12.928899999999999,"failureMessages":[],"meta":{}},{"ancestorTitles":["admin GroupsView column settings"],"fullName":"admin GroupsView column settings auto-hides id for existing saved column prefs after version bump","status":"passed","title":"auto-hides id for existing saved column prefs after version bump","duration":8.390800000000013,"failureMessages":[],"meta":{}},{"ancestorTitles":["admin GroupsView column settings"],"fullName":"admin GroupsView column settings toggles a column and persists hidden column keys","status":"passed","title":"toggles a column and persists hidden column keys","duration":13.669399999999996,"failureMessages":[],"meta":{}},{"ancestorTitles":["admin GroupsView column settings"],"fullName":"admin GroupsView column settings can show the id column from column settings","status":"passed","title":"can show the id column from column settings","duration":8.720800000000054,"failureMessages":[],"meta":{}},{"ancestorTitles":["admin GroupsView column settings"],"fullName":"admin GroupsView column settings skips usage and capacity fetches until consuming columns are shown","status":"passed","title":"skips usage and capacity fetches until consuming columns are shown","duration":8.99720000000002,"failureMessages":[],"meta":{}},{"ancestorTitles":["admin GroupsView column settings"],"fullName":"admin GroupsView column settings renders yesterday usage between today and total","status":"passed","title":"renders yesterday usage between today and total","duration":5.677799999999934,"failureMessages":[],"meta":{}}],"startTime":1789442774192,"endTime":1789442774318.6777,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/views/admin/__tests__/GroupsView.columnSettings.spec.ts"},{"assertionResults":[{"ancestorTitles":["GroupsView Composite route options"],"fullName":"GroupsView Composite route options offers Kimi, Zhipu GLM, and DeepSeek as route targets","status":"passed","title":"offers Kimi, Zhipu GLM, and DeepSeek as route targets","duration":0.7818999999999505,"failureMessages":[],"meta":{}}],"startTime":1789442826111,"endTime":1789442826111.782,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/views/admin/__tests__/GroupsView.compositePlatforms.spec.ts"},{"assertionResults":[{"ancestorTitles":["GroupsView duplicate action"],"fullName":"GroupsView duplicate action duplicates the selected group, reports success, and refreshes the list","status":"passed","title":"duplicates the selected group, reports success, and refreshes the list","duration":56.83919999999989,"failureMessages":[],"meta":{}},{"ancestorTitles":["GroupsView duplicate action"],"fullName":"GroupsView duplicate action hides advanced group actions in simple mode","status":"passed","title":"hides advanced group actions in simple mode","duration":15.071900000000142,"failureMessages":[],"meta":{}},{"ancestorTitles":["GroupsView duplicate action"],"fullName":"GroupsView duplicate action ignores repeated clicks while the duplicate request is in flight","status":"passed","title":"ignores repeated clicks while the duplicate request is in flight","duration":9.643800000000056,"failureMessages":[],"meta":{}},{"ancestorTitles":["GroupsView duplicate action"],"fullName":"GroupsView duplicate action shows the API error and restores the action when duplication fails","status":"passed","title":"shows the API error and restores the action when duplication fails","duration":7.984100000000126,"failureMessages":[],"meta":{}},{"ancestorTitles":["GroupsView duplicate action"],"fullName":"GroupsView duplicate action does not report a successful duplicate as failed when the refresh fails","status":"passed","title":"does not report a successful duplicate as failed when the refresh fails","duration":9.874900000000025,"failureMessages":[],"meta":{}},{"ancestorTitles":["GroupsView duplicate action"],"fullName":"GroupsView duplicate action shows the standardized API message when updating a group fails","status":"passed","title":"shows the standardized API message when updating a group fails","duration":42.51599999999985,"failureMessages":[],"meta":{}},{"ancestorTitles":["GroupsView duplicate action"],"fullName":"GroupsView duplicate action updates manifest controls immediately and submits the displayed selection","status":"passed","title":"updates manifest controls immediately and submits the displayed selection","duration":60.722899999999754,"failureMessages":[],"meta":{}}],"startTime":1789442772800,"endTime":1789442773002.723,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/views/admin/__tests__/GroupsView.duplicate.spec.ts"},{"assertionResults":[{"ancestorTitles":["intelligent test polling"],"fullName":"intelligent test polling allows a quiet request slower than the poll interval to finish without aborting it","status":"passed","title":"allows a quiet request slower than the poll interval to finish without aborting it","duration":28.822900000000004,"failureMessages":[],"meta":{}},{"ancestorTitles":["intelligent test polling"],"fullName":"intelligent test polling keeps metadata errors until manual refresh successfully reloads settings","status":"passed","title":"keeps metadata errors until manual refresh successfully reloads settings","duration":13.131999999999948,"failureMessages":[],"meta":{}}],"startTime":1789442797849,"endTime":1789442797891.132,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/views/admin/__tests__/IntelligentTestsView.polling.spec.ts"},{"assertionResults":[{"ancestorTitles":["modelAllowlistCandidates"],"fullName":"modelAllowlistCandidates rejects stale candidate responses after a newer platform request starts","status":"passed","title":"rejects stale candidate responses after a newer platform request starts","duration":0.6803999999999633,"failureMessages":[],"meta":{}},{"ancestorTitles":["modelAllowlistCandidates"],"fullName":"modelAllowlistCandidates rejects responses for a previous edit group even with the same platform","status":"passed","title":"rejects responses for a previous edit group even with the same platform","duration":0.10839999999996053,"failureMessages":[],"meta":{}},{"ancestorTitles":["modelAllowlistCandidates"],"fullName":"modelAllowlistCandidates tracks create and edit requests independently","status":"passed","title":"tracks create and edit requests independently","duration":0.0905999999999949,"failureMessages":[],"meta":{}}],"startTime":1789442812506,"endTime":1789442812507.0906,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/views/admin/__tests__/modelAllowlistCandidates.spec.ts"},{"assertionResults":[{"ancestorTitles":["MonitorFormDialog linked account selector"],"fullName":"MonitorFormDialog linked account selector loads the first page of provider accounts when quota mode is enabled","status":"passed","title":"loads the first page of provider accounts when quota mode is enabled","duration":48.21889999999985,"failureMessages":[],"meta":{}},{"ancestorTitles":["MonitorFormDialog linked account selector"],"fullName":"MonitorFormDialog linked account selector debounced typing hits server-side search and aborts the previous request","status":"passed","title":"debounced typing hits server-side search and aborts the previous request","duration":55.03580000000011,"failureMessages":[],"meta":{}},{"ancestorTitles":["MonitorFormDialog linked account selector"],"fullName":"MonitorFormDialog linked account selector hydrates a bound account missing from the first page and keeps the binding","status":"passed","title":"hydrates a bound account missing from the first page and keeps the binding","duration":14.590599999999995,"failureMessages":[],"meta":{}},{"ancestorTitles":["MonitorFormDialog linked account selector"],"fullName":"MonitorFormDialog linked account selector clears the binding with a visible hint when the bound account cannot be loaded","status":"passed","title":"clears the binding with a visible hint when the bound account cannot be loaded","duration":12.926099999999906,"failureMessages":[],"meta":{}},{"ancestorTitles":["MonitorFormDialog linked account selector"],"fullName":"MonitorFormDialog linked account selector shows the OpenAI codex probe hint only in quota mode on openai","status":"passed","title":"shows the OpenAI codex probe hint only in quota mode on openai","duration":23.97129999999993,"failureMessages":[],"meta":{}},{"ancestorTitles":["MonitorFormDialog linked account selector"],"fullName":"MonitorFormDialog linked account selector keeps a picked account visible when a later search hides it","status":"passed","title":"keeps a picked account visible when a later search hides it","duration":38.061300000000074,"failureMessages":[],"meta":{}},{"ancestorTitles":["MonitorFormDialog linked account selector"],"fullName":"MonitorFormDialog linked account selector clears the account binding when the provider switches","status":"passed","title":"clears the account binding when the provider switches","duration":19.89670000000001,"failureMessages":[],"meta":{}},{"ancestorTitles":["MonitorFormDialog linked account selector"],"fullName":"MonitorFormDialog linked account selector restores probe mode and clears the quota placeholder when switching away from antigravity","status":"passed","title":"restores probe mode and clears the quota placeholder when switching away from antigravity","duration":14.683999999999969,"failureMessages":[],"meta":{}},{"ancestorTitles":["MonitorFormDialog linked account selector"],"fullName":"MonitorFormDialog linked account selector unbinds the linked account with account_id=0 when a quota monitor switches back to probe","status":"passed","title":"unbinds the linked account with account_id=0 when a quota monitor switches back to probe","duration":12.941700000000083,"failureMessages":[],"meta":{}},{"ancestorTitles":["MonitorFormDialog linked account selector"],"fullName":"MonitorFormDialog linked account selector keeps account_id null when creating a probe monitor","status":"passed","title":"keeps account_id null when creating a probe monitor","duration":10.633100000000013,"failureMessages":[],"meta":{}}],"startTime":1789442771906,"endTime":1789442772157.633,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/views/admin/__tests__/MonitorFormDialog.accountSelector.spec.ts"},{"assertionResults":[{"ancestorTitles":["admin platform filters"],"fullName":"admin platform filters uses the group platform catalog on the subscriptions page","status":"passed","title":"uses the group platform catalog on the subscriptions page","duration":0.8996000000000777,"failureMessages":[],"meta":{}},{"ancestorTitles":["admin platform filters"],"fullName":"admin platform filters uses the shared catalogs on the groups page","status":"passed","title":"uses the shared catalogs on the groups page","duration":0.7761000000000422,"failureMessages":[],"meta":{}},{"ancestorTitles":["admin platform filters"],"fullName":"admin platform filters uses the concrete platform catalog wherever concrete platforms are selected","status":"passed","title":"uses the concrete platform catalog wherever concrete platforms are selected","duration":0.6942999999999984,"failureMessages":[],"meta":{}}],"startTime":1789442816629,"endTime":1789442816630.7761,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/views/admin/__tests__/platformFilterCatalogUsage.spec.ts"},{"assertionResults":[{"ancestorTitles":["管理员插件页二次验证"],"fullName":"管理员插件页二次验证 启用插件通过 step-up 控制器执行","status":"passed","title":"启用插件通过 step-up 控制器执行","duration":30.064300000000003,"failureMessages":[],"meta":{}},{"ancestorTitles":["管理员插件页二次验证"],"fullName":"管理员插件页二次验证 上传插件通过 step-up 控制器执行","status":"passed","title":"上传插件通过 step-up 控制器执行","duration":9.079399999999964,"failureMessages":[],"meta":{}}],"startTime":1789442792040,"endTime":1789442792080.0793,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/views/admin/__tests__/PluginsView.spec.ts"},{"assertionResults":[{"ancestorTitles":["proxy quick-add parser"],"fullName":"proxy quick-add parser parses hostname:port:username:password and completes the selected protocol","status":"passed","title":"parses hostname:port:username:password and completes the selected protocol","duration":1.2335000000000491,"failureMessages":[],"meta":{}},{"ancestorTitles":["proxy quick-add parser"],"fullName":"proxy quick-add parser parses username:password@hostname:port and completes the selected protocol","status":"passed","title":"parses username:password@hostname:port and completes the selected protocol","duration":0.2719000000000733,"failureMessages":[],"meta":{}},{"ancestorTitles":["proxy quick-add parser"],"fullName":"proxy quick-add parser parses username:password:hostname:port and completes the selected protocol","status":"passed","title":"parses username:password:hostname:port and completes the selected protocol","duration":0.21460000000001855,"failureMessages":[],"meta":{}},{"ancestorTitles":["proxy quick-add parser"],"fullName":"proxy quick-add parser keeps an explicit protocol instead of applying the default","status":"passed","title":"keeps an explicit protocol instead of applying the default","duration":0.3749000000000251,"failureMessages":[],"meta":{}},{"ancestorTitles":["proxy quick-add parser"],"fullName":"proxy quick-add parser supports bare host:port and bracketed IPv6","status":"passed","title":"supports bare host:port and bracketed IPv6","duration":0.25490000000002055,"failureMessages":[],"meta":{}}],"startTime":1789442819386,"endTime":1789442819388.375,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/views/admin/__tests__/ProxiesView.ipv6.spec.ts"},{"assertionResults":[{"ancestorTitles":["admin RedeemView batch update"],"fullName":"admin RedeemView batch update submits only checked fields for selected redeem codes","status":"passed","title":"submits only checked fields for selected redeem codes","duration":77.27639999999997,"failureMessages":[],"meta":{}}],"startTime":1789442788692,"endTime":1789442788769.2764,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/views/admin/__tests__/RedeemView.batchUpdate.spec.ts"},{"assertionResults":[{"ancestorTitles":["admin RiskControlView"],"fullName":"admin RiskControlView saves the selected model filter mode and models","status":"passed","title":"saves the selected model filter mode and models","duration":78.3714,"failureMessages":[],"meta":{}},{"ancestorTitles":["admin RiskControlView"],"fullName":"admin RiskControlView submits edited risk control thresholds when saving moderation config","status":"passed","title":"submits edited risk control thresholds when saving moderation config","duration":21.982099999999946,"failureMessages":[],"meta":{}},{"ancestorTitles":["admin RiskControlView"],"fullName":"admin RiskControlView describes worker runtime as async audit and pre-block record processing","status":"passed","title":"describes worker runtime as async audit and pre-block record processing","duration":8.399200000000064,"failureMessages":[],"meta":{}},{"ancestorTitles":["admin RiskControlView"],"fullName":"admin RiskControlView shows pre-block synchronous moderation metrics separately from worker queue","status":"passed","title":"shows pre-block synchronous moderation metrics separately from worker queue","duration":11.668100000000095,"failureMessages":[],"meta":{}}],"startTime":1789442773347,"endTime":1789442773467.6682,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/views/admin/__tests__/RiskControlView.spec.ts"},{"assertionResults":[{"ancestorTitles":["admin SettingsView email domain quota copy"],"fullName":"admin SettingsView email domain quota copy documents the email domain quota and empty-whitelist behavior in both locales","status":"passed","title":"documents the email domain quota and empty-whitelist behavior in both locales","duration":0.7768000000000939,"failureMessages":[],"meta":{}},{"ancestorTitles":["admin SettingsView payment visible method controls"],"fullName":"admin SettingsView payment visible method controls submits the compact home page toggle","status":"passed","title":"submits the compact home page toggle","duration":135.75650000000041,"failureMessages":[],"meta":{}},{"ancestorTitles":["admin SettingsView payment visible method controls"],"fullName":"admin SettingsView payment visible method controls renders panel rate limit card and saves settings","status":"passed","title":"renders panel rate limit card and saves settings","duration":81.54739999999947,"failureMessages":[],"meta":{}},{"ancestorTitles":["admin SettingsView payment visible method controls"],"fullName":"admin SettingsView payment visible method controls does not render legacy visible payment method controls","status":"passed","title":"does not render legacy visible payment method controls","duration":44.03189999999995,"failureMessages":[],"meta":{}},{"ancestorTitles":["admin SettingsView payment visible method controls"],"fullName":"admin SettingsView payment visible method controls shows valid passkey RP configuration and persists the sign-in toggle","status":"passed","title":"shows valid passkey RP configuration and persists the sign-in toggle","duration":55.82180000000062,"failureMessages":[],"meta":{}},{"ancestorTitles":["admin SettingsView payment visible method controls"],"fullName":"admin SettingsView payment visible method controls 人机验证切换到腾讯天御并保存四项配置","status":"passed","title":"人机验证切换到腾讯天御并保存四项配置","duration":78.75300000000061,"failureMessages":[],"meta":{}},{"ancestorTitles":["admin SettingsView payment visible method controls"],"fullName":"admin SettingsView payment visible method controls 腾讯天御切换到国际站后保存站点并更新控制台入口","status":"passed","title":"腾讯天御切换到国际站后保存站点并更新控制台入口","duration":63.028699999999844,"failureMessages":[],"meta":{}},{"ancestorTitles":["admin SettingsView payment visible method controls"],"fullName":"admin SettingsView payment visible method controls 人机验证切换到阿里云并保存配置","status":"passed","title":"人机验证切换到阿里云并保存配置","duration":61.697400000000016,"failureMessages":[],"meta":{}},{"ancestorTitles":["admin SettingsView payment visible method controls"],"fullName":"admin SettingsView payment visible method controls 关闭人机验证总开关会同时关闭所有服务商","status":"passed","title":"关闭人机验证总开关会同时关闭所有服务商","duration":50.4979000000003,"failureMessages":[],"meta":{}},{"ancestorTitles":["admin SettingsView payment visible method controls"],"fullName":"admin SettingsView payment visible method controls disables passkey sign-in when the RP configuration is unavailable","status":"passed","title":"disables passkey sign-in when the RP configuration is unavailable","duration":39.52779999999984,"failureMessages":[],"meta":{}},{"ancestorTitles":["admin SettingsView payment visible method controls"],"fullName":"admin SettingsView payment visible method controls loads, edits, validates, and saves forwarded client-IP headers","status":"passed","title":"loads, edits, validates, and saves forwarded client-IP headers","duration":76.61540000000059,"failureMessages":[],"meta":{}},{"ancestorTitles":["admin SettingsView payment visible method controls"],"fullName":"admin SettingsView payment visible method controls links payment guidance to README sections instead of removed payment docs","status":"passed","title":"links payment guidance to README sections instead of removed payment docs","duration":45.367200000000594,"failureMessages":[],"meta":{}},{"ancestorTitles":["admin SettingsView payment visible method controls"],"fullName":"admin SettingsView payment visible method controls does not submit legacy visible payment method settings","status":"passed","title":"does not submit legacy visible payment method settings","duration":35.92420000000038,"failureMessages":[],"meta":{}},{"ancestorTitles":["admin SettingsView payment visible method controls"],"fullName":"admin SettingsView payment visible method controls submits the admin recharge affiliate rebate setting","status":"passed","title":"submits the admin recharge affiliate rebate setting","duration":78.32890000000043,"failureMessages":[],"meta":{}},{"ancestorTitles":["admin SettingsView payment visible method controls"],"fullName":"admin SettingsView payment visible method controls submits Anthropic cache TTL injection gateway setting","status":"passed","title":"submits Anthropic cache TTL injection gateway setting","duration":88.42109999999957,"failureMessages":[],"meta":{}},{"ancestorTitles":["admin SettingsView payment visible method controls"],"fullName":"admin SettingsView payment visible method controls submits message cache_control rewrite gateway setting","status":"passed","title":"submits message cache_control rewrite gateway setting","duration":110.48869999999988,"failureMessages":[],"meta":{}},{"ancestorTitles":["admin SettingsView payment visible method controls"],"fullName":"admin SettingsView payment visible method controls submits Claude OAuth system prompt injection gateway settings","status":"passed","title":"submits Claude OAuth system prompt injection gateway settings","duration":79.69380000000001,"failureMessages":[],"meta":{}},{"ancestorTitles":["admin SettingsView payment visible method controls"],"fullName":"admin SettingsView payment visible method controls submits Antigravity user agent version gateway setting","status":"passed","title":"submits Antigravity user agent version gateway setting","duration":94.13290000000052,"failureMessages":[],"meta":{}},{"ancestorTitles":["admin SettingsView payment visible method controls"],"fullName":"admin SettingsView payment visible method controls updates provider enablement immediately and reloads providers","status":"passed","title":"updates provider enablement immediately and reloads providers","duration":97.0068999999994,"failureMessages":[],"meta":{}},{"ancestorTitles":["admin SettingsView payment visible method controls"],"fullName":"admin SettingsView payment visible method controls renders advanced scheduler copy as local experimental gateway policy","status":"passed","title":"renders advanced scheduler copy as local experimental gateway policy","duration":68.46050000000014,"failureMessages":[],"meta":{}},{"ancestorTitles":["admin SettingsView payment visible method controls"],"fullName":"admin SettingsView payment visible method controls summarizes target and other-model actions, then switches to all models","status":"passed","title":"summarizes target and other-model actions, then switches to all models","duration":111.67579999999998,"failureMessages":[],"meta":{}},{"ancestorTitles":["admin SettingsView payment visible method controls"],"fullName":"admin SettingsView payment visible method controls loads and saves upstream billing probe settings from the gateway tab","status":"passed","title":"loads and saves upstream billing probe settings from the gateway tab","duration":139.23999999999978,"failureMessages":[],"meta":{}},{"ancestorTitles":["admin SettingsView payment visible method controls"],"fullName":"admin SettingsView payment visible method controls loads and saves configurable Grok cross-client model mapping","status":"passed","title":"loads and saves configurable Grok cross-client model mapping","duration":120.45470000000023,"failureMessages":[],"meta":{}},{"ancestorTitles":["admin SettingsView payment visible method controls"],"fullName":"admin SettingsView payment visible method controls loads and saves the OpenAI Responses first-token metric mode","status":"passed","title":"loads and saves the OpenAI Responses first-token metric mode","duration":108.13450000000012,"failureMessages":[],"meta":{}},{"ancestorTitles":["admin SettingsView payment visible method controls"],"fullName":"admin SettingsView payment visible method controls loads fail-safe-off Ollama Cloud usage refresh settings and saves an explicit opt-in","status":"passed","title":"loads fail-safe-off Ollama Cloud usage refresh settings and saves an explicit opt-in","duration":117.85449999999946,"failureMessages":[],"meta":{}},{"ancestorTitles":["admin SettingsView payment visible method controls"],"fullName":"admin SettingsView payment visible method controls places and explains rate controls for both scheduling modes","status":"passed","title":"places and explains rate controls for both scheduling modes","duration":106.62159999999949,"failureMessages":[],"meta":{}},{"ancestorTitles":["admin SettingsView payment visible method controls"],"fullName":"admin SettingsView payment visible method controls passes translated upload and remove labels to the payment help image uploader","status":"passed","title":"passes translated upload and remove labels to the payment help image uploader","duration":48.02340000000004,"failureMessages":[],"meta":{}},{"ancestorTitles":["admin SettingsView payment visible method controls"],"fullName":"admin SettingsView payment visible method controls normalizes null supported_types from API so provider card stays visible","status":"passed","title":"normalizes null supported_types from API so provider card stays visible","duration":35.502700000000004,"failureMessages":[],"meta":{}},{"ancestorTitles":["admin SettingsView wechat connect controls"],"fullName":"admin SettingsView wechat connect controls loads and echoes WeChat Connect fields from the backend payload","status":"passed","title":"loads and echoes WeChat Connect fields from the backend payload","duration":36.56850000000031,"failureMessages":[],"meta":{}},{"ancestorTitles":["admin SettingsView wechat connect controls"],"fullName":"admin SettingsView wechat connect controls links GitHub OAuth Apps guide to GitHub developer settings","status":"passed","title":"links GitHub OAuth Apps guide to GitHub developer settings","duration":44.415100000000166,"failureMessages":[],"meta":{}},{"ancestorTitles":["admin SettingsView wechat connect controls"],"fullName":"admin SettingsView wechat connect controls saves WeChat Connect fields using the backend contract and clears the secret after save","status":"passed","title":"saves WeChat Connect fields using the backend contract and clears the secret after save","duration":66.96579999999994,"failureMessages":[],"meta":{}},{"ancestorTitles":["admin SettingsView wechat connect controls"],"fullName":"admin SettingsView wechat connect controls collapses auth source defaults until the source is enabled","status":"passed","title":"collapses auth source defaults until the source is enabled","duration":56.404999999999745,"failureMessages":[],"meta":{}},{"ancestorTitles":["admin SettingsView wechat connect controls"],"fullName":"admin SettingsView wechat connect controls preserves optional OIDC compatibility flags instead of forcing them on save","status":"passed","title":"preserves optional OIDC compatibility flags instead of forcing them on save","duration":68.29370000000017,"failureMessages":[],"meta":{}},{"ancestorTitles":["admin SettingsView platform quota matrix"],"fullName":"admin SettingsView platform quota matrix 从 baseSettings 加载默认平台配额数据并在 Users tab 渲染 5 平台行","status":"passed","title":"从 baseSettings 加载默认平台配额数据并在 Users tab 渲染 5 平台行","duration":60.3713000000007,"failureMessages":[],"meta":{}},{"ancestorTitles":["admin SettingsView platform quota matrix"],"fullName":"admin SettingsView platform quota matrix 保存时 updateSettings payload 应包含嵌套 default_platform_quotas 对象(含全 5 平台)","status":"passed","title":"保存时 updateSettings payload 应包含嵌套 default_platform_quotas 对象(含全 5 平台)","duration":44.224200000000565,"failureMessages":[],"meta":{}},{"ancestorTitles":["admin SettingsView platform quota matrix"],"fullName":"admin SettingsView platform quota matrix 加载后 form.default_platform_quotas 含全 5 平台,从嵌套 JSON 正确读取数值","status":"passed","title":"加载后 form.default_platform_quotas 含全 5 平台,从嵌套 JSON 正确读取数值","duration":44.82970000000023,"failureMessages":[],"meta":{}},{"ancestorTitles":["admin SettingsView platform quota matrix"],"fullName":"admin SettingsView platform quota matrix 空输入(v-model.number 产出 \"\")在提交时清洗为 null 而非空字符串","status":"passed","title":"空输入(v-model.number 产出 \"\")在提交时清洗为 null 而非空字符串","duration":48.826500000000124,"failureMessages":[],"meta":{}}],"startTime":1789442757367,"endTime":1789442760011.8264,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/views/admin/__tests__/SettingsView.spec.ts"},{"assertionResults":[{"ancestorTitles":["admin subscription user usage link"],"fullName":"admin subscription user usage link renders the user email as a link to that user filtered usage records","status":"passed","title":"renders the user email as a link to that user filtered usage records","duration":23.60080000000005,"failureMessages":[],"meta":{}},{"ancestorTitles":["admin subscription user usage link"],"fullName":"admin subscription user usage link uses the user ID label for the usage link when username mode has no username","status":"passed","title":"uses the user ID label for the usage link when username mode has no username","duration":3.955500000000029,"failureMessages":[],"meta":{}}],"startTime":1789442795031,"endTime":1789442795058.9556,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/views/admin/__tests__/SubscriptionsView.userUsageLink.spec.ts"},{"assertionResults":[{"ancestorTitles":["admin UsageView route filters"],"fullName":"admin UsageView route filters shows the routed user while applying user_id to usage requests","status":"passed","title":"shows the routed user while applying user_id to usage requests","duration":56.542399999999816,"failureMessages":[],"meta":{}},{"ancestorTitles":["admin UsageView route filters"],"fullName":"admin UsageView route filters does not apply a stale routed user label after user_id changes","status":"passed","title":"does not apply a stale routed user label after user_id changes","duration":20.488000000000284,"failureMessages":[],"meta":{}},{"ancestorTitles":["admin UsageView route filters"],"fullName":"admin UsageView route filters does not overwrite newer user input when the routed user lookup succeeds","status":"passed","title":"does not overwrite newer user input when the routed user lookup succeeds","duration":21.364599999999882,"failureMessages":[],"meta":{}},{"ancestorTitles":["admin UsageView route filters"],"fullName":"admin UsageView route filters does not overwrite newer user input when the routed user lookup fails","status":"passed","title":"does not overwrite newer user input when the routed user lookup fails","duration":13.970700000000306,"failureMessages":[],"meta":{}},{"ancestorTitles":["admin UsageView route filters"],"fullName":"admin UsageView route filters shows the routed user ID when its label lookup fails","status":"passed","title":"shows the routed user ID when its label lookup fails","duration":18.0621000000001,"failureMessages":[],"meta":{}},{"ancestorTitles":["admin UsageView native compaction filter"],"fullName":"admin UsageView native compaction filter propagates the filter to list/stats/model/snapshot requests and clears it on reset","status":"passed","title":"propagates the filter to list/stats/model/snapshot requests and clears it on reset","duration":23.99449999999979,"failureMessages":[],"meta":{}},{"ancestorTitles":["admin UsageView distribution metric toggles"],"fullName":"admin UsageView distribution metric toggles keeps previous model stats visible during refresh until new data arrives","status":"passed","title":"keeps previous model stats visible during refresh until new data arrives","duration":32.377300000000105,"failureMessages":[],"meta":{}},{"ancestorTitles":["admin UsageView distribution metric toggles"],"fullName":"admin UsageView distribution metric toggles keeps model and group metric toggles independent without refetching chart data","status":"passed","title":"keeps model and group metric toggles independent without refetching chart data","duration":31.734699999999975,"failureMessages":[],"meta":{}},{"ancestorTitles":["admin UsageView request ID column visibility"],"fullName":"admin UsageView request ID column visibility keeps request ID hidden by default and allows enabling it from column settings","status":"passed","title":"keeps request ID hidden by default and allows enabling it from column settings","duration":27.047799999999825,"failureMessages":[],"meta":{}},{"ancestorTitles":["admin UsageView request ID column visibility"],"fullName":"admin UsageView request ID column visibility keeps upstream ID hidden by default and allows enabling it from column settings","status":"passed","title":"keeps upstream ID hidden by default and allows enabling it from column settings","duration":26.66930000000002,"failureMessages":[],"meta":{}},{"ancestorTitles":["admin UsageView handleUserClick"],"fullName":"admin UsageView handleUserClick opens user via include_deleted when clicking a usage row user","status":"passed","title":"opens user via include_deleted when clicking a usage row user","duration":19.250500000000102,"failureMessages":[],"meta":{}},{"ancestorTitles":["admin UsageView errors tab filter forwarding"],"fullName":"admin UsageView errors tab filter forwarding forwards model/account_id/group_id to listErrorLogs on the errors tab","status":"passed","title":"forwards model/account_id/group_id to listErrorLogs on the errors tab","duration":10.021600000000035,"failureMessages":[],"meta":{}},{"ancestorTitles":["admin UsageView ranking tab"],"fullName":"admin UsageView ranking tab mounts ranking lazily and drill-down sets user filter then jumps back to usage tab","status":"passed","title":"mounts ranking lazily and drill-down sets user filter then jumps back to usage tab","duration":20.06959999999981,"failureMessages":[],"meta":{}},{"ancestorTitles":["admin UsageView model audit export"],"fullName":"admin UsageView model audit export exports requested, sent, response, and mismatch as separate admin columns","status":"passed","title":"exports requested, sent, response, and mismatch as separate admin columns","duration":18.821599999999762,"failureMessages":[],"meta":{}}],"startTime":1789442760236,"endTime":1789442760577.8215,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/views/admin/__tests__/UsageView.spec.ts"},{"assertionResults":[{"ancestorTitles":["admin UsersView"],"fullName":"admin UsersView shows active, used, and created activity columns in order and requests last_used_at sort","status":"passed","title":"shows active, used, and created activity columns in order and requests last_used_at sort","duration":92.29869999999983,"failureMessages":[],"meta":{}},{"ancestorTitles":["admin UsersView"],"fullName":"admin UsersView clears usage current-page sort when switching to last_used_at server sort","status":"passed","title":"clears usage current-page sort when switching to last_used_at server sort","duration":33.15769999999998,"failureMessages":[],"meta":{}},{"ancestorTitles":["admin UsersView"],"fullName":"admin UsersView keeps selected user IDs across pages and clears them after a successful bulk update","status":"passed","title":"keeps selected user IDs across pages and clears them after a successful bulk update","duration":24.98660000000018,"failureMessages":[],"meta":{}},{"ancestorTitles":["admin UsersView"],"fullName":"admin UsersView hides elevated-user actions and rejects those selections for an ordinary administrator","status":"passed","title":"hides elevated-user actions and rejects those selections for an ordinary administrator","duration":22.191100000000006,"failureMessages":[],"meta":{}}],"startTime":1789442771996,"endTime":1789442772168.1912,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/views/admin/__tests__/UsersView.spec.ts"},{"assertionResults":[{"ancestorTitles":["AffiliateView"],"fullName":"AffiliateView stacks long values and copy controls on mobile while retaining desktop rows","status":"passed","title":"stacks long values and copy controls on mobile while retaining desktop rows","duration":35.20320000000004,"failureMessages":[],"meta":{}}],"startTime":1789442800676,"endTime":1789442800711.2031,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/views/user/__tests__/AffiliateView.spec.ts"},{"assertionResults":[{"ancestorTitles":["AirwallexPaymentView"],"fullName":"AirwallexPaymentView 从本地恢复快照读取支付参数,避免在 URL 中暴露 client_secret","status":"passed","title":"从本地恢复快照读取支付参数,避免在 URL 中暴露 client_secret","duration":16.95399999999995,"failureMessages":[],"meta":{}},{"ancestorTitles":["AirwallexPaymentView"],"fullName":"AirwallexPaymentView 拒绝只从 URL query 读取 Airwallex 支付密钥","status":"passed","title":"拒绝只从 URL query 读取 Airwallex 支付密钥","duration":3.239599999999996,"failureMessages":[],"meta":{}}],"startTime":1789442795859,"endTime":1789442795879.2395,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/views/user/__tests__/AirwallexPaymentView.spec.ts"},{"assertionResults":[{"ancestorTitles":["ChannelStatusView mode switch"],"fullName":"ChannelStatusView mode switch renders V2 when not in v1 mode","status":"passed","title":"renders V2 when not in v1 mode","duration":10.526399999999967,"failureMessages":[],"meta":{}},{"ancestorTitles":["ChannelStatusView mode switch"],"fullName":"ChannelStatusView mode switch renders V1 when in v1 mode","status":"passed","title":"renders V1 when in v1 mode","duration":1.0670000000000073,"failureMessages":[],"meta":{}}],"startTime":1789442818185,"endTime":1789442818197.067,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/views/user/__tests__/ChannelStatusView.mode.spec.ts"},{"assertionResults":[{"ancestorTitles":["custom page open button"],"fullName":"custom page open button preserves the embedded URL, secure link attributes, and normal clicks with small pointer movements","status":"passed","title":"preserves the embedded URL, secure link attributes, and normal clicks with small pointer movements","duration":26.240499999999997,"failureMessages":[],"meta":{}},{"ancestorTitles":["custom page open button"],"fullName":"custom page open button captures the pointer across iframe content and suppresses only the click following a drag","status":"passed","title":"captures the pointer across iframe content and suppresses only the click following a drag","duration":7.574299999999994,"failureMessages":[],"meta":{}},{"ancestorTitles":["custom page open button"],"fullName":"custom page open button keeps the button inside each boundary and reachable when the container shrinks","status":"passed","title":"keeps the button inside each boundary and reachable when the container shrinks","duration":3.9728000000000065,"failureMessages":[],"meta":{}},{"ancestorTitles":["custom page open button"],"fullName":"custom page open button stops moving on cancellation or lost pointer capture and permits the next normal click","status":"passed","title":"stops moving on cancellation or lost pointer capture and permits the next normal click","duration":3.715000000000032,"failureMessages":[],"meta":{}},{"ancestorTitles":["custom page open button"],"fullName":"custom page open button leaves secondary mouse button gestures alone","status":"passed","title":"leaves secondary mouse button gestures alone","duration":3.0557999999999765,"failureMessages":[],"meta":{}},{"ancestorTitles":["custom page open button"],"fullName":"custom page open button keeps Markdown pages separate from the embedded-page controls","status":"passed","title":"keeps Markdown pages separate from the embedded-page controls","duration":14.013000000000034,"failureMessages":[],"meta":{}}],"startTime":1789442781996,"endTime":1789442782055.013,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/views/user/__tests__/CustomPageView.spec.ts"},{"assertionResults":[{"ancestorTitles":["relay dashboard loading and recovery"],"fullName":"relay dashboard loading and recovery renders server stats and first-key onboarding without synthetic counts","status":"passed","title":"renders server stats and first-key onboarding without synthetic counts","duration":37.79789999999991,"failureMessages":[],"meta":{}},{"ancestorTitles":["relay dashboard loading and recovery"],"fullName":"relay dashboard loading and recovery keeps quick start reachable and recovers when stats fail then retry succeeds","status":"passed","title":"keeps quick start reachable and recovers when stats fail then retry succeeds","duration":11.283599999999979,"failureMessages":[],"meta":{}},{"ancestorTitles":["relay dashboard loading and recovery"],"fullName":"relay dashboard loading and recovery does not discard successful statistics when an independent balance request fails","status":"passed","title":"does not discard successful statistics when an independent balance request fails","duration":4.474299999999971,"failureMessages":[],"meta":{}}],"startTime":1789442795488,"endTime":1789442795541.4744,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/views/user/__tests__/DashboardView.relay.spec.ts"},{"assertionResults":[{"ancestorTitles":["user KeysView column settings"],"fullName":"user KeysView column settings uses the default API key columns with low-frequency columns hidden","status":"passed","title":"uses the default API key columns with low-frequency columns hidden","duration":61.22569999999996,"failureMessages":[],"meta":{}},{"ancestorTitles":["user KeysView column settings"],"fullName":"user KeysView column settings shows a hidden column when toggled and persists the preference","status":"passed","title":"shows a hidden column when toggled and persists the preference","duration":13.70750000000021,"failureMessages":[],"meta":{}},{"ancestorTitles":["user KeysView column settings"],"fullName":"user KeysView column settings shows the API key ID column when toggled","status":"passed","title":"shows the API key ID column when toggled","duration":11.52539999999999,"failureMessages":[],"meta":{}},{"ancestorTitles":["user KeysView column settings"],"fullName":"user KeysView column settings shows the last used IP column when toggled","status":"passed","title":"shows the last used IP column when toggled","duration":15.047599999999875,"failureMessages":[],"meta":{}},{"ancestorTitles":["user KeysView column settings"],"fullName":"user KeysView column settings restores column preferences from localStorage on mount","status":"passed","title":"restores column preferences from localStorage on mount","duration":6.542300000000068,"failureMessages":[],"meta":{}},{"ancestorTitles":["user KeysView column settings"],"fullName":"user KeysView column settings does not include always-visible columns in the toggleable menu","status":"passed","title":"does not include always-visible columns in the toggleable menu","duration":6.421199999999999,"failureMessages":[],"meta":{}},{"ancestorTitles":["user KeysView column settings"],"fullName":"user KeysView column settings renders the current concurrency value","status":"passed","title":"renders the current concurrency value","duration":4.54079999999999,"failureMessages":[],"meta":{}},{"ancestorTitles":["user KeysView column settings"],"fullName":"user KeysView column settings marks current concurrency as sortable","status":"passed","title":"marks current concurrency as sortable","duration":4.211999999999989,"failureMessages":[],"meta":{}},{"ancestorTitles":["user KeysView column settings"],"fullName":"user KeysView column settings keeps filters and selected page size when sorting by current concurrency","status":"passed","title":"keeps filters and selected page size when sorting by current concurrency","duration":9.809399999999869,"failureMessages":[],"meta":{}}],"startTime":1789442773308,"endTime":1789442773441.8093,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/views/user/__tests__/KeysView.spec.ts"},{"assertionResults":[{"ancestorTitles":["PaymentResultView"],"fullName":"PaymentResultView renders a pending state instead of a failure state when the restored order is still pending","status":"passed","title":"renders a pending state instead of a failure state when the restored order is still pending","duration":39.49260000000004,"failureMessages":[],"meta":{}},{"ancestorTitles":["PaymentResultView"],"fullName":"PaymentResultView prefers the public resume-token result over a stale restored DB snapshot","status":"passed","title":"prefers the public resume-token result over a stale restored DB snapshot","duration":8.20640000000003,"failureMessages":[],"meta":{}},{"ancestorTitles":["PaymentResultView"],"fullName":"PaymentResultView waits for completed fulfillment before refreshing the user balance","status":"passed","title":"waits for completed fulfillment before refreshing the user balance","duration":6.611599999999953,"failureMessages":[],"meta":{}},{"ancestorTitles":["PaymentResultView"],"fullName":"PaymentResultView keeps the successful result when refreshing the user balance fails","status":"passed","title":"keeps the successful result when refreshing the user balance fails","duration":4.083100000000059,"failureMessages":[],"meta":{}},{"ancestorTitles":["PaymentResultView"],"fullName":"PaymentResultView falls back to order_id polling when resume-token recovery fails","status":"passed","title":"falls back to order_id polling when resume-token recovery fails","duration":3.9794999999999163,"failureMessages":[],"meta":{}},{"ancestorTitles":["PaymentResultView"],"fullName":"PaymentResultView falls back to public out_trade_no verification when resume_token recovery fails in legacy return flows","status":"passed","title":"falls back to public out_trade_no verification when resume_token recovery fails in legacy return flows","duration":2.634999999999991,"failureMessages":[],"meta":{}},{"ancestorTitles":["PaymentResultView"],"fullName":"PaymentResultView ignores a stale global recovery snapshot when legacy return markers do not identify the order","status":"passed","title":"ignores a stale global recovery snapshot when legacy return markers do not identify the order","duration":1.455600000000004,"failureMessages":[],"meta":{}},{"ancestorTitles":["PaymentResultView"],"fullName":"PaymentResultView uses public out_trade_no verification when no signed resume context is available","status":"passed","title":"uses public out_trade_no verification when no signed resume context is available","duration":2.2220000000002074,"failureMessages":[],"meta":{}},{"ancestorTitles":["PaymentResultView"],"fullName":"PaymentResultView renders the minimal public out_trade_no verification result without payment_type","status":"passed","title":"renders the minimal public out_trade_no verification result without payment_type","duration":1.6958999999999378,"failureMessages":[],"meta":{}},{"ancestorTitles":["PaymentResultView"],"fullName":"PaymentResultView prefers authenticated order verification before falling back to public lookup","status":"passed","title":"prefers authenticated order verification before falling back to public lookup","duration":2.023800000000165,"failureMessages":[],"meta":{}},{"ancestorTitles":["PaymentResultView"],"fullName":"PaymentResultView does not use public out_trade_no verification for bare order numbers without legacy return markers","status":"passed","title":"does not use public out_trade_no verification for bare order numbers without legacy return markers","duration":1.0043000000000575,"failureMessages":[],"meta":{}},{"ancestorTitles":["PaymentResultView"],"fullName":"PaymentResultView resolves order by resume token when local recovery snapshot is missing","status":"passed","title":"resolves order by resume token when local recovery snapshot is missing","duration":2.0238999999999123,"failureMessages":[],"meta":{}},{"ancestorTitles":["PaymentResultView"],"fullName":"PaymentResultView uses the currency returned by the order API when rendering amounts","status":"passed","title":"uses the currency returned by the order API when rendering amounts","duration":2.694900000000189,"failureMessages":[],"meta":{}},{"ancestorTitles":["PaymentResultView"],"fullName":"PaymentResultView normalizes aliased payment methods before rendering the label","status":"passed","title":"normalizes aliased payment methods before rendering the label","duration":2.176400000000058,"failureMessages":[],"meta":{}}],"startTime":1789442769435,"endTime":1789442769516.1765,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/views/user/__tests__/PaymentResultView.spec.ts"},{"assertionResults":[{"ancestorTitles":["normalizePaymentMethodForDisplay"],"fullName":"normalizePaymentMethodForDisplay collapses visible payment aliases to canonical method ids","status":"passed","title":"collapses visible payment aliases to canonical method ids","duration":0.6562000000000126,"failureMessages":[],"meta":{}},{"ancestorTitles":["normalizePaymentMethodForDisplay"],"fullName":"normalizePaymentMethodForDisplay leaves non-aliased methods untouched","status":"passed","title":"leaves non-aliased methods untouched","duration":0.08809999999994034,"failureMessages":[],"meta":{}},{"ancestorTitles":["describePaymentScenarioError"],"fullName":"describePaymentScenarioError maps WeChat H5 authorization errors to explicit in-app guidance","status":"passed","title":"maps WeChat H5 authorization errors to explicit in-app guidance","duration":0.41840000000001965,"failureMessages":[],"meta":{}},{"ancestorTitles":["describePaymentScenarioError"],"fullName":"describePaymentScenarioError maps WeChat H5 authorization errors when provider aliases use wxpay_direct","status":"passed","title":"maps WeChat H5 authorization errors when provider aliases use wxpay_direct","duration":0.08740000000000236,"failureMessages":[],"meta":{}},{"ancestorTitles":["describePaymentScenarioError"],"fullName":"describePaymentScenarioError maps missing WeixinJSBridge to a JSAPI-specific prompt","status":"passed","title":"maps missing WeixinJSBridge to a JSAPI-specific prompt","duration":0.09449999999992542,"failureMessages":[],"meta":{}},{"ancestorTitles":["describePaymentScenarioError"],"fullName":"describePaymentScenarioError maps the internal JSAPI unavailable marker to the same prompt","status":"passed","title":"maps the internal JSAPI unavailable marker to the same prompt","duration":0.0928000000000111,"failureMessages":[],"meta":{}},{"ancestorTitles":["describePaymentScenarioError"],"fullName":"describePaymentScenarioError maps generic desktop Alipay failures to QR guidance","status":"passed","title":"maps generic desktop Alipay failures to QR guidance","duration":0.09109999999998308,"failureMessages":[],"meta":{}},{"ancestorTitles":["buildPaymentErrorToastMessage"],"fullName":"buildPaymentErrorToastMessage returns the main message when no hint is present","status":"passed","title":"returns the main message when no hint is present","duration":0.06780000000003383,"failureMessages":[],"meta":{}},{"ancestorTitles":["buildPaymentErrorToastMessage"],"fullName":"buildPaymentErrorToastMessage appends the hint to the toast body when present","status":"passed","title":"appends the hint to the toast body when present","duration":0.05819999999994252,"failureMessages":[],"meta":{}}],"startTime":1789442799878,"endTime":1789442799879.4185,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/views/user/__tests__/paymentUx.spec.ts"},{"assertionResults":[{"ancestorTitles":["PaymentView help text"],"fullName":"PaymentView help text renders headings, emphasis, links, and lists in payment help without starting checkout","status":"passed","title":"renders headings, emphasis, links, and lists in payment help without starting checkout","duration":96.1289999999999,"failureMessages":[],"meta":{}},{"ancestorTitles":["PaymentView help text"],"fullName":"PaymentView help text removes scripts, event handlers, and unsafe URLs from rendered help","status":"passed","title":"removes scripts, event handlers, and unsafe URLs from rendered help","duration":18.367699999999786,"failureMessages":[],"meta":{}},{"ancestorTitles":["PaymentView help text"],"fullName":"PaymentView help text keeps plain-text soft line breaks and the separate help image preview","status":"passed","title":"keeps plain-text soft line breaks and the separate help image preview","duration":17.827099999999973,"failureMessages":[],"meta":{}},{"ancestorTitles":["PaymentView help text"],"fullName":"PaymentView help text keeps image-only help without an empty Markdown container","status":"passed","title":"keeps image-only help without an empty Markdown container","duration":7.989900000000034,"failureMessages":[],"meta":{}},{"ancestorTitles":["PaymentView subscription plan grid"],"fullName":"PaymentView subscription plan grid keeps 3 plans on the existing mobile/tablet/desktop grid","status":"passed","title":"keeps 3 plans on the existing mobile/tablet/desktop grid","duration":5.642900000000282,"failureMessages":[],"meta":{}},{"ancestorTitles":["PaymentView subscription plan grid"],"fullName":"PaymentView subscription plan grid keeps 4 plans on the existing mobile/tablet/desktop grid","status":"passed","title":"keeps 4 plans on the existing mobile/tablet/desktop grid","duration":4.925299999999879,"failureMessages":[],"meta":{}},{"ancestorTitles":["PaymentView subscription plan grid"],"fullName":"PaymentView subscription plan grid keeps 6 plans on the existing mobile/tablet/desktop grid","status":"passed","title":"keeps 6 plans on the existing mobile/tablet/desktop grid","duration":6.025499999999738,"failureMessages":[],"meta":{}},{"ancestorTitles":["PaymentView recharge rate preview"],"fullName":"PaymentView recharge rate preview uses the selected payment method currency in both locale templates","status":"passed","title":"uses the selected payment method currency in both locale templates","duration":43.14480000000003,"failureMessages":[],"meta":{}},{"ancestorTitles":["PaymentView subscription confirmation amounts"],"fullName":"PaymentView subscription confirmation amounts shows converted CNY pay amount using the subscription rate, not the balance multiplier","status":"passed","title":"shows converted CNY pay amount using the subscription rate, not the balance multiplier","duration":7.597299999999905,"failureMessages":[],"meta":{}},{"ancestorTitles":["PaymentView subscription confirmation amounts"],"fullName":"PaymentView subscription confirmation amounts keeps plan price when the subscription rate is not configured or payment currency is not CNY","status":"passed","title":"keeps plan price when the subscription rate is not configured or payment currency is not CNY","duration":12.69800000000032,"failureMessages":[],"meta":{}},{"ancestorTitles":["PaymentView subscription confirmation amounts"],"fullName":"PaymentView subscription confirmation amounts adds fee rate after CNY rate conversion to match backend pay_amount","status":"passed","title":"adds fee rate after CNY rate conversion to match backend pay_amount","duration":5.3233000000000175,"failureMessages":[],"meta":{}},{"ancestorTitles":["PaymentView payment recovery"],"fullName":"PaymentView payment recovery restores a custom EasyPay method as the selected payment method","status":"passed","title":"restores a custom EasyPay method as the selected payment method","duration":14.306099999999788,"failureMessages":[],"meta":{}},{"ancestorTitles":["PaymentView WeChat JSAPI flow"],"fullName":"PaymentView WeChat JSAPI flow resets payment state and redirects to /payment/result after JSAPI reports success","status":"passed","title":"resets payment state and redirects to /payment/result after JSAPI reports success","duration":2.3820999999998094,"failureMessages":[],"meta":{}},{"ancestorTitles":["PaymentView WeChat JSAPI flow"],"fullName":"PaymentView WeChat JSAPI flow resets payment state when JSAPI reports cancellation","status":"passed","title":"resets payment state when JSAPI reports cancellation","duration":1.5118000000002212,"failureMessages":[],"meta":{}},{"ancestorTitles":["PaymentView WeChat JSAPI flow"],"fullName":"PaymentView WeChat JSAPI flow clears stale recovery state when JSAPI never becomes available","status":"passed","title":"clears stale recovery state when JSAPI never becomes available","duration":6.233099999999922,"failureMessages":[],"meta":{}},{"ancestorTitles":["PaymentView WeChat JSAPI flow"],"fullName":"PaymentView WeChat JSAPI flow clears a stale recovery snapshot before handling wechat resume callback params","status":"passed","title":"clears a stale recovery snapshot before handling wechat resume callback params","duration":2.766900000000078,"failureMessages":[],"meta":{}},{"ancestorTitles":["PaymentView WeChat JSAPI flow"],"fullName":"PaymentView WeChat JSAPI flow keeps subscription resume context for token-only WeChat callbacks","status":"passed","title":"keeps subscription resume context for token-only WeChat callbacks","duration":4.734799999999723,"failureMessages":[],"meta":{}},{"ancestorTitles":["PaymentView WeChat JSAPI flow"],"fullName":"PaymentView WeChat JSAPI flow falls back to QR flow when mobile WeChat payment is unavailable","status":"passed","title":"falls back to QR flow when mobile WeChat payment is unavailable","duration":1.8551000000002205,"failureMessages":[],"meta":{}}],"startTime":1789442762606,"endTime":1789442762865.855,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/views/user/__tests__/PaymentView.spec.ts"},{"assertionResults":[{"ancestorTitles":["parseWechatResumeRoute"],"fullName":"parseWechatResumeRoute prefers the opaque resume token over legacy openid query params","status":"passed","title":"prefers the opaque resume token over legacy openid query params","duration":0.9674999999999727,"failureMessages":[],"meta":{}},{"ancestorTitles":["parseWechatResumeRoute"],"fullName":"parseWechatResumeRoute falls back to legacy openid-based resume when opaque token is absent","status":"passed","title":"falls back to legacy openid-based resume when opaque token is absent","duration":0.16009999999994307,"failureMessages":[],"meta":{}},{"ancestorTitles":["stripWechatResumeQuery"],"fullName":"stripWechatResumeQuery removes both opaque-token and legacy resume params from the route query","status":"passed","title":"removes both opaque-token and legacy resume params from the route query","duration":0.12110000000006949,"failureMessages":[],"meta":{}}],"startTime":1789442814213,"endTime":1789442814215.121,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/views/user/__tests__/paymentWechatResume.spec.ts"},{"assertionResults":[{"ancestorTitles":["ProfileView"],"fullName":"ProfileView renders the simplified single-column profile shell without separate stat cards","status":"passed","title":"renders the simplified single-column profile shell without separate stat cards","duration":25.168499999999995,"failureMessages":[],"meta":{}}],"startTime":1789442800235,"endTime":1789442800260.1685,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/views/user/__tests__/ProfileView.spec.ts"},{"assertionResults":[{"ancestorTitles":["Stripe lazy-loading contract"],"fullName":"Stripe lazy-loading contract src/views/user/StripePaymentView.vue uses the side-effect-free Stripe loader","status":"passed","title":"src/views/user/StripePaymentView.vue uses the side-effect-free Stripe loader","duration":0.8486000000000331,"failureMessages":[],"meta":{}},{"ancestorTitles":["Stripe lazy-loading contract"],"fullName":"Stripe lazy-loading contract src/views/user/StripePopupView.vue uses the side-effect-free Stripe loader","status":"passed","title":"src/views/user/StripePopupView.vue uses the side-effect-free Stripe loader","duration":0.22820000000001528,"failureMessages":[],"meta":{}},{"ancestorTitles":["Stripe lazy-loading contract"],"fullName":"Stripe lazy-loading contract src/components/payment/StripePaymentInline.vue uses the side-effect-free Stripe loader","status":"passed","title":"src/components/payment/StripePaymentInline.vue uses the side-effect-free Stripe loader","duration":0.2196999999999889,"failureMessages":[],"meta":{}},{"ancestorTitles":["Stripe lazy-loading contract"],"fullName":"Stripe lazy-loading contract keeps Stripe out of the shared vendor chunk","status":"passed","title":"keeps Stripe out of the shared vendor chunk","duration":0.29100000000005366,"failureMessages":[],"meta":{}}],"startTime":1789442818534,"endTime":1789442818535.291,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/views/user/__tests__/stripeLazyLoading.spec.ts"},{"assertionResults":[{"ancestorTitles":["StripePaymentView"],"fullName":"StripePaymentView 本地恢复快照缺失时使用订单接口返回的 Stripe 币种展示金额","status":"passed","title":"本地恢复快照缺失时使用订单接口返回的 Stripe 币种展示金额","duration":28.02080000000001,"failureMessages":[],"meta":{}}],"startTime":1789442795677,"endTime":1789442795705.0208,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/views/user/__tests__/StripePaymentView.spec.ts"},{"assertionResults":[{"ancestorTitles":["user UsageView"],"fullName":"user UsageView loads logs, stats, model stats, and snapshot on first render","status":"passed","title":"loads logs, stats, model stats, and snapshot on first render","duration":90.38279999999986,"failureMessages":[],"meta":{}},{"ancestorTitles":["user UsageView"],"fullName":"user UsageView includes API keys after the first page in both record filters and queries by the selected key","status":"passed","title":"includes API keys after the first page in both record filters and queries by the selected key","duration":63.635099999999966,"failureMessages":[],"meta":{}},{"ancestorTitles":["user UsageView"],"fullName":"user UsageView does not request another API key page when the user has no keys","status":"passed","title":"does not request another API key page when the user has no keys","duration":16.43269999999984,"failureMessages":[],"meta":{}},{"ancestorTitles":["user UsageView"],"fullName":"user UsageView stops loading API keys when a later page is empty despite an outdated page count","status":"passed","title":"stops loading API keys when a later page is empty despite an outdated page count","duration":16.077200000000175,"failureMessages":[],"meta":{}},{"ancestorTitles":["user UsageView"],"fullName":"user UsageView propagates and resets the native compaction filter across page requests","status":"passed","title":"propagates and resets the native compaction filter across page requests","duration":17.797100000000228,"failureMessages":[],"meta":{}},{"ancestorTitles":["user UsageView"],"fullName":"user UsageView exports csv with current filters and without admin-only fields","status":"passed","title":"exports csv with current filters and without admin-only fields","duration":22.295900000000074,"failureMessages":[],"meta":{}},{"ancestorTitles":["user UsageView"],"fullName":"user UsageView exports historical image rows with image billing mode derived from image_count","status":"passed","title":"exports historical image rows with image billing mode derived from image_count","duration":15.360999999999876,"failureMessages":[],"meta":{}}],"startTime":1789442767399,"endTime":1789442767641.361,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/views/user/__tests__/UsageView.spec.ts"},{"assertionResults":[{"ancestorTitles":["EmailVerifyView"],"fullName":"EmailVerifyView acquires a fresh Tencent proof for each resend action","status":"passed","title":"acquires a fresh Tencent proof for each resend action","duration":64.47550000000001,"failureMessages":[],"meta":{}},{"ancestorTitles":["EmailVerifyView"],"fullName":"EmailVerifyView uses the pending oauth verify-code endpoint when register data carries a pending auth session","status":"passed","title":"uses the pending oauth verify-code endpoint when register data carries a pending auth session","duration":13.075399999999945,"failureMessages":[],"meta":{}},{"ancestorTitles":["EmailVerifyView"],"fullName":"EmailVerifyView requires a fresh captcha proof after the initial send-code request fails","status":"passed","title":"requires a fresh captcha proof after the initial send-code request fails","duration":23.435100000000148,"failureMessages":[],"meta":{}},{"ancestorTitles":["EmailVerifyView"],"fullName":"EmailVerifyView skips the registration email suffix whitelist for pending oauth verification","status":"passed","title":"skips the registration email suffix whitelist for pending oauth verification","duration":9.486699999999928,"failureMessages":[],"meta":{}},{"ancestorTitles":["EmailVerifyView"],"fullName":"EmailVerifyView sends a verification code for a non-whitelist email domain","status":"passed","title":"sends a verification code for a non-whitelist email domain","duration":6.783900000000131,"failureMessages":[],"meta":{}},{"ancestorTitles":["EmailVerifyView"],"fullName":"EmailVerifyView shows the localized domain quota message when sending a verification code is rejected","status":"passed","title":"shows the localized domain quota message when sending a verification code is rejected","duration":6.137200000000121,"failureMessages":[],"meta":{}},{"ancestorTitles":["EmailVerifyView"],"fullName":"EmailVerifyView shows the localized domain quota message when verified registration is rejected","status":"passed","title":"shows the localized domain quota message when verified registration is rejected","duration":23.24050000000011,"failureMessages":[],"meta":{}},{"ancestorTitles":["EmailVerifyView"],"fullName":"EmailVerifyView blocks sending a verification code for a non-whitelist email domain when the quota switch is disabled","status":"passed","title":"blocks sending a verification code for a non-whitelist email domain when the quota switch is disabled","duration":5.5026000000000295,"failureMessages":[],"meta":{}},{"ancestorTitles":["EmailVerifyView"],"fullName":"EmailVerifyView uses the pending oauth verify-code endpoint when auth store only carries the pending provider","status":"passed","title":"uses the pending oauth verify-code endpoint when auth store only carries the pending provider","duration":6.447900000000118,"failureMessages":[],"meta":{}},{"ancestorTitles":["EmailVerifyView"],"fullName":"EmailVerifyView returns to the oauth callback flow when pending send-code detects an existing account email","status":"passed","title":"returns to the oauth callback flow when pending send-code detects an existing account email","duration":5.667899999999918,"failureMessages":[],"meta":{}},{"ancestorTitles":["EmailVerifyView"],"fullName":"EmailVerifyView submits pending auth account creation when session storage has no pending metadata but auth store does","status":"passed","title":"submits pending auth account creation when session storage has no pending metadata but auth store does","duration":8.424800000000005,"failureMessages":[],"meta":{}},{"ancestorTitles":["EmailVerifyView"],"fullName":"EmailVerifyView requires and submits a fresh turnstile token for pending oauth account creation","status":"passed","title":"requires and submits a fresh turnstile token for pending oauth account creation","duration":13.33400000000006,"failureMessages":[],"meta":{}},{"ancestorTitles":["EmailVerifyView"],"fullName":"EmailVerifyView resets the pending oauth create-account turnstile after submit failure","status":"passed","title":"resets the pending oauth create-account turnstile after submit failure","duration":10.550400000000081,"failureMessages":[],"meta":{}},{"ancestorTitles":["EmailVerifyView"],"fullName":"EmailVerifyView returns to the oauth callback flow when pending account creation becomes bind-login","status":"passed","title":"returns to the oauth callback flow when pending account creation becomes bind-login","duration":8.75909999999999,"failureMessages":[],"meta":{}},{"ancestorTitles":["EmailVerifyView"],"fullName":"EmailVerifyView keeps the normal email registration flow unchanged","status":"passed","title":"keeps the normal email registration flow unchanged","duration":8.691900000000032,"failureMessages":[],"meta":{}},{"ancestorTitles":["EmailVerifyView"],"fullName":"EmailVerifyView does not require another Tencent proof for final email registration","status":"passed","title":"does not require another Tencent proof for final email registration","duration":9.02559999999994,"failureMessages":[],"meta":{}}],"startTime":1789442758469,"endTime":1789442758693.0256,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/views/auth/__tests__/EmailVerifyView.spec.ts"},{"assertionResults":[{"ancestorTitles":["LinuxDoCallbackView"],"fullName":"LinuxDoCallbackView accepts the legacy fragment token success callback without pending-session exchange","status":"passed","title":"accepts the legacy fragment token success callback without pending-session exchange","duration":22.035500000000184,"failureMessages":[],"meta":{}},{"ancestorTitles":["LinuxDoCallbackView"],"fullName":"LinuxDoCallbackView accepts the legacy pending oauth invitation fragment without pending-session exchange","status":"passed","title":"accepts the legacy pending oauth invitation fragment without pending-session exchange","duration":19.404800000000023,"failureMessages":[],"meta":{}},{"ancestorTitles":["LinuxDoCallbackView"],"fullName":"LinuxDoCallbackView does not send adoption decisions during the initial exchange","status":"passed","title":"does not send adoption decisions during the initial exchange","duration":3.6322999999999865,"failureMessages":[],"meta":{}},{"ancestorTitles":["LinuxDoCallbackView"],"fullName":"LinuxDoCallbackView waits for explicit adoption confirmation before finishing a non-invitation login","status":"passed","title":"waits for explicit adoption confirmation before finishing a non-invitation login","duration":8.360900000000129,"failureMessages":[],"meta":{}},{"ancestorTitles":["LinuxDoCallbackView"],"fullName":"LinuxDoCallbackView treats a completion without token as bind success and returns to profile","status":"passed","title":"treats a completion without token as bind success and returns to profile","duration":1.776399999999967,"failureMessages":[],"meta":{}},{"ancestorTitles":["LinuxDoCallbackView"],"fullName":"LinuxDoCallbackView supports bind completion after adoption confirmation","status":"passed","title":"supports bind completion after adoption confirmation","duration":3.909599999999955,"failureMessages":[],"meta":{}},{"ancestorTitles":["LinuxDoCallbackView"],"fullName":"LinuxDoCallbackView keeps rendering pending bind-login UI when adoption confirmation leads to another pending step","status":"passed","title":"keeps rendering pending bind-login UI when adoption confirmation leads to another pending step","duration":45.61159999999995,"failureMessages":[],"meta":{}},{"ancestorTitles":["LinuxDoCallbackView"],"fullName":"LinuxDoCallbackView keeps rendering bind-login UI for legacy pending bind responses instead of treating them as success","status":"passed","title":"keeps rendering bind-login UI for legacy pending bind responses instead of treating them as success","duration":2.501500000000078,"failureMessages":[],"meta":{}},{"ancestorTitles":["LinuxDoCallbackView"],"fullName":"LinuxDoCallbackView persists a pending auth session when the oauth flow still needs account creation","status":"passed","title":"persists a pending auth session when the oauth flow still needs account creation","duration":6.042400000000043,"failureMessages":[],"meta":{}},{"ancestorTitles":["LinuxDoCallbackView"],"fullName":"LinuxDoCallbackView renders adoption choices for invitation flow and submits the selected values","status":"passed","title":"renders adoption choices for invitation flow and submits the selected values","duration":7.465800000000172,"failureMessages":[],"meta":{}},{"ancestorTitles":["LinuxDoCallbackView"],"fullName":"LinuxDoCallbackView keeps the oauth flow active when complete-registration returns another pending step","status":"passed","title":"keeps the oauth flow active when complete-registration returns another pending step","duration":4.43340000000012,"failureMessages":[],"meta":{}},{"ancestorTitles":["LinuxDoCallbackView"],"fullName":"LinuxDoCallbackView collects email, password, and verify code for pending oauth account creation and submits adoption decisions","status":"passed","title":"collects email, password, and verify code for pending oauth account creation and submits adoption decisions","duration":10.343900000000076,"failureMessages":[],"meta":{}},{"ancestorTitles":["LinuxDoCallbackView"],"fullName":"LinuxDoCallbackView switches to bind-login when create-account returns EMAIL_EXISTS","status":"passed","title":"switches to bind-login when create-account returns EMAIL_EXISTS","duration":8.716199999999844,"failureMessages":[],"meta":{}},{"ancestorTitles":["LinuxDoCallbackView"],"fullName":"LinuxDoCallbackView shows create-account failures through toast without inline error text","status":"passed","title":"shows create-account failures through toast without inline error text","duration":5.164400000000114,"failureMessages":[],"meta":{}},{"ancestorTitles":["LinuxDoCallbackView"],"fullName":"LinuxDoCallbackView sends a verify code for pending oauth account creation","status":"passed","title":"sends a verify code for pending oauth account creation","duration":4.5909999999998945,"failureMessages":[],"meta":{}},{"ancestorTitles":["LinuxDoCallbackView"],"fullName":"LinuxDoCallbackView shows bind-login form for existing account binding and submits credentials with adoption decisions","status":"passed","title":"shows bind-login form for existing account binding and submits credentials with adoption decisions","duration":5.906999999999925,"failureMessages":[],"meta":{}},{"ancestorTitles":["LinuxDoCallbackView"],"fullName":"LinuxDoCallbackView handles bind-login 2FA challenge before redirecting","status":"passed","title":"handles bind-login 2FA challenge before redirecting","duration":5.371200000000044,"failureMessages":[],"meta":{}}],"startTime":1789442761402,"endTime":1789442761567.371,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/views/auth/__tests__/LinuxDoCallbackView.spec.ts"},{"assertionResults":[{"ancestorTitles":["LoginView registration entry"],"fullName":"LoginView registration entry shows the registration entry when registration is enabled","status":"passed","title":"shows the registration entry when registration is enabled","duration":21.78189999999995,"failureMessages":[],"meta":{}},{"ancestorTitles":["LoginView registration entry"],"fullName":"LoginView registration entry hides the registration entry when registration is disabled","status":"passed","title":"hides the registration entry when registration is disabled","duration":3.4593999999999596,"failureMessages":[],"meta":{}}],"startTime":1789442800195,"endTime":1789442800220.4595,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/views/auth/__tests__/LoginView.spec.ts"},{"assertionResults":[{"ancestorTitles":["OAuthCallbackView"],"fullName":"OAuthCallbackView renders localized callback copy actions","status":"passed","title":"renders localized callback copy actions","duration":18.395099999999957,"failureMessages":[],"meta":{}},{"ancestorTitles":["OAuthCallbackView"],"fullName":"OAuthCallbackView sends callback errors to toast instead of rendering inline red text","status":"passed","title":"sends callback errors to toast instead of rendering inline red text","duration":3.782600000000002,"failureMessages":[],"meta":{}},{"ancestorTitles":["OAuthCallbackView"],"fullName":"OAuthCallbackView does not render manual copy fields for direct email oauth callback visits","status":"passed","title":"does not render manual copy fields for direct email oauth callback visits","duration":4.283699999999953,"failureMessages":[],"meta":{}},{"ancestorTitles":["OAuthCallbackView"],"fullName":"OAuthCallbackView forwards frontend email oauth provider callbacks back to the backend callback endpoint","status":"passed","title":"forwards frontend email oauth provider callbacks back to the backend callback endpoint","duration":9.828499999999963,"failureMessages":[],"meta":{}},{"ancestorTitles":["OAuthCallbackView"],"fullName":"OAuthCallbackView submits stored affiliate code when completing invited email oauth registration","status":"passed","title":"submits stored affiliate code when completing invited email oauth registration","duration":9.800499999999943,"failureMessages":[],"meta":{}},{"ancestorTitles":["OAuthCallbackView"],"fullName":"OAuthCallbackView completes email oauth registration with readonly email and without posting email","status":"passed","title":"completes email oauth registration with readonly email and without posting email","duration":7.258000000000038,"failureMessages":[],"meta":{}}],"startTime":1789442780775,"endTime":1789442780828.258,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/views/auth/__tests__/OAuthCallbackView.spec.ts"},{"assertionResults":[{"ancestorTitles":["OidcCallbackView"],"fullName":"OidcCallbackView accepts the legacy fragment token success callback without pending-session exchange","status":"passed","title":"accepts the legacy fragment token success callback without pending-session exchange","duration":36.5320999999999,"failureMessages":[],"meta":{}},{"ancestorTitles":["OidcCallbackView"],"fullName":"OidcCallbackView accepts the legacy pending oauth invitation fragment without pending-session exchange","status":"passed","title":"accepts the legacy pending oauth invitation fragment without pending-session exchange","duration":33.56040000000007,"failureMessages":[],"meta":{}},{"ancestorTitles":["OidcCallbackView"],"fullName":"OidcCallbackView does not send adoption decisions during the initial exchange","status":"passed","title":"does not send adoption decisions during the initial exchange","duration":5.197199999999839,"failureMessages":[],"meta":{}},{"ancestorTitles":["OidcCallbackView"],"fullName":"OidcCallbackView waits for explicit adoption confirmation before finishing a non-invitation login","status":"passed","title":"waits for explicit adoption confirmation before finishing a non-invitation login","duration":47.38850000000002,"failureMessages":[],"meta":{}},{"ancestorTitles":["OidcCallbackView"],"fullName":"OidcCallbackView supports bind completion after adoption confirmation","status":"passed","title":"supports bind completion after adoption confirmation","duration":9.659700000000157,"failureMessages":[],"meta":{}},{"ancestorTitles":["OidcCallbackView"],"fullName":"OidcCallbackView keeps rendering pending bind-login UI when adoption confirmation leads to another pending step","status":"passed","title":"keeps rendering pending bind-login UI when adoption confirmation leads to another pending step","duration":9.987100000000055,"failureMessages":[],"meta":{}},{"ancestorTitles":["OidcCallbackView"],"fullName":"OidcCallbackView persists a pending auth session when the oauth flow still needs account creation","status":"passed","title":"persists a pending auth session when the oauth flow still needs account creation","duration":10.776900000000069,"failureMessages":[],"meta":{}},{"ancestorTitles":["OidcCallbackView"],"fullName":"OidcCallbackView renders adoption choices for invitation flow and submits the selected values","status":"passed","title":"renders adoption choices for invitation flow and submits the selected values","duration":18.451000000000022,"failureMessages":[],"meta":{}},{"ancestorTitles":["OidcCallbackView"],"fullName":"OidcCallbackView keeps the oauth flow active when complete-registration returns another pending step","status":"passed","title":"keeps the oauth flow active when complete-registration returns another pending step","duration":8.428499999999985,"failureMessages":[],"meta":{}},{"ancestorTitles":["OidcCallbackView"],"fullName":"OidcCallbackView collects email, password, and verify code for pending oauth account creation and submits adoption decisions","status":"passed","title":"collects email, password, and verify code for pending oauth account creation and submits adoption decisions","duration":10.477800000000116,"failureMessages":[],"meta":{}},{"ancestorTitles":["OidcCallbackView"],"fullName":"OidcCallbackView switches to bind-login when create-account returns EMAIL_EXISTS","status":"passed","title":"switches to bind-login when create-account returns EMAIL_EXISTS","duration":6.378099999999904,"failureMessages":[],"meta":{}},{"ancestorTitles":["OidcCallbackView"],"fullName":"OidcCallbackView shows create-account failures through toast without inline error text","status":"passed","title":"shows create-account failures through toast without inline error text","duration":4.208699999999908,"failureMessages":[],"meta":{}},{"ancestorTitles":["OidcCallbackView"],"fullName":"OidcCallbackView sends a verify code for pending oauth account creation","status":"passed","title":"sends a verify code for pending oauth account creation","duration":5.118800000000192,"failureMessages":[],"meta":{}},{"ancestorTitles":["OidcCallbackView"],"fullName":"OidcCallbackView shows bind-login form for existing account binding and submits credentials with adoption decisions","status":"passed","title":"shows bind-login form for existing account binding and submits credentials with adoption decisions","duration":7.585900000000038,"failureMessages":[],"meta":{}},{"ancestorTitles":["OidcCallbackView"],"fullName":"OidcCallbackView handles bind-login 2FA challenge before redirecting","status":"passed","title":"handles bind-login 2FA challenge before redirecting","duration":5.498199999999997,"failureMessages":[],"meta":{}}],"startTime":1789442762031,"endTime":1789442762251.4983,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/views/auth/__tests__/OidcCallbackView.spec.ts"},{"assertionResults":[{"ancestorTitles":["RegisterView invitation layout"],"fullName":"RegisterView invitation layout keeps the optional affiliate invitation field before Turnstile","status":"passed","title":"keeps the optional affiliate invitation field before Turnstile","duration":31.121200000000044,"failureMessages":[],"meta":{}},{"ancestorTitles":["RegisterView invitation layout"],"fullName":"RegisterView invitation layout uses the mandatory invitation field without duplicating the affiliate field","status":"passed","title":"uses the mandatory invitation field without duplicating the affiliate field","duration":6.627799999999979,"failureMessages":[],"meta":{}},{"ancestorTitles":["RegisterView invitation layout"],"fullName":"RegisterView invitation layout submits a non-whitelist email domain so the backend can enforce its registration quota","status":"passed","title":"submits a non-whitelist email domain so the backend can enforce its registration quota","duration":10.90560000000005,"failureMessages":[],"meta":{}},{"ancestorTitles":["RegisterView invitation layout"],"fullName":"RegisterView invitation layout shows the localized registration domain quota message returned by the backend","status":"passed","title":"shows the localized registration domain quota message returned by the backend","duration":7.993199999999888,"failureMessages":[],"meta":{}},{"ancestorTitles":["RegisterView invitation layout"],"fullName":"RegisterView invitation layout rejects a non-whitelist email domain locally when the domain quota switch is disabled","status":"passed","title":"rejects a non-whitelist email domain locally when the domain quota switch is disabled","duration":9.596499999999878,"failureMessages":[],"meta":{}},{"ancestorTitles":["RegisterView invitation layout"],"fullName":"RegisterView invitation layout still submits whitelisted email domains when the domain quota switch is disabled","status":"passed","title":"still submits whitelisted email domains when the domain quota switch is disabled","duration":8.729799999999841,"failureMessages":[],"meta":{}}],"startTime":1789442782775,"endTime":1789442782850.7297,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/views/auth/__tests__/RegisterView.spec.ts"},{"assertionResults":[{"ancestorTitles":["Tencent captcha action gate"],"fullName":"Tencent captcha action gate clicking login opens Tencent captcha before calling login","status":"passed","title":"clicking login opens Tencent captcha before calling login","duration":57.93799999999999,"failureMessages":[],"meta":{}},{"ancestorTitles":["Tencent captcha action gate"],"fullName":"Tencent captcha action gate does not call login when Tencent captcha is closed","status":"passed","title":"does not call login when Tencent captcha is closed","duration":6.869200000000092,"failureMessages":[],"meta":{}},{"ancestorTitles":["Tencent captcha action gate"],"fullName":"Tencent captcha action gate does not open Tencent captcha when login form validation fails","status":"passed","title":"does not open Tencent captcha when login form validation fails","duration":4.91170000000011,"failureMessages":[],"meta":{}},{"ancestorTitles":["Tencent captcha action gate"],"fullName":"Tencent captcha action gate starts OAuth through the Tencent gate before navigating","status":"passed","title":"starts OAuth through the Tencent gate before navigating","duration":12.32549999999992,"failureMessages":[],"meta":{}},{"ancestorTitles":["Tencent captcha action gate"],"fullName":"Tencent captcha action gate does not start OAuth when Tencent captcha is closed","status":"passed","title":"does not start OAuth when Tencent captcha is closed","duration":5.209100000000035,"failureMessages":[],"meta":{}},{"ancestorTitles":["Tencent captcha action gate"],"fullName":"Tencent captcha action gate passes a fresh Tencent proof to Passkey login","status":"passed","title":"passes a fresh Tencent proof to Passkey login","duration":4.762199999999893,"failureMessages":[],"meta":{}},{"ancestorTitles":["Tencent captcha action gate"],"fullName":"Tencent captcha action gate does not invoke Passkey when Tencent captcha is closed","status":"passed","title":"does not invoke Passkey when Tencent captcha is closed","duration":4.621000000000095,"failureMessages":[],"meta":{}}],"startTime":1789442783098,"endTime":1789442783194.621,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/views/auth/__tests__/TencentCaptchaActionGate.spec.ts"},{"assertionResults":[{"ancestorTitles":["忘记密码腾讯验证码门禁"],"fullName":"忘记密码腾讯验证码门禁 把公开设置中的站点传给验证码组件","status":"passed","title":"把公开设置中的站点传给验证码组件","duration":18.731599999999958,"failureMessages":[],"meta":{}},{"ancestorTitles":["忘记密码腾讯验证码门禁"],"fullName":"忘记密码腾讯验证码门禁 提交前获取新票据并原样发送到忘记密码接口","status":"passed","title":"提交前获取新票据并原样发送到忘记密码接口","duration":11.015300000000025,"failureMessages":[],"meta":{}}],"startTime":1789442799387,"endTime":1789442799417.0154,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/views/auth/__tests__/TencentCaptchaForgotPassword.spec.ts"},{"assertionResults":[{"ancestorTitles":["WechatCallbackView"],"fullName":"WechatCallbackView overrides an incompatible query mode with the configured open capability during bind recovery","status":"passed","title":"overrides an incompatible query mode with the configured open capability during bind recovery","duration":15.713399999999865,"failureMessages":[],"meta":{}},{"ancestorTitles":["WechatCallbackView"],"fullName":"WechatCallbackView falls back to the query mode when capability settings cannot be confirmed","status":"passed","title":"falls back to the query mode when capability settings cannot be confirmed","duration":1.9085999999999785,"failureMessages":[],"meta":{}},{"ancestorTitles":["WechatCallbackView"],"fullName":"WechatCallbackView ignores legacy aggregate wechat settings and reuses the query mode during bind recovery","status":"passed","title":"ignores legacy aggregate wechat settings and reuses the query mode during bind recovery","duration":1.7307000000000698,"failureMessages":[],"meta":{}},{"ancestorTitles":["WechatCallbackView"],"fullName":"WechatCallbackView accepts the legacy fragment token success callback without pending-session exchange","status":"passed","title":"accepts the legacy fragment token success callback without pending-session exchange","duration":2.6014999999999873,"failureMessages":[],"meta":{}},{"ancestorTitles":["WechatCallbackView"],"fullName":"WechatCallbackView accepts the legacy pending oauth invitation fragment without pending-session exchange","status":"passed","title":"accepts the legacy pending oauth invitation fragment without pending-session exchange","duration":13.790199999999913,"failureMessages":[],"meta":{}},{"ancestorTitles":["WechatCallbackView"],"fullName":"WechatCallbackView does not send adoption decisions during the initial exchange","status":"passed","title":"does not send adoption decisions during the initial exchange","duration":2.7966999999998734,"failureMessages":[],"meta":{}},{"ancestorTitles":["WechatCallbackView"],"fullName":"WechatCallbackView waits for explicit adoption confirmation before finishing a non-invitation login","status":"passed","title":"waits for explicit adoption confirmation before finishing a non-invitation login","duration":16.029999999999973,"failureMessages":[],"meta":{}},{"ancestorTitles":["WechatCallbackView"],"fullName":"WechatCallbackView supports bind completion after adoption confirmation","status":"passed","title":"supports bind completion after adoption confirmation","duration":4.5371000000000095,"failureMessages":[],"meta":{}},{"ancestorTitles":["WechatCallbackView"],"fullName":"WechatCallbackView renders adoption choices for invitation flow and submits the selected values","status":"passed","title":"renders adoption choices for invitation flow and submits the selected values","duration":29.805200000000013,"failureMessages":[],"meta":{}},{"ancestorTitles":["WechatCallbackView"],"fullName":"WechatCallbackView keeps the oauth flow active when complete-registration returns another pending step","status":"passed","title":"keeps the oauth flow active when complete-registration returns another pending step","duration":4.473099999999931,"failureMessages":[],"meta":{}},{"ancestorTitles":["WechatCallbackView"],"fullName":"WechatCallbackView offers existing-account email collection during invitation flow","status":"passed","title":"offers existing-account email collection during invitation flow","duration":2.94419999999991,"failureMessages":[],"meta":{}},{"ancestorTitles":["WechatCallbackView"],"fullName":"WechatCallbackView binds directly to the current signed-in account during invitation flow","status":"passed","title":"binds directly to the current signed-in account during invitation flow","duration":2.6458999999999833,"failureMessages":[],"meta":{}},{"ancestorTitles":["WechatCallbackView"],"fullName":"WechatCallbackView shows an error and stays on the page when preparing bind-token for the current account fails","status":"passed","title":"shows an error and stays on the page when preparing bind-token for the current account fails","duration":3.6475000000000364,"failureMessages":[],"meta":{}},{"ancestorTitles":["WechatCallbackView"],"fullName":"WechatCallbackView collects email, password, and verify code for pending oauth account creation and submits adoption decisions","status":"passed","title":"collects email, password, and verify code for pending oauth account creation and submits adoption decisions","duration":8.640300000000025,"failureMessages":[],"meta":{}},{"ancestorTitles":["WechatCallbackView"],"fullName":"WechatCallbackView persists a pending auth session when the oauth flow still needs account creation","status":"passed","title":"persists a pending auth session when the oauth flow still needs account creation","duration":2.0072999999999865,"failureMessages":[],"meta":{}},{"ancestorTitles":["WechatCallbackView"],"fullName":"WechatCallbackView switches to bind-login when create-account returns EMAIL_EXISTS","status":"passed","title":"switches to bind-login when create-account returns EMAIL_EXISTS","duration":4.314799999999877,"failureMessages":[],"meta":{}},{"ancestorTitles":["WechatCallbackView"],"fullName":"WechatCallbackView shows create-account failures through toast without inline error text","status":"passed","title":"shows create-account failures through toast without inline error text","duration":2.9976000000001477,"failureMessages":[],"meta":{}},{"ancestorTitles":["WechatCallbackView"],"fullName":"WechatCallbackView sends a verify code for pending oauth account creation","status":"passed","title":"sends a verify code for pending oauth account creation","duration":5.738100000000031,"failureMessages":[],"meta":{}},{"ancestorTitles":["WechatCallbackView"],"fullName":"WechatCallbackView shows bind-login form for existing account binding and submits credentials with adoption decisions","status":"passed","title":"shows bind-login form for existing account binding and submits credentials with adoption decisions","duration":4.7314000000001215,"failureMessages":[],"meta":{}},{"ancestorTitles":["WechatCallbackView"],"fullName":"WechatCallbackView allows switching from server-driven bind-login to create-account mode","status":"passed","title":"allows switching from server-driven bind-login to create-account mode","duration":3.5504000000000815,"failureMessages":[],"meta":{}},{"ancestorTitles":["WechatCallbackView"],"fullName":"WechatCallbackView reuses query email for bind-login when backend does not echo it back","status":"passed","title":"reuses query email for bind-login when backend does not echo it back","duration":6.1521999999999935,"failureMessages":[],"meta":{}},{"ancestorTitles":["WechatCallbackView"],"fullName":"WechatCallbackView keeps rendering pending bind-login UI when adoption confirmation leads to another pending step","status":"passed","title":"keeps rendering pending bind-login UI when adoption confirmation leads to another pending step","duration":5.4221,"failureMessages":[],"meta":{}},{"ancestorTitles":["WechatCallbackView"],"fullName":"WechatCallbackView handles bind-login 2FA challenge before redirecting","status":"passed","title":"handles bind-login 2FA challenge before redirecting","duration":6.019399999999905,"failureMessages":[],"meta":{}},{"ancestorTitles":["WechatCallbackView"],"fullName":"WechatCallbackView restarts the current-user bind flow after returning from login","status":"passed","title":"restarts the current-user bind flow after returning from login","duration":5.820899999999938,"failureMessages":[],"meta":{}},{"ancestorTitles":["WechatCallbackView"],"fullName":"WechatCallbackView redirects back to login instead of falling through when bind-existing resume has no auth token","status":"passed","title":"redirects back to login instead of falling through when bind-existing resume has no auth token","duration":3.779299999999921,"failureMessages":[],"meta":{}}],"startTime":1789442757375,"endTime":1789442757537.7793,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/views/auth/__tests__/WechatCallbackView.spec.ts"},{"assertionResults":[{"ancestorTitles":["WechatPaymentCallbackView"],"fullName":"WechatPaymentCallbackView redirects back to purchase with an opaque resume token from hash fragment","status":"passed","title":"redirects back to purchase with an opaque resume token from hash fragment","duration":10.773000000000025,"failureMessages":[],"meta":{}},{"ancestorTitles":["WechatPaymentCallbackView"],"fullName":"WechatPaymentCallbackView redirects legacy openid callback payloads back to purchase while preserving resume context","status":"passed","title":"redirects legacy openid callback payloads back to purchase while preserving resume context","duration":1.741700000000037,"failureMessages":[],"meta":{}},{"ancestorTitles":["WechatPaymentCallbackView"],"fullName":"WechatPaymentCallbackView shows an error when the callback payload is missing the resume token","status":"passed","title":"shows an error when the callback payload is missing the resume token","duration":6.854900000000043,"failureMessages":[],"meta":{}}],"startTime":1789442796192,"endTime":1789442796210.855,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/views/auth/__tests__/WechatPaymentCallbackView.spec.ts"},{"assertionResults":[{"ancestorTitles":["AnnouncementReadStatusDialog"],"fullName":"AnnouncementReadStatusDialog closes by aborting active requests and clearing debounced reloads","status":"passed","title":"closes by aborting active requests and clearing debounced reloads","duration":19.75980000000004,"failureMessages":[],"meta":{}}],"startTime":1789442808060,"endTime":1789442808079.7598,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/components/admin/announcements/__tests__/AnnouncementReadStatusDialog.spec.ts"},{"assertionResults":[{"ancestorTitles":["CodexManifestAccountsField"],"fullName":"CodexManifestAccountsField hides account controls while disabled and reveals them after enabling","status":"passed","title":"hides account controls while disabled and reveals them after enabling","duration":20.788600000000088,"failureMessages":[],"meta":{}},{"ancestorTitles":["CodexManifestAccountsField"],"fullName":"CodexManifestAccountsField selects accounts from search results and removes them via tags","status":"passed","title":"selects accounts from search results and removes them via tags","duration":16.410900000000083,"failureMessages":[],"meta":{}},{"ancestorTitles":["CodexManifestAccountsField"],"fullName":"CodexManifestAccountsField fails validation when enabled without accounts","status":"passed","title":"fails validation when enabled without accounts","duration":3.3794000000000324,"failureMessages":[],"meta":{}},{"ancestorTitles":["CodexManifestAccountsField"],"fullName":"CodexManifestAccountsField closes the dropdown on outside click and shows the empty state","status":"passed","title":"closes the dropdown on outside click and shows the empty state","duration":4.3881999999999834,"failureMessages":[],"meta":{}}],"startTime":1789442780102,"endTime":1789442780146.3882,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/components/admin/group/__tests__/CodexManifestAccountsField.spec.ts"},{"assertionResults":[{"ancestorTitles":["ReasoningEffortPolicyFields"],"fullName":"ReasoningEffortPolicyFields offers none only in the mapping source selector","status":"passed","title":"offers none only in the mapping source selector","duration":24.672700000000077,"failureMessages":[],"meta":{}},{"ancestorTitles":["ReasoningEffortPolicyFields"],"fullName":"ReasoningEffortPolicyFields renders model scope fields for each mapping","status":"passed","title":"renders model scope fields for each mapping","duration":5.131399999999985,"failureMessages":[],"meta":{}},{"ancestorTitles":["ReasoningEffortPolicyFields"],"fullName":"ReasoningEffortPolicyFields emits a new mapping group with one empty pair","status":"passed","title":"emits a new mapping group with one empty pair","duration":3.5037000000000944,"failureMessages":[],"meta":{}}],"startTime":1789442792125,"endTime":1789442792157.5037,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/components/admin/group/__tests__/ReasoningEffortPolicyFields.spec.ts"},{"assertionResults":[{"ancestorTitles":["AccountActionMenu viewport positioning"],"fullName":"AccountActionMenu viewport positioning measures a long OAuth menu and opens above the last row","status":"passed","title":"measures a long OAuth menu and opens above the last row","duration":22.600099999999998,"failureMessages":[],"meta":{}},{"ancestorTitles":["AccountActionMenu viewport positioning"],"fullName":"AccountActionMenu viewport positioning opens below the trigger when the complete menu fits","status":"passed","title":"opens below the trigger when the complete menu fits","duration":6.024900000000002,"failureMessages":[],"meta":{}},{"ancestorTitles":["AccountActionMenu viewport positioning"],"fullName":"AccountActionMenu viewport positioning centers a mobile menu on its trigger and flips above the last row","status":"passed","title":"centers a mobile menu on its trigger and flips above the last row","duration":3.5837999999999965,"failureMessages":[],"meta":{}},{"ancestorTitles":["AccountActionMenu viewport positioning"],"fullName":"AccountActionMenu viewport positioning keeps mobile menus within the horizontal margins at x=0","status":"passed","title":"keeps mobile menus within the horizontal margins at x=0","duration":2.981899999999996,"failureMessages":[],"meta":{}},{"ancestorTitles":["AccountActionMenu viewport positioning"],"fullName":"AccountActionMenu viewport positioning keeps mobile menus within the horizontal margins at x=370","status":"passed","title":"keeps mobile menus within the horizontal margins at x=370","duration":2.9184000000000196,"failureMessages":[],"meta":{}},{"ancestorTitles":["AccountActionMenu viewport positioning"],"fullName":"AccountActionMenu viewport positioning constrains an oversized menu and preserves the recover-state action","status":"passed","title":"constrains an oversized menu and preserves the recover-state action","duration":4.482200000000034,"failureMessages":[],"meta":{}},{"ancestorTitles":["AccountActionMenu viewport positioning"],"fullName":"AccountActionMenu viewport positioning repositions when menu content grows","status":"passed","title":"repositions when menu content grows","duration":2.7031999999999243,"failureMessages":[],"meta":{}},{"ancestorTitles":["AccountActionMenu viewport positioning"],"fullName":"AccountActionMenu viewport positioning repositions and updates size limits after a viewport resize","status":"passed","title":"repositions and updates size limits after a viewport resize","duration":2.9577000000000453,"failureMessages":[],"meta":{}},{"ancestorTitles":["AccountActionMenu viewport positioning"],"fullName":"AccountActionMenu viewport positioning remeasures after reopening on another row","status":"passed","title":"remeasures after reopening on another row","duration":5.072900000000004,"failureMessages":[],"meta":{}},{"ancestorTitles":["AccountActionMenu viewport positioning"],"fullName":"AccountActionMenu viewport positioning still closes on Escape and backdrop clicks","status":"passed","title":"still closes on Escape and backdrop clicks","duration":2.917599999999993,"failureMessages":[],"meta":{}}],"startTime":1789442788551,"endTime":1789442788606.9175,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/components/admin/account/__tests__/AccountActionMenu.position.spec.ts"},{"assertionResults":[{"ancestorTitles":["AccountActionMenu — spark shadow 按钮可见性"],"fullName":"AccountActionMenu — spark shadow 按钮可见性 普通账号显示「复制账号」按钮","status":"passed","title":"普通账号显示「复制账号」按钮","duration":19.54290000000003,"failureMessages":[],"meta":{}},{"ancestorTitles":["AccountActionMenu — spark shadow 按钮可见性"],"fullName":"AccountActionMenu — spark shadow 按钮可见性 影子账号隐藏「复制账号」按钮","status":"passed","title":"影子账号隐藏「复制账号」按钮","duration":2.9734999999999445,"failureMessages":[],"meta":{}},{"ancestorTitles":["AccountActionMenu — spark shadow 按钮可见性"],"fullName":"AccountActionMenu — spark shadow 按钮可见性 oauth 账号隐藏「复制账号」按钮,避免共享可轮换令牌","status":"passed","title":"oauth 账号隐藏「复制账号」按钮,避免共享可轮换令牌","duration":2.877899999999954,"failureMessages":[],"meta":{}},{"ancestorTitles":["AccountActionMenu — spark shadow 按钮可见性"],"fullName":"AccountActionMenu — spark shadow 按钮可见性 setup-token 账号隐藏「复制账号」按钮,避免共享可轮换令牌","status":"passed","title":"setup-token 账号隐藏「复制账号」按钮,避免共享可轮换令牌","duration":2.2048999999999523,"failureMessages":[],"meta":{}},{"ancestorTitles":["AccountActionMenu — spark shadow 按钮可见性"],"fullName":"AccountActionMenu — spark shadow 按钮可见性 点击「复制账号」触发 duplicate 事件并携带 account","status":"passed","title":"点击「复制账号」触发 duplicate 事件并携带 account","duration":4.691299999999956,"failureMessages":[],"meta":{}},{"ancestorTitles":["AccountActionMenu — spark shadow 按钮可见性"],"fullName":"AccountActionMenu — spark shadow 按钮可见性 OpenAI OAuth 母账号(无 parent_account_id)显示「创建 spark 影子」按钮","status":"passed","title":"OpenAI OAuth 母账号(无 parent_account_id)显示「创建 spark 影子」按钮","duration":2.5860000000000127,"failureMessages":[],"meta":{}},{"ancestorTitles":["AccountActionMenu — spark shadow 按钮可见性"],"fullName":"AccountActionMenu — spark shadow 按钮可见性 影子账号(parent_account_id 非 null)隐藏「创建 spark 影子」按钮","status":"passed","title":"影子账号(parent_account_id 非 null)隐藏「创建 spark 影子」按钮","duration":1.623199999999997,"failureMessages":[],"meta":{}},{"ancestorTitles":["AccountActionMenu — spark shadow 按钮可见性"],"fullName":"AccountActionMenu — spark shadow 按钮可见性 非 OpenAI 账号隐藏「创建 spark 影子」按钮","status":"passed","title":"非 OpenAI 账号隐藏「创建 spark 影子」按钮","duration":2.064200000000028,"failureMessages":[],"meta":{}},{"ancestorTitles":["AccountActionMenu — spark shadow 按钮可见性"],"fullName":"AccountActionMenu — spark shadow 按钮可见性 影子账号隐藏凭据/隐私类操作(重授权/刷新token/隐私)— 外审 G4","status":"passed","title":"影子账号隐藏凭据/隐私类操作(重授权/刷新token/隐私)— 外审 G4","duration":1.8062999999999647,"failureMessages":[],"meta":{}},{"ancestorTitles":["AccountActionMenu — spark shadow 按钮可见性"],"fullName":"AccountActionMenu — spark shadow 按钮可见性 普通 OpenAI OAuth 母账号仍显示凭据/隐私类操作","status":"passed","title":"普通 OpenAI OAuth 母账号仍显示凭据/隐私类操作","duration":2.349399999999946,"failureMessages":[],"meta":{}},{"ancestorTitles":["AccountActionMenu — spark shadow 按钮可见性"],"fullName":"AccountActionMenu — spark shadow 按钮可见性 点击按钮触发 create-spark-shadow 事件并携带 account","status":"passed","title":"点击按钮触发 create-spark-shadow 事件并携带 account","duration":2.8829999999999245,"failureMessages":[],"meta":{}}],"startTime":1789442785191,"endTime":1789442785236.883,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/components/admin/account/__tests__/AccountActionMenu.spark_shadow.spec.ts"},{"assertionResults":[{"ancestorTitles":["AccountBulkActionsBar"],"fullName":"AccountBulkActionsBar allows selecting all results before any row is selected","status":"passed","title":"allows selecting all results before any row is selected","duration":13.737899999999968,"failureMessages":[],"meta":{}},{"ancestorTitles":["AccountBulkActionsBar"],"fullName":"AccountBulkActionsBar preserves the upstream billing probe action from v0.1.166","status":"passed","title":"preserves the upstream billing probe action from v0.1.166","duration":2.375,"failureMessages":[],"meta":{}}],"startTime":1789442817037,"endTime":1789442817053.375,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/components/admin/account/__tests__/AccountBulkActionsBar.spec.ts"},{"assertionResults":[{"ancestorTitles":["AccountTestModal"],"fullName":"AccountTestModal gemini 图片模型测试会携带提示词并渲染图片预览","status":"passed","title":"gemini 图片模型测试会携带提示词并渲染图片预览","duration":43.325399999999945,"failureMessages":[],"meta":{}},{"ancestorTitles":["AccountTestModal"],"fullName":"AccountTestModal grok 账号测试默认选择 Grok 模型","status":"passed","title":"grok 账号测试默认选择 Grok 模型","duration":8.673000000000002,"failureMessages":[],"meta":{}},{"ancestorTitles":["AccountTestModal"],"fullName":"AccountTestModal OpenAI Compact 探测会携带 compact 测试模式","status":"passed","title":"OpenAI Compact 探测会携带 compact 测试模式","duration":5.403800000000047,"failureMessages":[],"meta":{}}],"startTime":1789442783976,"endTime":1789442784033.4038,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/components/admin/account/__tests__/AccountTestModal.spec.ts"},{"assertionResults":[{"ancestorTitles":["ReAuthAccountModal Grok re-auth paths"],"fullName":"ReAuthAccountModal Grok re-auth paths exposes SSO cookie and refresh-token options; password auth stays hidden","status":"passed","title":"exposes SSO cookie and refresh-token options; password auth stays hidden","duration":0.7997000000000298,"failureMessages":[],"meta":{}},{"ancestorTitles":["ReAuthAccountModal Grok re-auth paths"],"fullName":"ReAuthAccountModal Grok re-auth paths wires SSO and RT reauth without batch account create","status":"passed","title":"wires SSO and RT reauth without batch account create","duration":0.22909999999990305,"failureMessages":[],"meta":{}},{"ancestorTitles":["ReAuthAccountModal Grok re-auth paths"],"fullName":"ReAuthAccountModal Grok re-auth paths hides footer code-exchange button for SSO/RT input methods","status":"passed","title":"hides footer code-exchange button for SSO/RT input methods","duration":0.09130000000004657,"failureMessages":[],"meta":{}},{"ancestorTitles":["ReAuthAccountModal Grok re-auth paths"],"fullName":"ReAuthAccountModal Grok re-auth paths defaults reauth to refresh_token or sso_cookie (not password)","status":"passed","title":"defaults reauth to refresh_token or sso_cookie (not password)","duration":0.13350000000002638,"failureMessages":[],"meta":{}}],"startTime":1789442811636,"endTime":1789442811637.1335,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/components/admin/account/__tests__/ReAuthAccountModal.grok.spec.ts"},{"assertionResults":[{"ancestorTitles":["PricingEntryCard time pricing visibility"],"fullName":"PricingEntryCard time pricing visibility is hidden by default","status":"passed","title":"is hidden by default","duration":14.197999999999979,"failureMessages":[],"meta":{}},{"ancestorTitles":["PricingEntryCard time pricing visibility"],"fullName":"PricingEntryCard time pricing visibility is shown for token pricing when explicitly enabled","status":"passed","title":"is shown for token pricing when explicitly enabled","duration":3.468399999999974,"failureMessages":[],"meta":{}},{"ancestorTitles":["PricingEntryCard time pricing visibility"],"fullName":"PricingEntryCard time pricing visibility is hidden for non-token pricing even when explicitly enabled","status":"passed","title":"is hidden for non-token pricing even when explicitly enabled","duration":2.0062000000000353,"failureMessages":[],"meta":{}},{"ancestorTitles":["PricingEntryCard time pricing visibility"],"fullName":"PricingEntryCard time pricing visibility clears time periods when changing billing mode","status":"passed","title":"clears time periods when changing billing mode","duration":3.399400000000014,"failureMessages":[],"meta":{}},{"ancestorTitles":["PricingEntryCard request multipliers"],"fullName":"PricingEntryCard request multipliers shows Fast, Flex, and Max effort controls only when explicitly enabled","status":"passed","title":"shows Fast, Flex, and Max effort controls only when explicitly enabled","duration":5.380700000000047,"failureMessages":[],"meta":{}}],"startTime":1789442799293,"endTime":1789442799321.3806,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/components/admin/channel/__tests__/PricingEntryCard.timePricing.spec.ts"},{"assertionResults":[{"ancestorTitles":["TimePricingSection"],"fullName":"TimePricingSection offers every-day and weekdays-only scopes","status":"passed","title":"offers every-day and weekdays-only scopes","duration":33.01679999999999,"failureMessages":[],"meta":{}},{"ancestorTitles":["TimePricingSection"],"fullName":"TimePricingSection adds a neutral period immutably","status":"passed","title":"adds a neutral period immutably","duration":8.749699999999962,"failureMessages":[],"meta":{}},{"ancestorTitles":["TimePricingSection"],"fullName":"TimePricingSection removes without mutating props","status":"passed","title":"removes without mutating props","duration":6.7327000000000226,"failureMessages":[],"meta":{}},{"ancestorTitles":["TimePricingSection"],"fullName":"TimePricingSection uses locale-independent 24-hour second inputs","status":"passed","title":"uses locale-independent 24-hour second inputs","duration":4.307800000000043,"failureMessages":[],"meta":{}},{"ancestorTitles":["TimePricingSection"],"fullName":"TimePricingSection updates the timezone and normalizes full-width colons immutably","status":"passed","title":"updates the timezone and normalizes full-width colons immutably","duration":5.5651000000000295,"failureMessages":[],"meta":{}},{"ancestorTitles":["TimePricingSection"],"fullName":"TimePricingSection normalizes 24:00:00 to 00:00:00","status":"passed","title":"normalizes 24:00:00 to 00:00:00","duration":6.972100000000069,"failureMessages":[],"meta":{}},{"ancestorTitles":["TimePricingSection"],"fullName":"TimePricingSection formats only a valid positive multiplier on blur","status":"passed","title":"formats only a valid positive multiplier on blur","duration":3.7069000000000187,"failureMessages":[],"meta":{}},{"ancestorTitles":["TimePricingSection"],"fullName":"TimePricingSection keeps invalid multiplier 1.234 unchanged on blur","status":"passed","title":"keeps invalid multiplier 1.234 unchanged on blur","duration":3.1666000000000167,"failureMessages":[],"meta":{}},{"ancestorTitles":["TimePricingSection"],"fullName":"TimePricingSection keeps invalid multiplier 1e2 unchanged on blur","status":"passed","title":"keeps invalid multiplier 1e2 unchanged on blur","duration":4.122799999999984,"failureMessages":[],"meta":{}},{"ancestorTitles":["TimePricingSection"],"fullName":"TimePricingSection keeps invalid multiplier .5 unchanged on blur","status":"passed","title":"keeps invalid multiplier .5 unchanged on blur","duration":3.4002000000000407,"failureMessages":[],"meta":{}},{"ancestorTitles":["TimePricingSection"],"fullName":"TimePricingSection uses unique input ids across component instances","status":"passed","title":"uses unique input ids across component instances","duration":10.870900000000006,"failureMessages":[],"meta":{}}],"startTime":1789442780863,"endTime":1789442780952.8708,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/components/admin/channel/__tests__/TimePricingSection.spec.ts"},{"assertionResults":[{"ancestorTitles":["interval multiplier conversion"],"fullName":"interval multiplier conversion preserves component multipliers without MTok conversion","status":"passed","title":"preserves component multipliers without MTok conversion","duration":2.7573999999999614,"failureMessages":[],"meta":{}},{"ancestorTitles":["positive multiplier validation"],"fullName":"positive multiplier validation accepts empty and positive values but rejects zero and negative values","status":"passed","title":"accepts empty and positive values but rejects zero and negative values","duration":0.4218999999998232,"failureMessages":[],"meta":{}},{"ancestorTitles":["positive multiplier validation"],"fullName":"positive multiplier validation rejects a zero interval multiplier","status":"passed","title":"rejects a zero interval multiplier","duration":0.6059999999999945,"failureMessages":[],"meta":{}},{"ancestorTitles":["validateIntervals","token mode"],"fullName":"validateIntervals token mode rejects unbounded interval that is not last","status":"passed","title":"rejects unbounded interval that is not last","duration":0.4018999999998414,"failureMessages":[],"meta":{}},{"ancestorTitles":["validateIntervals","token mode"],"fullName":"validateIntervals token mode accepts unbounded interval at the end","status":"passed","title":"accepts unbounded interval at the end","duration":0.2761000000000422,"failureMessages":[],"meta":{}},{"ancestorTitles":["validateIntervals","token mode"],"fullName":"validateIntervals token mode rejects overlapping intervals","status":"passed","title":"rejects overlapping intervals","duration":0.2822999999998501,"failureMessages":[],"meta":{}},{"ancestorTitles":["validateIntervals","token mode"],"fullName":"validateIntervals token mode rejects unbounded interval in token mode","status":"passed","title":"rejects unbounded interval in token mode","duration":0.23440000000005057,"failureMessages":[],"meta":{}},{"ancestorTitles":["validateIntervals","image / per_request mode"],"fullName":"validateIntervals image / per_request mode allows multiple unbounded tiers identified by label","status":"passed","title":"allows multiple unbounded tiers identified by label","duration":0.25710000000003674,"failureMessages":[],"meta":{}},{"ancestorTitles":["validateIntervals","image / per_request mode"],"fullName":"validateIntervals image / per_request mode still rejects negative prices","status":"passed","title":"still rejects negative prices","duration":0.22880000000009204,"failureMessages":[],"meta":{}},{"ancestorTitles":["validateIntervals","image / per_request mode"],"fullName":"validateIntervals image / per_request mode still rejects max <= min on a single tier","status":"passed","title":"still rejects max <= min on a single tier","duration":0.22049999999990177,"failureMessages":[],"meta":{}},{"ancestorTitles":["time pricing"],"fullName":"time pricing uses a disabled Shanghai default","status":"passed","title":"uses a disabled Shanghai default","duration":0.4796999999998661,"failureMessages":[],"meta":{}},{"ancestorTitles":["time pricing"],"fullName":"time pricing defaults missing API day scope to every day","status":"passed","title":"defaults missing API day scope to every day","duration":0.2807000000000244,"failureMessages":[],"meta":{}},{"ancestorTitles":["time pricing"],"fullName":"time pricing round-trips day scope and formats multiplier","status":"passed","title":"round-trips day scope and formats multiplier","duration":0.4535999999998239,"failureMessages":[],"meta":{}},{"ancestorTitles":["time pricing"],"fullName":"time pricing separated","status":"passed","title":"separated","duration":20.99420000000009,"failureMessages":[],"meta":{}},{"ancestorTitles":["time pricing"],"fullName":"time pricing adjacent","status":"passed","title":"adjacent","duration":0.3430999999998221,"failureMessages":[],"meta":{}},{"ancestorTitles":["time pricing"],"fullName":"time pricing midnight split","status":"passed","title":"midnight split","duration":0.28890000000001237,"failureMessages":[],"meta":{}},{"ancestorTitles":["time pricing"],"fullName":"time pricing overlap by one second","status":"passed","title":"overlap by one second","duration":0.3126999999999498,"failureMessages":[],"meta":{}},{"ancestorTitles":["time pricing"],"fullName":"time pricing cross midnight","status":"passed","title":"cross midnight","duration":0.3552999999999429,"failureMessages":[],"meta":{}},{"ancestorTitles":["time pricing"],"fullName":"time pricing equal midnight","status":"passed","title":"equal midnight","duration":0.24240000000008877,"failureMessages":[],"meta":{}},{"ancestorTitles":["time pricing"],"fullName":"time pricing missing seconds","status":"passed","title":"missing seconds","duration":0.2477000000001226,"failureMessages":[],"meta":{}},{"ancestorTitles":["time pricing"],"fullName":"time pricing zero","status":"passed","title":"zero","duration":0.23550000000000182,"failureMessages":[],"meta":{}},{"ancestorTitles":["time pricing"],"fullName":"time pricing three decimals","status":"passed","title":"three decimals","duration":0.22220000000015716,"failureMessages":[],"meta":{}},{"ancestorTitles":["time pricing"],"fullName":"time pricing rejects non-IANA timezone","status":"passed","title":"rejects non-IANA timezone","duration":0.2436999999999898,"failureMessages":[],"meta":{}},{"ancestorTitles":["time pricing"],"fullName":"time pricing rejects a missing timezone without throwing during conversion","status":"passed","title":"rejects a missing timezone without throwing during conversion","duration":1.0122999999998683,"failureMessages":[],"meta":{}},{"ancestorTitles":["time pricing"],"fullName":"time pricing rejects a blank timezone without throwing during conversion","status":"passed","title":"rejects a blank timezone without throwing during conversion","duration":0.24559999999996762,"failureMessages":[],"meta":{}}],"startTime":1789442778048,"endTime":1789442778080.2456,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/components/admin/channel/__tests__/types.spec.ts"},{"assertionResults":[{"ancestorTitles":["optional group detail statistics"],"fullName":"optional group detail statistics does not request statistics while closed and keeps the three cost bases separate","status":"passed","title":"does not request statistics while closed and keeps the three cost bases separate","duration":32.484500000000025,"failureMessages":[],"meta":{}},{"ancestorTitles":["optional group detail statistics"],"fullName":"optional group detail statistics does not let the previous group overwrite a newly selected group","status":"passed","title":"does not let the previous group overwrite a newly selected group","duration":6.015999999999963,"failureMessages":[],"meta":{}}],"startTime":1789442806550,"endTime":1789442806589.016,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/components/admin/groups/__tests__/GroupStatisticsDialog.spec.ts"},{"assertionResults":[{"ancestorTitles":["MonitorPrimaryModelCell placeholder model display"],"fullName":"MonitorPrimaryModelCell placeholder model display replaces the quota placeholder with the localized mode label","status":"passed","title":"replaces the quota placeholder with the localized mode label","duration":17.331999999999994,"failureMessages":[],"meta":{}},{"ancestorTitles":["MonitorPrimaryModelCell placeholder model display"],"fullName":"MonitorPrimaryModelCell placeholder model display keeps the real model for quota_probe and probe rows","status":"passed","title":"keeps the real model for quota_probe and probe rows","duration":2.3630000000000564,"failureMessages":[],"meta":{}}],"startTime":1789442809195,"endTime":1789442809214.363,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/components/admin/monitor/__tests__/MonitorPrimaryModelCell.spec.ts"},{"assertionResults":[{"ancestorTitles":["admin order currency display"],"fullName":"admin order currency display uses order currency for paid/base/fee amounts and USD for credited/refund amounts","status":"passed","title":"uses order currency for paid/base/fee amounts and USD for credited/refund amounts","duration":24.801900000000046,"failureMessages":[],"meta":{}},{"ancestorTitles":["admin order currency display"],"fullName":"admin order currency display uses order currency for pay_amount and USD for refundable balance amounts","status":"passed","title":"uses order currency for pay_amount and USD for refundable balance amounts","duration":5.057399999999916,"failureMessages":[],"meta":{}},{"ancestorTitles":["admin order currency display"],"fullName":"admin order currency display renders payment currency consistently in the shared order table","status":"passed","title":"renders payment currency consistently in the shared order table","duration":3.2350000000000136,"failureMessages":[],"meta":{}},{"ancestorTitles":["admin order currency display"],"fullName":"admin order currency display renders payment currency consistently in the admin order table","status":"passed","title":"renders payment currency consistently in the admin order table","duration":4.4541000000000395,"failureMessages":[],"meta":{}}],"startTime":1789442793483,"endTime":1789442793521.454,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/components/admin/payment/__tests__/orderCurrencyDisplay.spec.ts"},{"assertionResults":[{"ancestorTitles":["model-generated image isolation"],"fullName":"model-generated image isolation loads a historical image with authorization, ignores stale results and revokes object URLs","status":"passed","title":"loads a historical image with authorization, ignores stale results and revokes object URLs","duration":39.00420000000008,"failureMessages":[],"meta":{}},{"ancestorTitles":["model-generated image isolation"],"fullName":"model-generated image isolation rejects an image endpoint response with an unexpected content type","status":"passed","title":"rejects an image endpoint response with an unexpected content type","duration":5.237800000000107,"failureMessages":[],"meta":{}},{"ancestorTitles":["model-generated image isolation"],"fullName":"model-generated image isolation renders shapes but removes executable and external content","status":"passed","title":"renders shapes but removes executable and external content","duration":14.466899999999896,"failureMessages":[],"meta":{}},{"ancestorTitles":["model-generated image isolation"],"fullName":"model-generated image isolation rejects arbitrary URLs, HTML and oversized output","status":"passed","title":"rejects arbitrary URLs, HTML and oversized output","duration":0.4511999999999716,"failureMessages":[],"meta":{}},{"ancestorTitles":["asynchronous quick tests"],"fullName":"asynchronous quick tests changes the retry key when the selected model changes and filters media models","status":"passed","title":"changes the retry key when the selected model changes and filters media models","duration":31.5954999999999,"failureMessages":[],"meta":{}},{"ancestorTitles":["asynchronous quick tests"],"fullName":"asynchronous quick tests only submits enabled types and prevents concurrent submission","status":"passed","title":"only submits enabled types and prevents concurrent submission","duration":5.556600000000117,"failureMessages":[],"meta":{}},{"ancestorTitles":["asynchronous quick tests"],"fullName":"asynchronous quick tests reuses the submission key after a network error","status":"passed","title":"reuses the submission key after a network error","duration":6.864799999999832,"failureMessages":[],"meta":{}},{"ancestorTitles":["asynchronous quick tests"],"fullName":"asynchronous quick tests submits the administrator-selected model override","status":"passed","title":"submits the administrator-selected model override","duration":6.589899999999943,"failureMessages":[],"meta":{}},{"ancestorTitles":["independent settings and persisted status"],"fullName":"independent settings and persisted status saves an explicit no-unit rule instead of silently inferring the candy unit","status":"passed","title":"saves an explicit no-unit rule instead of silently inferring the candy unit","duration":27.425300000000107,"failureMessages":[],"meta":{}},{"ancestorTitles":["independent settings and persisted status"],"fullName":"independent settings and persisted status can re-evaluate an earlier B record with the corrected version and preserve its judgment","status":"passed","title":"can re-evaluate an earlier B record with the corrected version and preserve its judgment","duration":34.01839999999993,"failureMessages":[],"meta":{}},{"ancestorTitles":["independent settings and persisted status"],"fullName":"independent settings and persisted status does not let a late queued response overwrite a successful cancellation","status":"passed","title":"does not let a late queued response overwrite a successful cancellation","duration":15.251599999999826,"failureMessages":[],"meta":{}},{"ancestorTitles":["independent settings and persisted status"],"fullName":"independent settings and persisted status preserves a dirty settings draft when another setting is refreshed","status":"passed","title":"preserves a dirty settings draft when another setting is refreshed","duration":20.50480000000016,"failureMessages":[],"meta":{}},{"ancestorTitles":["independent settings and persisted status"],"fullName":"independent settings and persisted status renders the generated pelican while a new attempt waits and keeps B verdicts distinct","status":"passed","title":"renders the generated pelican while a new attempt waits and keeps B verdicts distinct","duration":11.668100000000095,"failureMessages":[],"meta":{}},{"ancestorTitles":["independent settings and persisted status"],"fullName":"independent settings and persisted status shows a correct answer independently of a format difference and preserves original judgment","status":"passed","title":"shows a correct answer independently of a format difference and preserves original judgment","duration":12.085599999999886,"failureMessages":[],"meta":{}},{"ancestorTitles":["independent settings and persisted status"],"fullName":"independent settings and persisted status locks the submitted form and acknowledges only its submission snapshot","status":"passed","title":"locks the submitted form and acknowledges only its submission snapshot","duration":16.389499999999998,"failureMessages":[],"meta":{}},{"ancestorTitles":["independent settings and persisted status"],"fullName":"independent settings and persisted status keeps enabled and user-visible independent and never mutates incoming settings","status":"passed","title":"keeps enabled and user-visible independent and never mutates incoming settings","duration":28.158699999999953,"failureMessages":[],"meta":{}},{"ancestorTitles":["independent settings and persisted status"],"fullName":"independent settings and persisted status shows persisted running elapsed time, disables retry and includes risk","status":"passed","title":"shows persisted running elapsed time, disables retry and includes risk","duration":4.143399999999929,"failureMessages":[],"meta":{}},{"ancestorTitles":["ordinary-user visibility"],"fullName":"ordinary-user visibility finishes slow public polling without replacing the request every five seconds","status":"passed","title":"finishes slow public polling without replacing the request every five seconds","duration":7.1112000000000535,"failureMessages":[],"meta":{}},{"ancestorTitles":["ordinary-user visibility"],"fullName":"ordinary-user visibility renders no module when the server exposes no tests","status":"passed","title":"renders no module when the server exposes no tests","duration":1.2170000000000982,"failureMessages":[],"meta":{}},{"ancestorTitles":["ordinary-user visibility"],"fullName":"ordinary-user visibility public detail never includes admin actions or raw data","status":"passed","title":"public detail never includes admin actions or raw data","duration":5.573700000000144,"failureMessages":[],"meta":{}}],"startTime":1789442764385,"endTime":1789442764678.5737,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/components/admin/intelligent-tests/__tests__/intelligentTests.spec.ts"},{"assertionResults":[{"ancestorTitles":["UsageFilters — user search dropdown"],"fullName":"UsageFilters — user search dropdown (a) labels deleted users with the i18n badge and (b) sorts active users before deleted ones, (c) selection sets user_id","status":"passed","title":"(a) labels deleted users with the i18n badge and (b) sorts active users before deleted ones, (c) selection sets user_id","duration":32.312400000000025,"failureMessages":[],"meta":{}},{"ancestorTitles":["UsageFilters — user search dropdown"],"fullName":"UsageFilters — user search dropdown keeps results from the latest user search when responses arrive out of order","status":"passed","title":"keeps results from the latest user search when responses arrive out of order","duration":7.435900000000061,"failureMessages":[],"meta":{}},{"ancestorTitles":["UsageFilters — user search dropdown"],"fullName":"UsageFilters — user search dropdown does not restore stale user results after the search is cleared","status":"passed","title":"does not restore stale user results after the search is cleared","duration":5.469600000000014,"failureMessages":[],"meta":{}},{"ancestorTitles":["UsageFilters — model options come from prop (no dup request)"],"fullName":"UsageFilters — model options come from prop (no dup request) does not call dashboard.getModelStats on mount and renders model options from prop","status":"passed","title":"does not call dashboard.getModelStats on mount and renders model options from prop","duration":3.966699999999946,"failureMessages":[],"meta":{}},{"ancestorTitles":["UsageFilters — native compaction filter"],"fullName":"UsageFilters — native compaction filter offers only All/Compaction and emits the independent boolean filter","status":"passed","title":"offers only All/Compaction and emits the independent boolean filter","duration":7.921999999999912,"failureMessages":[],"meta":{}}],"startTime":1789442774889,"endTime":1789442774946.922,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/components/admin/usage/__tests__/UsageFilters.spec.ts"},{"assertionResults":[{"ancestorTitles":["UsageStatsCards"],"fullName":"UsageStatsCards shows cache token breakdown values","status":"passed","title":"shows cache token breakdown values","duration":21.254300000000057,"failureMessages":[],"meta":{}},{"ancestorTitles":["UsageStatsCards"],"fullName":"UsageStatsCards keeps the cache tooltip out of the layout while it is hidden","status":"passed","title":"keeps the cache tooltip out of the layout while it is hidden","duration":6.280300000000011,"failureMessages":[],"meta":{}}],"startTime":1789442804686,"endTime":1789442804713.2803,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/components/admin/usage/__tests__/UsageStatsCards.spec.ts"},{"assertionResults":[{"ancestorTitles":["admin UsageTable tooltip"],"fullName":"admin UsageTable tooltip marks only usage rows that actually applied long-context billing","status":"passed","title":"marks only usage rows that actually applied long-context billing","duration":58.899499999999875,"failureMessages":[],"meta":{}},{"ancestorTitles":["admin UsageTable tooltip"],"fullName":"admin UsageTable tooltip keeps the request type badge and adds a separate badge only for native compaction rows","status":"passed","title":"keeps the request type badge and adds a separate badge only for native compaction rows","duration":6.789199999999937,"failureMessages":[],"meta":{}},{"ancestorTitles":["admin UsageTable tooltip"],"fullName":"admin UsageTable tooltip shows service tier and billing breakdown in cost tooltip","status":"passed","title":"shows service tier and billing breakdown in cost tooltip","duration":32.70839999999998,"failureMessages":[],"meta":{}},{"ancestorTitles":["admin UsageTable tooltip"],"fullName":"admin UsageTable tooltip shows requested and upstream models separately for admin rows","status":"passed","title":"shows requested and upstream models separately for admin rows","duration":3.533200000000079,"failureMessages":[],"meta":{}},{"ancestorTitles":["admin UsageTable tooltip"],"fullName":"admin UsageTable tooltip shows requested and forwarded reasoning effort separately when they differ","status":"passed","title":"shows requested and forwarded reasoning effort separately when they differ","duration":3.064100000000053,"failureMessages":[],"meta":{}},{"ancestorTitles":["admin UsageTable tooltip"],"fullName":"admin UsageTable tooltip shows a single reasoning effort when requested matches forwarded","status":"passed","title":"shows a single reasoning effort when requested matches forwarded","duration":3.2192999999999756,"failureMessages":[],"meta":{}},{"ancestorTitles":["admin UsageTable tooltip"],"fullName":"admin UsageTable tooltip hides mapped reasoning effort for user rows that only have the requested value","status":"passed","title":"hides mapped reasoning effort for user rows that only have the requested value","duration":2.7932999999998174,"failureMessages":[],"meta":{}},{"ancestorTitles":["admin UsageTable tooltip"],"fullName":"admin UsageTable tooltip shows a compact upstream response audit marker for 'possible version variant'","status":"passed","title":"shows a compact upstream response audit marker for 'possible version variant'","duration":4.720399999999927,"failureMessages":[],"meta":{}},{"ancestorTitles":["admin UsageTable tooltip"],"fullName":"admin UsageTable tooltip shows a compact upstream response audit marker for 'different upstream model'","status":"passed","title":"shows a compact upstream response audit marker for 'different upstream model'","duration":4.142000000000053,"failureMessages":[],"meta":{}},{"ancestorTitles":["admin UsageTable tooltip"],"fullName":"admin UsageTable tooltip shows image usage metadata for 'defaulted row'","status":"passed","title":"shows image usage metadata for 'defaulted row'","duration":5.089799999999968,"failureMessages":[],"meta":{}},{"ancestorTitles":["admin UsageTable tooltip"],"fullName":"admin UsageTable tooltip shows image usage metadata for 'output-sourced row'","status":"passed","title":"shows image usage metadata for 'output-sourced row'","duration":6.266499999999951,"failureMessages":[],"meta":{}},{"ancestorTitles":["admin UsageTable tooltip"],"fullName":"admin UsageTable tooltip shows image usage metadata for 'input-sourced row'","status":"passed","title":"shows image usage metadata for 'input-sourced row'","duration":6.6099999999999,"failureMessages":[],"meta":{}},{"ancestorTitles":["admin UsageTable tooltip"],"fullName":"admin UsageTable tooltip shows image usage metadata for 'legacy unstandardized row'","status":"passed","title":"shows image usage metadata for 'legacy unstandardized row'","duration":5.714400000000069,"failureMessages":[],"meta":{}},{"ancestorTitles":["admin UsageTable tooltip"],"fullName":"admin UsageTable tooltip displays historical image rows with missing billing_mode as image usage without a 2K fallback","status":"passed","title":"displays historical image rows with missing billing_mode as image usage without a 2K fallback","duration":4.680499999999938,"failureMessages":[],"meta":{}},{"ancestorTitles":["admin UsageTable request ID column"],"fullName":"admin UsageTable request ID column renders and copies the request ID","status":"passed","title":"renders and copies the request ID","duration":5.328500000000076,"failureMessages":[],"meta":{}},{"ancestorTitles":["admin UsageTable request ID column"],"fullName":"admin UsageTable request ID column renders and copies the upstream ID","status":"passed","title":"renders and copies the upstream ID","duration":4.438200000000052,"failureMessages":[],"meta":{}},{"ancestorTitles":["admin UsageTable IP geolocation batch toolbar"],"fullName":"admin UsageTable IP geolocation batch toolbar does not render the batch toolbar when the ip_address column is not visible","status":"passed","title":"does not render the batch toolbar when the ip_address column is not visible","duration":3.2323999999998705,"failureMessages":[],"meta":{}},{"ancestorTitles":["admin UsageTable IP geolocation batch toolbar"],"fullName":"admin UsageTable IP geolocation batch toolbar renders the batch toolbar with a pending count when the ip_address column is visible","status":"passed","title":"renders the batch toolbar with a pending count when the ip_address column is visible","duration":2.377999999999929,"failureMessages":[],"meta":{}},{"ancestorTitles":["admin UsageTable IP geolocation batch toolbar"],"fullName":"admin UsageTable IP geolocation batch toolbar fetches deduplicated IPs from the current page when the batch button is clicked","status":"passed","title":"fetches deduplicated IPs from the current page when the batch button is clicked","duration":3.102200000000039,"failureMessages":[],"meta":{}},{"ancestorTitles":["admin UsageTable IP geolocation batch toolbar"],"fullName":"admin UsageTable IP geolocation batch toolbar emits ipGeoBatchFailed when the batch request reports a network-level failure","status":"passed","title":"emits ipGeoBatchFailed when the batch request reports a network-level failure","duration":2.8051000000000386,"failureMessages":[],"meta":{}},{"ancestorTitles":["admin UsageTable IP geolocation batch toolbar"],"fullName":"admin UsageTable IP geolocation batch toolbar renders IpGeoCell content for ip_address cells","status":"passed","title":"renders IpGeoCell content for ip_address cells","duration":2.0842999999999847,"failureMessages":[],"meta":{}},{"ancestorTitles":["admin UsageTable deleted-user badge"],"fullName":"admin UsageTable deleted-user badge renders deleted badge for a soft-deleted user row","status":"passed","title":"renders deleted badge for a soft-deleted user row","duration":2.9429000000000087,"failureMessages":[],"meta":{}},{"ancestorTitles":["admin UsageTable deleted-user badge"],"fullName":"admin UsageTable deleted-user badge does NOT render deleted badge for an active user row","status":"passed","title":"does NOT render deleted badge for an active user row","duration":7.815399999999954,"failureMessages":[],"meta":{}}],"startTime":1789442761225,"endTime":1789442761407.8154,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/components/admin/usage/__tests__/UsageTable.spec.ts"},{"assertionResults":[{"ancestorTitles":["UserTokenRanking"],"fullName":"UserTokenRanking loads on mount with shared filters and emits select-user with id + email on row click","status":"passed","title":"loads on mount with shared filters and emits select-user with id + email on row click","duration":32.23759999999993,"failureMessages":[],"meta":{}},{"ancestorTitles":["UserTokenRanking"],"fullName":"UserTokenRanking reloads when shared filters change","status":"passed","title":"reloads when shared filters change","duration":5.273900000000026,"failureMessages":[],"meta":{}}],"startTime":1789442807819,"endTime":1789442807856.274,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/components/admin/usage/__tests__/UserTokenRanking.spec.ts"},{"assertionResults":[{"ancestorTitles":["BulkEditUserModal"],"fullName":"BulkEditUserModal disables submission until at least one enabled field has a value","status":"passed","title":"disables submission until at least one enabled field has a value","duration":25.089699999999993,"failureMessages":[],"meta":{}},{"ancestorTitles":["BulkEditUserModal"],"fullName":"BulkEditUserModal disables submission when more than 500 users are selected","status":"passed","title":"disables submission when more than 500 users are selected","duration":3.9932999999999765,"failureMessages":[],"meta":{}},{"ancestorTitles":["BulkEditUserModal"],"fullName":"BulkEditUserModal submits only the enabled RPM field and preserves zero as unlimited","status":"passed","title":"submits only the enabled RPM field and preserves zero as unlimited","duration":5.9336000000000695,"failureMessages":[],"meta":{}},{"ancestorTitles":["BulkEditUserModal"],"fullName":"BulkEditUserModal omits disabled fields from the request","status":"passed","title":"omits disabled fields from the request","duration":3.231100000000083,"failureMessages":[],"meta":{}},{"ancestorTitles":["BulkEditUserModal"],"fullName":"BulkEditUserModal does not call the API when overwrite confirmation is cancelled","status":"passed","title":"does not call the API when overwrite confirmation is cancelled","duration":2.637399999999957,"failureMessages":[],"meta":{}}],"startTime":1789442793323,"endTime":1789442793363.6375,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/components/admin/user/__tests__/BulkEditUserModal.spec.ts"},{"assertionResults":[{"ancestorTitles":["UserCleanupControl"],"fullName":"UserCleanupControl only previews on opening and requires a second explicit confirmation","status":"passed","title":"only previews on opening and requires a second explicit confirmation","duration":33.08750000000009,"failureMessages":[],"meta":{}},{"ancestorTitles":["UserCleanupControl"],"fullName":"UserCleanupControl shows structured expiry errors and requires a fresh preview instead of retrying deletion","status":"passed","title":"shows structured expiry errors and requires a fresh preview instead of retrying deletion","duration":6.99350000000004,"failureMessages":[],"meta":{}},{"ancestorTitles":["UserCleanupControl"],"fullName":"UserCleanupControl cancels without deletion and never submits twice while pending","status":"passed","title":"cancels without deletion and never submits twice while pending","duration":5.618799999999965,"failureMessages":[],"meta":{}},{"ancestorTitles":["UserCleanupControl"],"fullName":"UserCleanupControl keeps the same immutable preview on a network error for safe retry","status":"passed","title":"keeps the same immutable preview on a network error for safe retry","duration":4.700500000000034,"failureMessages":[],"meta":{}},{"ancestorTitles":["UserCleanupControl"],"fullName":"UserCleanupControl re-previews and clears confirmation after retaining a candidate","status":"passed","title":"re-previews and clears confirmation after retaining a candidate","duration":6.579600000000028,"failureMessages":[],"meta":{}},{"ancestorTitles":["UserCleanupControl"],"fullName":"UserCleanupControl does not offer execution when preview cannot be obtained","status":"passed","title":"does not offer execution when preview cannot be obtained","duration":2.425399999999968,"failureMessages":[],"meta":{}}],"startTime":1789442782958,"endTime":1789442783017.4253,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/components/admin/user/__tests__/UserCleanupControl.spec.ts"},{"assertionResults":[{"ancestorTitles":["UserCleanupGuard"],"fullName":"UserCleanupGuard requires confirmation before removing protection","status":"passed","title":"requires confirmation before removing protection","duration":20.518100000000004,"failureMessages":[],"meta":{}},{"ancestorTitles":["UserCleanupGuard"],"fullName":"UserCleanupGuard hides system controls from ordinary administrators","status":"passed","title":"hides system controls from ordinary administrators","duration":2.6055999999999813,"failureMessages":[],"meta":{}},{"ancestorTitles":["UserCleanupGuard"],"fullName":"UserCleanupGuard does not fetch or expose editable protection for administrator roles","status":"passed","title":"does not fetch or expose editable protection for administrator roles","duration":0.7189999999999372,"failureMessages":[],"meta":{}},{"ancestorTitles":["UserCleanupGuard"],"fullName":"UserCleanupGuard does not assume unprotected when loading fails","status":"passed","title":"does not assume unprotected when loading fails","duration":1.4067000000000007,"failureMessages":[],"meta":{}}],"startTime":1789442809142,"endTime":1789442809167.4067,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/components/admin/user/__tests__/UserCleanupGuard.spec.ts"},{"assertionResults":[{"ancestorTitles":["UserEditModal concurrency"],"fullName":"UserEditModal concurrency saves an unlimited (0) concurrency instead of blocking the whole form","status":"passed","title":"saves an unlimited (0) concurrency instead of blocking the whole form","duration":30.41629999999998,"failureMessages":[],"meta":{}},{"ancestorTitles":["UserEditModal concurrency"],"fullName":"UserEditModal concurrency still rejects a negative concurrency","status":"passed","title":"still rejects a negative concurrency","duration":5.475000000000023,"failureMessages":[],"meta":{}}],"startTime":1789442801562,"endTime":1789442801598.475,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/components/admin/user/__tests__/UserEditModal.spec.ts"},{"assertionResults":[{"ancestorTitles":["UserPlatformQuotaModal"],"fullName":"UserPlatformQuotaModal 挂载并 show=true 时调用 getPlatformQuotas","status":"passed","title":"挂载并 show=true 时调用 getPlatformQuotas","duration":48.01109999999994,"failureMessages":[],"meta":{}},{"ancestorTitles":["UserPlatformQuotaModal"],"fullName":"UserPlatformQuotaModal 空数据渲染 5 个 platform 行","status":"passed","title":"空数据渲染 5 个 platform 行","duration":21.955999999999904,"failureMessages":[],"meta":{}},{"ancestorTitles":["UserPlatformQuotaModal"],"fullName":"UserPlatformQuotaModal 已有数据正确填充 limit input","status":"passed","title":"已有数据正确填充 limit input","duration":15.520500000000084,"failureMessages":[],"meta":{}},{"ancestorTitles":["UserPlatformQuotaModal"],"fullName":"UserPlatformQuotaModal 保存提交完整 5 platform payload","status":"passed","title":"保存提交完整 5 platform payload","duration":15.607299999999896,"failureMessages":[],"meta":{}},{"ancestorTitles":["UserPlatformQuotaModal"],"fullName":"UserPlatformQuotaModal 全部清空把所有 limit 置 null(确认通过)","status":"passed","title":"全部清空把所有 limit 置 null(确认通过)","duration":11.765300000000025,"failureMessages":[],"meta":{}},{"ancestorTitles":["UserPlatformQuotaModal"],"fullName":"UserPlatformQuotaModal 全部清空 confirm 取消则保持原值","status":"passed","title":"全部清空 confirm 取消则保持原值","duration":11.346199999999953,"failureMessages":[],"meta":{}},{"ancestorTitles":["UserPlatformQuotaModal"],"fullName":"UserPlatformQuotaModal 重置按钮 confirm 取消则不调用 API","status":"passed","title":"重置按钮 confirm 取消则不调用 API","duration":8.314399999999978,"failureMessages":[],"meta":{}},{"ancestorTitles":["UserPlatformQuotaModal"],"fullName":"UserPlatformQuotaModal 重置按钮 confirm 确认则调用 API","status":"passed","title":"重置按钮 confirm 确认则调用 API","duration":9.668299999999817,"failureMessages":[],"meta":{}},{"ancestorTitles":["UserPlatformQuotaModal","subscription warning banner"],"fullName":"UserPlatformQuotaModal subscription warning banner displays subscription warning when user has active subscription","status":"passed","title":"displays subscription warning when user has active subscription","duration":8.462299999999914,"failureMessages":[],"meta":{}},{"ancestorTitles":["UserPlatformQuotaModal","subscription warning banner"],"fullName":"UserPlatformQuotaModal subscription warning banner hides subscription warning when user has only expired subscriptions","status":"passed","title":"hides subscription warning when user has only expired subscriptions","duration":4.294599999999946,"failureMessages":[],"meta":{}},{"ancestorTitles":["UserPlatformQuotaModal","subscription warning banner"],"fullName":"UserPlatformQuotaModal subscription warning banner hides subscription warning when subscriptions is empty array","status":"passed","title":"hides subscription warning when subscriptions is empty array","duration":3.2489000000000487,"failureMessages":[],"meta":{}}],"startTime":1789442776519,"endTime":1789442776677.2488,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/components/admin/user/__tests__/UserPlatformQuotaModal.spec.ts"},{"assertionResults":[{"ancestorTitles":["ProfileAvatarCard"],"fullName":"ProfileAvatarCard does not render a manual avatar input field","status":"passed","title":"does not render a manual avatar input field","duration":15.34310000000005,"failureMessages":[],"meta":{}},{"ancestorTitles":["ProfileAvatarCard"],"fullName":"ProfileAvatarCard compresses an uploaded image that exceeds the 20KB target before saving","status":"passed","title":"compresses an uploaded image that exceeds the 20KB target before saving","duration":8.366700000000037,"failureMessages":[],"meta":{}},{"ancestorTitles":["ProfileAvatarCard"],"fullName":"ProfileAvatarCard shows a preview after selecting an avatar in embedded mode","status":"passed","title":"shows a preview after selecting an avatar in embedded mode","duration":2.9727000000000317,"failureMessages":[],"meta":{}},{"ancestorTitles":["ProfileAvatarCard"],"fullName":"ProfileAvatarCard deletes the current avatar","status":"passed","title":"deletes the current avatar","duration":2.5601999999998952,"failureMessages":[],"meta":{}}],"startTime":1789442778832,"endTime":1789442778861.5603,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/components/user/profile/__tests__/ProfileAvatarCard.spec.ts"},{"assertionResults":[{"ancestorTitles":["ProfileIdentityBindingsSection"],"fullName":"ProfileIdentityBindingsSection renders provider binding states and provider-specific bind actions","status":"passed","title":"renders provider binding states and provider-specific bind actions","duration":37.063899999999876,"failureMessages":[],"meta":{}},{"ancestorTitles":["ProfileIdentityBindingsSection"],"fullName":"ProfileIdentityBindingsSection starts the WeChat bind flow for the current profile page","status":"passed","title":"starts the WeChat bind flow for the current profile page","duration":10.782500000000027,"failureMessages":[],"meta":{}},{"ancestorTitles":["ProfileIdentityBindingsSection"],"fullName":"ProfileIdentityBindingsSection hides the WeChat bind action outside the WeChat browser when only mp mode is configured","status":"passed","title":"hides the WeChat bind action outside the WeChat browser when only mp mode is configured","duration":8.278699999999844,"failureMessages":[],"meta":{}},{"ancestorTitles":["ProfileIdentityBindingsSection"],"fullName":"ProfileIdentityBindingsSection keeps the WeChat bind action visible when only the legacy aggregate setting is present","status":"passed","title":"keeps the WeChat bind action visible when only the legacy aggregate setting is present","duration":7.920100000000048,"failureMessages":[],"meta":{}},{"ancestorTitles":["ProfileIdentityBindingsSection"],"fullName":"ProfileIdentityBindingsSection starts the WeChat bind flow when only the legacy aggregate setting is present","status":"passed","title":"starts the WeChat bind flow when only the legacy aggregate setting is present","duration":4.264300000000048,"failureMessages":[],"meta":{}},{"ancestorTitles":["ProfileIdentityBindingsSection"],"fullName":"ProfileIdentityBindingsSection uses explicit cached WeChat capabilities and ignores legacy prop fallbacks","status":"passed","title":"uses explicit cached WeChat capabilities and ignores legacy prop fallbacks","duration":7.599300000000085,"failureMessages":[],"meta":{}},{"ancestorTitles":["ProfileIdentityBindingsSection"],"fullName":"ProfileIdentityBindingsSection sends email verification code and binds email from the profile card","status":"passed","title":"sends email verification code and binds email from the profile card","duration":19.98869999999988,"failureMessages":[],"meta":{}},{"ancestorTitles":["ProfileIdentityBindingsSection"],"fullName":"ProfileIdentityBindingsSection keeps the email binding form visible when the user still lacks an email identity","status":"passed","title":"keeps the email binding form visible when the user still lacks an email identity","duration":4.25630000000001,"failureMessages":[],"meta":{}},{"ancestorTitles":["ProfileIdentityBindingsSection"],"fullName":"ProfileIdentityBindingsSection does not show a synthetic oauth-only email as the bound email summary","status":"passed","title":"does not show a synthetic oauth-only email as the bound email summary","duration":5.356999999999971,"failureMessages":[],"meta":{}},{"ancestorTitles":["ProfileIdentityBindingsSection"],"fullName":"ProfileIdentityBindingsSection does not show a synthetic oauth-only email when only fallback auth bindings mark email as unbound","status":"passed","title":"does not show a synthetic oauth-only email when only fallback auth bindings mark email as unbound","duration":3.9213999999999487,"failureMessages":[],"meta":{}},{"ancestorTitles":["ProfileIdentityBindingsSection"],"fullName":"ProfileIdentityBindingsSection shows the bound email only once and localizes the email management note","status":"passed","title":"shows the bound email only once and localizes the email management note","duration":3.383199999999988,"failureMessages":[],"meta":{}},{"ancestorTitles":["ProfileIdentityBindingsSection"],"fullName":"ProfileIdentityBindingsSection keeps the email form available for replacing a bound primary email","status":"passed","title":"keeps the email form available for replacing a bound primary email","duration":10.924099999999953,"failureMessages":[],"meta":{}},{"ancestorTitles":["ProfileIdentityBindingsSection"],"fullName":"ProfileIdentityBindingsSection collapses the email binding form in compact mode until the user expands it","status":"passed","title":"collapses the email binding form in compact mode until the user expands it","duration":10.9525000000001,"failureMessages":[],"meta":{}},{"ancestorTitles":["ProfileIdentityBindingsSection"],"fullName":"ProfileIdentityBindingsSection shows third-party binding details and unbinds a connected provider","status":"passed","title":"shows third-party binding details and unbinds a connected provider","duration":7.336399999999912,"failureMessages":[],"meta":{}},{"ancestorTitles":["ProfileIdentityBindingsSection"],"fullName":"ProfileIdentityBindingsSection localizes third-party unbind guidance from note_key","status":"passed","title":"localizes third-party unbind guidance from note_key","duration":4.912900000000036,"failureMessages":[],"meta":{}},{"ancestorTitles":["ProfileIdentityBindingsSection"],"fullName":"ProfileIdentityBindingsSection hides bind actions when provider details say bindable but the provider is disabled","status":"passed","title":"hides bind actions when provider details say bindable but the provider is disabled","duration":5.548099999999977,"failureMessages":[],"meta":{}}],"startTime":1789442762840,"endTime":1789442762993.548,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/components/user/profile/__tests__/ProfileIdentityBindingsSection.spec.ts"},{"assertionResults":[{"ancestorTitles":["ProfileInfoCard"],"fullName":"ProfileInfoCard renders basic account information inside the new overview shell","status":"passed","title":"renders basic account information inside the new overview shell","duration":34.41470000000004,"failureMessages":[],"meta":{}},{"ancestorTitles":["ProfileInfoCard"],"fullName":"ProfileInfoCard renders third-party source hints from profile sources","status":"passed","title":"renders third-party source hints from profile sources","duration":6.619799999999941,"failureMessages":[],"meta":{}},{"ancestorTitles":["ProfileInfoCard"],"fullName":"ProfileInfoCard uses the configured OIDC provider name in source hints","status":"passed","title":"uses the configured OIDC provider name in source hints","duration":4.456400000000031,"failureMessages":[],"meta":{}},{"ancestorTitles":["ProfileInfoCard"],"fullName":"ProfileInfoCard does not display synthetic oauth-only emails as a real bound email","status":"passed","title":"does not display synthetic oauth-only emails as a real bound email","duration":4.23599999999999,"failureMessages":[],"meta":{}},{"ancestorTitles":["ProfileInfoCard"],"fullName":"ProfileInfoCard does not display synthetic oauth-only emails when only legacy identity bindings mark email as unbound","status":"passed","title":"does not display synthetic oauth-only emails when only legacy identity bindings mark email as unbound","duration":4.615199999999959,"failureMessages":[],"meta":{}},{"ancestorTitles":["ProfileInfoCard"],"fullName":"ProfileInfoCard renders the approved overview hero and two-column content shell","status":"passed","title":"renders the approved overview hero and two-column content shell","duration":7.062400000000025,"failureMessages":[],"meta":{}}],"startTime":1789442786573,"endTime":1789442786635.0625,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/components/user/profile/__tests__/ProfileInfoCard.spec.ts"},{"assertionResults":[{"ancestorTitles":["ProfilePasswordForm"],"fullName":"ProfilePasswordForm shows validation failures as toast messages instead of inline errors","status":"passed","title":"shows validation failures as toast messages instead of inline errors","duration":21.831699999999955,"failureMessages":[],"meta":{}},{"ancestorTitles":["ProfilePasswordForm"],"fullName":"ProfilePasswordForm shows API failures as toast messages","status":"passed","title":"shows API failures as toast messages","duration":4.2724000000000615,"failureMessages":[],"meta":{}}],"startTime":1789442801511,"endTime":1789442801537.2725,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/components/user/profile/__tests__/ProfilePasswordForm.spec.ts"},{"assertionResults":[{"ancestorTitles":["TOTP 弹窗定时器清理"],"fullName":"TOTP 弹窗定时器清理 TotpSetupModal 卸载时清理倒计时定时器","status":"passed","title":"TotpSetupModal 卸载时清理倒计时定时器","duration":17.91560000000004,"failureMessages":[],"meta":{}},{"ancestorTitles":["TOTP 弹窗定时器清理"],"fullName":"TOTP 弹窗定时器清理 TotpDisableDialog 卸载时清理倒计时定时器","status":"passed","title":"TotpDisableDialog 卸载时清理倒计时定时器","duration":3.8722000000000207,"failureMessages":[],"meta":{}},{"ancestorTitles":["TOTP 弹窗定时器清理"],"fullName":"TOTP 弹窗定时器清理 TotpSetupModal 失败时改用 toast 并不渲染内联错误","status":"passed","title":"TotpSetupModal 失败时改用 toast 并不渲染内联错误","duration":4.8256999999999834,"failureMessages":[],"meta":{}},{"ancestorTitles":["TOTP 弹窗定时器清理"],"fullName":"TOTP 弹窗定时器清理 TotpDisableDialog 失败时改用 toast 并不渲染内联错误","status":"passed","title":"TotpDisableDialog 失败时改用 toast 并不渲染内联错误","duration":2.729400000000055,"failureMessages":[],"meta":{}}],"startTime":1789442790033,"endTime":1789442790062.7295,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/components/user/profile/__tests__/totp-timer-cleanup.spec.ts"},{"assertionResults":[{"ancestorTitles":["AdminPaymentPlansView"],"fullName":"AdminPaymentPlansView uses the configured currency symbol and keeps legacy prices in USD","status":"passed","title":"uses the configured currency symbol and keeps legacy prices in USD","duration":20.087300000000027,"failureMessages":[],"meta":{}}],"startTime":1789442806108,"endTime":1789442806128.0874,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/views/admin/orders/__tests__/AdminPaymentPlansView.spec.ts"},{"assertionResults":[{"ancestorTitles":["PlanEditDialog"],"fullName":"PlanEditDialog shows CNY channel charge using the configured subscription rate and fee","status":"passed","title":"shows CNY channel charge using the configured subscription rate and fee","duration":43.57849999999996,"failureMessages":[],"meta":{}},{"ancestorTitles":["PlanEditDialog"],"fullName":"PlanEditDialog hides the preview when the subscription rate is not configured","status":"passed","title":"hides the preview when the subscription rate is not configured","duration":4.826000000000022,"failureMessages":[],"meta":{}},{"ancestorTitles":["PlanEditDialog"],"fullName":"PlanEditDialog allows composite subscription groups for payment plans","status":"passed","title":"allows composite subscription groups for payment plans","duration":4.080199999999991,"failureMessages":[],"meta":{}}],"startTime":1789442788695,"endTime":1789442788747.08,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/views/admin/orders/__tests__/PlanEditDialog.spec.ts"},{"assertionResults":[{"ancestorTitles":["OpenAIFastPolicyUserSelector"],"fullName":"OpenAIFastPolicyUserSelector hydrates existing IDs to email labels without changing the saved IDs","status":"passed","title":"hydrates existing IDs to email labels without changing the saved IDs","duration":14.564899999999966,"failureMessages":[],"meta":{}},{"ancestorTitles":["OpenAIFastPolicyUserSelector"],"fullName":"OpenAIFastPolicyUserSelector searches after one character and adds the selected user ID","status":"passed","title":"searches after one character and adds the selected user ID","duration":12.594600000000014,"failureMessages":[],"meta":{}},{"ancestorTitles":["OpenAIFastPolicyUserSelector"],"fullName":"OpenAIFastPolicyUserSelector keeps an unresolved saved ID visible and removable","status":"passed","title":"keeps an unresolved saved ID visible and removable","duration":3.154800000000023,"failureMessages":[],"meta":{}}],"startTime":1789442796583,"endTime":1789442796613.1548,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/views/admin/settings/__tests__/OpenAIFastPolicyUserSelector.spec.ts"},{"assertionResults":[{"ancestorTitles":["OpsErrorDetailModal"],"fullName":"OpsErrorDetailModal prioritizes upstream root cause and deduplicates diagnostic payloads","status":"passed","title":"prioritizes upstream root cause and deduplicates diagnostic payloads","duration":29.94909999999993,"failureMessages":[],"meta":{}}],"startTime":1789442805242,"endTime":1789442805271.9492,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/views/admin/ops/components/__tests__/OpsErrorDetailModal.spec.ts"},{"assertionResults":[{"ancestorTitles":["OpsErrorLogTable user/api-key/account columns"],"fullName":"OpsErrorLogTable user/api-key/account columns renders user, api key and account in separate columns for an upstream row","status":"passed","title":"renders user, api key and account in separate columns for an upstream row","duration":35.38599999999997,"failureMessages":[],"meta":{}},{"ancestorTitles":["OpsErrorLogTable user/api-key/account columns"],"fullName":"OpsErrorLogTable user/api-key/account columns shows the deleted badge for a soft-deleted api key","status":"passed","title":"shows the deleted badge for a soft-deleted api key","duration":6.321900000000028,"failureMessages":[],"meta":{}},{"ancestorTitles":["OpsErrorLogTable i18n keys exist in the errorLog namespace"],"fullName":"OpsErrorLogTable i18n keys exist in the errorLog namespace has apiKey & keyDeletedBadge for zh","status":"passed","title":"has apiKey & keyDeletedBadge for zh","duration":0.13440000000002783,"failureMessages":[],"meta":{}},{"ancestorTitles":["OpsErrorLogTable i18n keys exist in the errorLog namespace"],"fullName":"OpsErrorLogTable i18n keys exist in the errorLog namespace has apiKey & keyDeletedBadge for en","status":"passed","title":"has apiKey & keyDeletedBadge for en","duration":0.07089999999993779,"failureMessages":[],"meta":{}}],"startTime":1789442797213,"endTime":1789442797255.322,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/views/admin/ops/components/__tests__/OpsErrorLogTable.spec.ts"},{"assertionResults":[{"ancestorTitles":["Ops SLA-scoped error charts"],"fullName":"Ops SLA-scoped error charts 错误分布图按 SLA 错误数统计,不把业务限制错误算进请求错误分布","status":"passed","title":"错误分布图按 SLA 错误数统计,不把业务限制错误算进请求错误分布","duration":20.92240000000004,"failureMessages":[],"meta":{}},{"ancestorTitles":["Ops SLA-scoped error charts"],"fullName":"Ops SLA-scoped error charts 错误分布图在只有业务限制错误时显示为空态","status":"passed","title":"错误分布图在只有业务限制错误时显示为空态","duration":5.235699999999952,"failureMessages":[],"meta":{}},{"ancestorTitles":["Ops SLA-scoped error charts"],"fullName":"Ops SLA-scoped error charts 错误趋势图的请求错误详情按钮只按 SLA 错误启用","status":"passed","title":"错误趋势图的请求错误详情按钮只按 SLA 错误启用","duration":3.1686999999999443,"failureMessages":[],"meta":{}}],"startTime":1789442793853,"endTime":1789442793882.1687,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/views/admin/ops/components/__tests__/OpsErrorScopeCharts.spec.ts"},{"assertionResults":[{"ancestorTitles":["OpsOpenAITokenStatsCard"],"fullName":"OpsOpenAITokenStatsCard 默认加载并透传 platform/group 过滤,支持时间窗口切换","status":"passed","title":"默认加载并透传 platform/group 过滤,支持时间窗口切换","duration":31.518699999999967,"failureMessages":[],"meta":{}},{"ancestorTitles":["OpsOpenAITokenStatsCard"],"fullName":"OpsOpenAITokenStatsCard 支持分页与 TopN 模式切换并按参数请求","status":"passed","title":"支持分页与 TopN 模式切换并按参数请求","duration":15.294700000000034,"failureMessages":[],"meta":{}},{"ancestorTitles":["OpsOpenAITokenStatsCard"],"fullName":"OpsOpenAITokenStatsCard 接口返回空数据时显示空态","status":"passed","title":"接口返回空数据时显示空态","duration":3.1789999999999736,"failureMessages":[],"meta":{}},{"ancestorTitles":["OpsOpenAITokenStatsCard"],"fullName":"OpsOpenAITokenStatsCard 数据表使用固定高度滚动容器,避免纵向无限增长","status":"passed","title":"数据表使用固定高度滚动容器,避免纵向无限增长","duration":2.2409999999999854,"failureMessages":[],"meta":{}},{"ancestorTitles":["OpsOpenAITokenStatsCard"],"fullName":"OpsOpenAITokenStatsCard 接口异常时显示错误提示","status":"passed","title":"接口异常时显示错误提示","duration":4.508100000000013,"failureMessages":[],"meta":{}}],"startTime":1789442787120,"endTime":1789442787176.508,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/views/admin/ops/components/__tests__/OpsOpenAITokenStatsCard.spec.ts"},{"assertionResults":[{"ancestorTitles":["OpsSystemLogTable host support"],"fullName":"OpsSystemLogTable host support renders the host and sends it with list and cleanup filters","status":"passed","title":"renders the host and sends it with list and cleanup filters","duration":43.96379999999999,"failureMessages":[],"meta":{}},{"ancestorTitles":["OpsSystemLogTable host support"],"fullName":"OpsSystemLogTable host support keeps database access-log persistence opt-in","status":"passed","title":"keeps database access-log persistence opt-in","duration":5.352200000000039,"failureMessages":[],"meta":{}},{"ancestorTitles":["OpsSystemLogTable host support"],"fullName":"OpsSystemLogTable host support defines the Host translation for zh","status":"passed","title":"defines the Host translation for zh","duration":0.15390000000002146,"failureMessages":[],"meta":{}},{"ancestorTitles":["OpsSystemLogTable host support"],"fullName":"OpsSystemLogTable host support defines the Host translation for en","status":"passed","title":"defines the Host translation for en","duration":0.08579999999994925,"failureMessages":[],"meta":{}}],"startTime":1789442791764,"endTime":1789442791814.1538,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/views/admin/ops/components/__tests__/OpsSystemLogTable.spec.ts"},{"assertionResults":[{"ancestorTitles":["OpsThroughputTrendChart"],"fullName":"OpsThroughputTrendChart allows the header controls to wrap on narrow screens","status":"passed","title":"allows the header controls to wrap on narrow screens","duration":18.62390000000005,"failureMessages":[],"meta":{}}],"startTime":1789442816415,"endTime":1789442816433.6238,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/views/admin/ops/components/__tests__/OpsThroughputTrendChart.spec.ts"},{"assertionResults":[{"ancestorTitles":["errorDetailResponse"],"fullName":"errorDetailResponse prefers upstream payload for request modal when error_body is generic gateway wrapper","status":"passed","title":"prefers upstream payload for request modal when error_body is generic gateway wrapper","duration":0.70150000000001,"failureMessages":[],"meta":{}},{"ancestorTitles":["errorDetailResponse"],"fullName":"errorDetailResponse keeps error_body for request modal when body is not generic wrapper","status":"passed","title":"keeps error_body for request modal when body is not generic wrapper","duration":0.13610000000005584,"failureMessages":[],"meta":{}},{"ancestorTitles":["errorDetailResponse"],"fullName":"errorDetailResponse uses upstream payload first in upstream modal","status":"passed","title":"uses upstream payload first in upstream modal","duration":0.09109999999998308,"failureMessages":[],"meta":{}},{"ancestorTitles":["errorDetailResponse"],"fullName":"errorDetailResponse falls back to upstream payload when request error_body is empty","status":"passed","title":"falls back to upstream payload when request error_body is empty","duration":0.07299999999997908,"failureMessages":[],"meta":{}},{"ancestorTitles":["errorDetailResponse"],"fullName":"errorDetailResponse resolves upstream payload by detail -> events -> message priority","status":"passed","title":"resolves upstream payload by detail -> events -> message priority","duration":0.12229999999999563,"failureMessages":[],"meta":{}},{"ancestorTitles":["errorDetailResponse"],"fullName":"errorDetailResponse treats empty JSON placeholders in upstream payload as empty","status":"passed","title":"treats empty JSON placeholders in upstream payload as empty","duration":0.10910000000001219,"failureMessages":[],"meta":{}},{"ancestorTitles":["errorDetailResponse"],"fullName":"errorDetailResponse skips placeholder candidates and falls back to the next upstream field","status":"passed","title":"skips placeholder candidates and falls back to the next upstream field","duration":0.08699999999998909,"failureMessages":[],"meta":{}}],"startTime":1789442792695,"endTime":1789442792696.136,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/views/admin/ops/utils/__tests__/errorDetailResponse.spec.ts"},{"assertionResults":[{"ancestorTitles":["buildOpsErrorTimeParams"],"fullName":"buildOpsErrorTimeParams uses explicit timestamps for a complete custom range","status":"passed","title":"uses explicit timestamps for a complete custom range","duration":0.8201999999999998,"failureMessages":[],"meta":{}},{"ancestorTitles":["buildOpsErrorTimeParams"],"fullName":"buildOpsErrorTimeParams preserves predefined ranges and falls back for incomplete custom ranges","status":"passed","title":"preserves predefined ranges and falls back for incomplete custom ranges","duration":0.15359999999998308,"failureMessages":[],"meta":{}}],"startTime":1789442824366,"endTime":1789442824367.1536,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/views/admin/ops/utils/__tests__/opsErrorParams.spec.ts"},{"assertionResults":[{"ancestorTitles":["formatMemorySizeMB"],"fullName":"formatMemorySizeMB keeps capacities below one GiB in MB","status":"passed","title":"keeps capacities below one GiB in MB","duration":0.665300000000002,"failureMessages":[],"meta":{}},{"ancestorTitles":["formatMemorySizeMB"],"fullName":"formatMemorySizeMB converts capacities at or above one GiB to GB","status":"passed","title":"converts capacities at or above one GiB to GB","duration":0.13750000000004547,"failureMessages":[],"meta":{}},{"ancestorTitles":["formatMemorySizeMB"],"fullName":"formatMemorySizeMB handles zero and invalid values without producing a misleading unit","status":"passed","title":"handles zero and invalid values without producing a misleading unit","duration":0.15049999999996544,"failureMessages":[],"meta":{}}],"startTime":1789442822637,"endTime":1789442822637.6653,"status":"passed","message":"","name":"C:/Users/30214/Desktop/sub2本地/sub2新站/frontend/src/views/admin/ops/utils/__tests__/opsFormatters.spec.ts"}]}
|